.include "m16def.inc" .cseg ; Codesegment .org 0x000 ; Code beginnt bei Adresse 0x000 init: ldi R16,low(RAMEND) out SPL,R16 ldi R17,high(RAMEND) out SPH,R17 jmp main ; Main (b)+(h): ; ===== main: ldi R17,(1<<CS00) ; 1Mhz ist die Processor Clock out TCCR0,R17 ; Modus setzen (hier: Takt = Clock) call read call analyse rjmp main ; noob... aehh, loop! ; (c): ; ==== wait_x_ms: push R17 mov R17,R16 ; Den Parameter von R16 zwischenspeichern dec R17 ; R17-1 out OCR0,R17 ; Parameter-1 in das OCR-Register schreiben ldi R17,(1<<OCF0) ; Output compare flag... out TIFR,R17 ; ... resetten clr R17 ; R17 = 0 out TCNT0,R17 ; Timer zuruecksetzen poll: in R17,TIFR ; TIFR-Register in R17 sbrs R17,OCF0 ; falls OCF-Bit von TIFR nicht gesetzt ist... rjmp poll ; ... loop pop R17 ret ; (d): ; ==== wait_10us: nop ; nichts tun... nop ; ... und noch mehr davon! ret ; (e): ; ==== read: ldi R16,(1<<DDA0) ; PINA out DDRA,R16 ; konfigurieren call wait_10us ; 10us warten in R16,PINA ; Wert von PINA laden lsr R16 ; und PINA0 rausschiften ret ; (f): ; ==== analyse: push R16 sbrs R16,0 ; falls der 1.Bit von R16... rjmp analyse_wait ; ... 0 ist, dann warte call blink ; ansonsten, blinke rjmp analyse_end ; analyse beendet analyse_wait: ldi ZL,low(tab*2) ; lade, wie ldi ZH,high(tab*2) ; lange lpm R16,Z ; gewartet call wait_x_ms ; werden soll analyse_end: pop R16 ret ; (g): ; ==== blink: push R16 push R17 ldi ZL,low(tab*2+1) ; Zweiten Wert ldi ZH,high(tab*2+1) ; aus der Tabelle lpm R17,Z ; laden ldi R16,(1<<DDA0)|(1<<DDA1) ; DDRA-Register out DDRA,R16 ; konfigurieren ldi R16,26 ; wait_x_ms benoetigt selber 24 Takte, deshalb nur 26 Takte warten ldi R18,(1<<PORTA0)|(1<<PORTA1) ; LED an ldi R19,(1<<PORTA0) ; LED aus blink_loop: out PORTA,R18 ; setze den PORTA auf LED-an call wait_x_ms ; warte out PORTA,R19 ; setze den PORTA auf LED-aus call wait_x_ms ; warte dec R17 ; Zaehler dekrementieren... brne blink_loop ; ... falls dieser noch nicht bei 0 angekommen ist: loop blink_end: ldi R16,(1<<DDA0) ; DDRA-Register out DDRA,R16 ; rekonfigurieren pop R17 pop R16 ret ; Tabelle: ; ======== tab: .db 6,10 ; Wartezeit in ms, Anzahl des Blinkens
Comments