Hem gjorde 7 segment display klocka (3 / 5 steg)
Steg 3: En inblick om PIC16F727 uppgifter
Fosc = 16000000 Hz
Finst = 4000000 Hz
Tinst = 1 / Finst = 250 ns
En instruktion tar 250 nanosekunder, detta är samma takt timern räknar med. Om vi behöver en timing 1 millisekunder, vi låter timern springa för 4000 instruktioner, då signalen, det 1 ms har förflutit.
För att göra detta mycket exakt, kommer att vi använda avbrott. Ett avbrott till en mikrokontroller är som en klapp på axeln för dig. Du bry dig bara om ditt eget företag, då någon kommer, knacka på axeln för att säga något. Du avslutar gör ditt företag, och var uppmärksam på "avbrottet" som bara skedde. När du är klar lyssnar, du reagerar på ett visst sätt och sedan gå tillbaka till de saker du gjort innan någon avbröt du. Säger detta PIC vägen, service du bara ett avbrott.
BILDEN gör inte vad du vill, det gör det, vad du säger åt den att göra. Detta är en mycket viktig sak att memorera: en silicon bugg är sällan orsaken varför ditt projekt brukar starta upp. Det är 99,9% av gånger felaktig programmering.
Vad ska vi säga PIC att göra för att uppnå det vi vill:
Oscillator konfiguration:
Behöver vi konfigurera intern oscillator för att vara den huvudsakliga klocka källan för detta projekt, vi gör detta genom att sätta 0x30 i OSCCON register.
Aktivera avbrott:
Det första vi kan avbryta systemet. Detta görs genom att manipulera bitarna i INTCON register.
Vi måste aktivera global avbrott och Timer0 avbrott. Databladet ser, vi bit 7 vara globala avbrottet aktivera bit och bit 5 vara Timer0 avbrottet aktivera bit. Resten av bitarna är nollor, vi behöver inte ändra dem. Detta ger ett binärt värde för b10100000, som i hexadecimal är 0xA0. Vi satt som i registret INTCON.
Prescalers:
En prescaler är en räknare sig, vilka steg på varje anvisning cykel. Dessa - standard - anges till 1:1 så de inte stör timer normal drift. Prescaler utdata är ansluten till ingången på timer, som vi kan se i diagrammet. om vi anger en prescaler 1:2, kommer att sin produktion gå till '1' förrän 2 instruktion cykler har avslutats. Detta innebär att timern inte kommer att öka på varje instruktion cykel, men på varje 2-nd. Liknar detta, genom att ange prescaler dela med 4, TMR0 att få ökas varje 4-th instruktion cykel, och så vidare.
Konfigurera Timer0 att ge avbryta varje millisekund:
Timer0 räknar instruktionerna genom att öka värdet i registret TMR0. att värdet är 8 bitar bred, mening, inte kan vi räkna mer ytterligare, än 255. Om räknaren är i 255, och en ökning sker, kommer att registret svämma över och börja räkna igen från 0.
Detta är punkten när en timer kan signalera ett avbrott. Men om detta händer varje 256-th cykel, hur kan vi använda den räkna till 4000? Genom hjälp från prescalers.
4000 / 256 = 15.625
Så vi behöver en uppdelning av 16 (den närmaste och större prescaler värde) att göra detta möjligt.
4000 / 16 = 250;
Eftersom timern ger avbrott på överrullning från 255 -> 0, vi kommer bara att sätta en förskjutning av 256-250 = 6 i TMR0 register. Detta värde behöver uppdateras varje gång avbrottet är servad. Vi har också avmarkera flaggan, som var inställd på '1', när Timer0 ändringen inträffade.
Efter att ha sagt att vi nu har en exakt avbryta, inträffar som varje millisekund. Jag genomföra brukar en räknare i avbrottstjänstens rutin, jag räknar 1000 avbrott, bygga upp en en andra signal. Räkna sekunderna som skall göras i de viktigaste loopen, det finns bara enkel räknare som räknar 60 sekunder, sedan svämma över för att öka variabeln "minut". Sedan, på samma sätt, "timmar", "dagar", "månader" variabel ökas.
Siffrorna
Om projektet är enkel nog, och har några 7 segmenterar skärmar i schematiskt, hand jag aldrig ta för att hitta segment controller stiften en bredvid den andra. Detta projekt var inte ett undantag, den luddiga definierar du kan se i början av programmet finns för att förenkla de sätt jag Visa siffrorna. Om du tar tillräckligt med tid att försöka förstå dem, ser du hur lätt denna visning del faktiskt är.