; Test 3: Board kennenlernen, Timer im Polling mode ; Was hier Neues zu lernen ist: ; - Timer im Polling modus ; - MOV-Befehl .NOLIST .INCLUDE "C:\avrtools\appnotes\8515def.inc" .LIST ; Universalregister definieren .DEF mp = R16 ; Zähler für Anzahl Nulldurchgänge .DEF z1 = R0 ; Reset-Vektor auf Adresse 0000 rjmp main ; Hauptprogramm beginnt hier main: ldi mp,LOW(RAMEND) ;Initiate Stackpointer (Unterprogramme!) out SPL,mp ldi mp,HIGH(RAMEND) out SPH,mp ; Software-Zähler-Register auf Null setzen ldi mp,0 ; z1 kann nicht direkt gesetzt werden, da R0 mov z1,mp ; Kopieren von mp in das Register z1 ; Vorteiler des Zählers = 1024, 4 MHz/1024 = 3906,25 Hz, ; ergibt alle 256 µs einen Zählimpuls. ; ldi mp,0x05 ;Initiate Timer/Counter 0 Vorteiler out TCCR0,mp ; an Timer 0 Control Register ; Port B ist LED-Port ldi mp,0xFF ; alle Bits als Ausgang out DDRB,mp ; in Datenrichtungsregister ; Hauptprogramm-Loop fragt Zähler ab, bis dieser Null erreicht, ; dann wird der Softwarezähler um Eins erhöht und auf den LEDs ; ausgegeben. ; Dadurch werden die 3906,25 noch einmal durch 256 geteilt, ergibt ; 15,25878906 Hz. Wer es lieber in Zeiten mag: 65,536 ms. ; loop: in mp,TCNT0 ; Inhalt des 8-Bit-Zählers lesen cpi mp,0 ; auf Null testen brne loop ; Wenn nicht null, dann wieder loop rcall IncZ1 ; Unterprogramm Software-Zähler erhöhen rcall Display ; Unterprogramm Zählerstand ausgeben warte: in mp,TCNT0 ; Inhalt Zähler 0 lesen cpi mp,0 ; auf Null testen breq warte ; Warte bis nicht mehr Null rjmp loop ; Nächste Runde IncZ1: inc z1 ; Erhöhe Software-Zähler ret ; Kehre zurück ins Hauptprogramm Display: mov mp,z1 ; Zählerstand nach mp kopieren com mp ; Einer-Komplement XOR(FF) wg. Lampen out PORTB,mp ; Software-Zählerstand an LEDs ret ; Zurück zum Hauptprogramm