; Test 3: Board kennenlernen, Timer im Polling mode ; Was hier Neues zu lernen ist: ; - Timer im Polling modus ; - MOV-Befehl .NOLIST .INCLUDE "8515def.inc" .LIST ; Universalregister definieren .DEF mp = R16 ; Zaehler fuer Anzahl Nulldurchgaenge .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-Zaehler-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 Zaehlers = 1024, 4 MHz/1024 = 3906,25 Hz, ; ergibt alle 256 us einen Zaehlimpuls. ; 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 Zaehler ab, bis dieser Null erreicht, ; dann wird der Softwarezaehler um Eins erhoeht 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-Zaehlers lesen cpi mp,0 ; auf Null testen brne loop ; Wenn nicht null, dann wieder loop rcall IncZ1 ; Unterprogramm Software-Zaehler erhoehen rcall Display ; Unterprogramm Zaehlerstand ausgeben warte: in mp,TCNT0 ; Inhalt Zaehler 0 lesen cpi mp,0 ; auf Null testen breq warte ; Warte bis nicht mehr Null rjmp loop ; Naechste Runde IncZ1: inc z1 ; Erhoehe Software-Zaehler ret ; Kehre zurueck ins Hauptprogramm Display: mov mp,z1 ; Zaehlerstand nach mp kopieren com mp ; Einer-Komplement XOR(FF) wg. Lampen out PORTB,mp ; Software-Zaehlerstand an LEDs ret ; Zurueck zum Hauptprogramm