Stap 3: Een kijkje op de PIC16F727 taken
FOSC = 16000000 Hz
Finst = 4000000 Hz
Tinst = 1 / Finst = 250 ns
Een instructie neemt 250 nanoseconden, dit is de timer met telt hetzelfde tarief. Als we een timing van 1 milliseconden nodig, we laten de timer uitvoeren voor 4000 instructies, dan signaal, dat 1 ms is verstreken.
Om dit te maken zeer nauwkeurige, zullen wij gebruiken interrupts. Een interrupt een microcontroller is als een tik op de schouder voor u. U bent enkel motto: uw eigen bedrijf, dan iemand langs komt, op je schouder om te zeggen iets te tikken. U sluit uw zakendoen, en aandacht besteden aan de 'onderbreken' die net is opgetreden. Nadat je klaar bent luisteren, je reageren op een bepaalde manier, ga dan terug naar de spullen die je hebt gedaan voordat iemand u onderbroken. Daarmee de PIC manier onderhouden u net een interrupt.
De PIC niet doen wat je wilt, het doet, wat je vertellen om te doen. Dit is een zeer belangrijk ding om te onthouden: een silicium-bug is zelden de reden waarom uw project zal niet opstarten. Het is 99,9% van de defecte tijden programmeren.
Wat hebben we nodig om te vertellen van de PIC te doen om te bereiken wat wij willen:
De configuratie van de oscillator:
We moeten de interne oscillator om de belangrijkste klokbron voor dit project te configureren, we doen dit door de invoering van 0x30 in het OSCCON-register.
Inschakelen interrupts:
Eerst moeten we om de interrupt-systeem. Dit wordt gedaan door het manipuleren van de bits in het register van de INTCON.
We moeten om globale interrupts en Timer0 onderbreken. Het gegevensblad kijkend, zien we bit 7 worden de global interrupt inschakelen bits en bit 5 als de Timer0 interrupt inschakelen bits. De rest van de bits zijn nullen, we hoeven niet te wijzigen. Dit geeft een binaire waarde van b10100000, die in de hexadecimale notatie is 0xA0. We hebben dat in het INTCON-register.
Prescalers:
Een prescaler is een teller zelf, welke stappen op elke instructie cyclus. Deze - standaard - zijn ingesteld op 1:1 zodat ze niet met de normale werking van de timer interfereren. De prescaler uitgang is aangesloten op de timer input, zoals we op het diagram zien kunnen. Als we een prescaler ingesteld op 1:2, gaat de uitvoer naar '1' pas na 2 instructie cycli hebben voltooid. Dit betekent dat de timer op elke instructiecyclus, maar op elke 2-nd zal niet verhogen. Gelijkend op dit, door het instellen van de prescaler te delen door 4, de TMR0 wordt steeds verhoogd elke 4-th instructiecyclus, enzovoort.
Configureren van de Timer0 te geven elke milliseconde onderbreken:
Timer0 telt de instructies door het verhogen van de waarde in het register van de TMR0. dat waarde 8 bits breed is, wat betekent dat, rekenen we niet verder, dan 255. Als de teller op 255 is, en een toename optreedt, zal het register overloop en start het opnieuw tellen van 0.
Dit is het punt, wanneer een timer op een interrupt wijzen kan. Maar als dit elke 256-th-cyclus gebeurt, hoe kunnen we gebruiken het te tellen tot 4000? Door hulp van de prescalers.
4000 / 256 = 15.625
Dus we een afdeling door 16 moeten (de dichtstbijzijnde en grotere prescaler waarde) om dit gebeuren.
4000 / 16 = 250;
Aangezien de timer onderbreken geeft bij rollover van 255 -> 0, zetten we gewoon een offset van 256-250 = 6 in het TMR0-register. Deze waarde moet worden vernieuwd telkens wanneer de interrupt wordt onderhouden. We moeten ook duidelijk de vlag, die is ingesteld op '1', toen de Timer0 rollover plaatsvond.
Hebben gezegdd dat, we nu een precieze interrupt hebben, optreedt die elke milliseconde. Ik meestal voeren een teller in de interrupt service routine, ik reken 1000 interrupts, opbouw van een een tweede signaal. De seconden tellen moet gebeuren in de hoofdlus, er zijn gewoon simpel items die 60 seconden tellen, dan overloop te verhogen de variabele "minuut". Vervolgens wordt dezelfde manier, de "uren", "dagen", "maanden" variabele verhoogd.
De cijfers
Als het project eenvoudig genoeg is, en sommige 7 segment displays in het schema heeft, verzorgen nooit ik de segment controller pinnen een naast elkaar vinden. Dit project was een uitzondering, de fuzzy definieert u kunt zien aan het begin van het programma om te vereenvoudigen van de manieren waarop ik de cijfers weergeven. Als je genoeg tijd om te proberen om ze te begrijpen, ziet u hoe eenvoudig dit weer te geven deel eigenlijk is.