Stap 3: Software
Hieronder vindt u de link van de software. Terwijl het wordt gericht voor de 12F683, is het eenvoudig geport naar grotere versies van de PIC. Meestal vereist het te wijzigen in namen, zoals TRISIO TRISA, en GPIO naar PORTA. U zult ook moeten veranderen de regel waarmee de PIC-versie (lijst =) en het INCLUDE-bestand, maar die zijn
intuïtieve wijzigingen. De __CONFIG lijn wellicht ook tweaken alleen maar omdat een of twee van de gebruikte etiketten zijn anders gespeld in sommige van de INCLUDE-bestanden. Zorg enkel ervoor dat de foto die u een PIN-code waarmee een externe Interrupt invoer heeft (meestal aangeduid als EXT).
Andere dan de LCD controle pin verandert, heeft dit programma een aantal fundamentele verschillen van de eenvoudige in aflevering 1. In het bijzonder, gebruikt het een interrupt handler zodat de gedefinieerde geheugenlocaties voor het resetten van het programma en de start van de interrupt handler bijgekomen. De reset-vector (adres 0) heeft een eenvoudige GOTO instructie om te springen naar het echte begin van het programma. Dat is nodig omdat de interrupt handler begint altijd op adres 4. Een gril die ik vond is dat de maximaal toelaatbare fout X IDE-programma dat de code compileert niet graag een GOTO springen direct naar de verklaring van een BANKSEL. Dat is waarom de eerste instructie in "MAIN" is een NOP. De routine "Init" bevat ook instructies voor het gebruik van de interne klok van de 8-MHz in plaats van de standaard 4-MHz klok. Dat betekent ook dat de vertraging routines verschillende waarden dan die in de Episode 1-routines moeten.
De LCD_Init-routine voldoet vrijwel aan de opgegeven initialisatie sequentie voor de 1602-chip. De LCD_Line1-routine wordt "Adres/opdracht" op lijn 1 weergegeven. De LCD_Line2-routine die zijn ingesteld voor het schrijven van de ontvangen IR-codes aan lijn 2 van het LCD-scherm. Lijn 2 krijgt overschreven telkens die een nieuwe IR-bericht wordt ontvangen.
Het hart van de IR-bericht capture-code is de binnenkant van de interrupt handler. Herinneren van het bedradingsschema dat we de output seriële data van de IR ontvanger hebt aangesloten op de ingang van externe onderbreken van de PIC. Daardoor kunnen we aan sync met het begin van het bericht te decoderen van elke bit van de gegevens door het eenvoudig meten van puls breedte. De ingang voor externe Interrupt wordt ingesteld op onderbreken op de dalende rand waarin altijd een beetje start. De interrupt routine controleert Timer1 om te zien hoe lang het is sinds de laatste interrupt en vervolgens wordt de timer opnieuw ingesteld. We kunnen de verschillende pulsen precies meten maar de lui aanpak werkt heel goed. Zoals we in het voorgaande gedeelte zagen, de start-pols is gemakkelijk herkenbaar maar de gegevensbits onderscheiden zich door de ruimte-tijd na de data-bit. Door het meten van dalende rand vallende rand, omvatten wij zowel de bits en de ruimte-tijd. Op die manier dat we ook om precies te zijn bij het testen van puls breedte niet hebben. Gezien het feit dat de PIC klokfrequentie is ingesteld op 8-MHz, zal Timer1 elke 500ns verhoogd. Ter vereenvoudiging van de software kunnen we voorbijgaan aan de lagere 8 bits van Timer1 (maximale 127us) en alleen het testen van de hogere 8 bits. Elke tellen in de hogere 8 bits is gelijk aan 128us. Een "0" data-bit zal hebben een aantal meer is dan 5 maar minder dan 9 en een "1" data-bit dubbele dat bereik zal hebben. Dat is waarom de graven gecontroleerd in de software zijn ingesteld op 6 voor een data-bit "0" en 12 voor een data-bit "1". De start bit controle is voor een aantal meer is dan 24 (over 3ms). Niet te precies maar zeer effectief.
De routine Main_Lp1 is waar de gegevensbits gedecodeerd door de interrupt routine zijn verpakt in de verwachte vier bytes. De aanroep Make_ASCII één knabbelen op een moment van elke byte is verzonden en de numerieke waarde van 0-15 omgezet in een leesbare teken van 0-F. Het maakt gebruik van een gladde proces waarmee een programmeur om te bouwen van een opzoektabel en stel vervolgens het programma-item te springen in de juiste locatie in de tabel. Elke tabel-locatie is een speciale subroutine instructie return (RETLW) die een opgegeven letterlijke waarde in het register van de W terug naar de aanroepende routine draagt. Nadat alle vier bytes zijn ontvangen en verzonden naar het display is er een oproep aan LCD_Line2 om het opnieuw instellen van de aanwijzer weergeven in afwachting van het volgende bericht van IR. Het omvat niet een opdracht om het omdat het volgende bericht gewoon de huidige display-locaties overschrijven zal.