Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .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
Advertisement
Add Comment
Please, Sign In to add comment