Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;Projekt Tea-timer
- ;der timer 0 blinkt jede sekunde, während timer 1 läuft
- ;timer 5, 10; 15 min
- ;wird über interrupt gestartet
- .def zaehler = r17
- .def tmp=r16
- .org 0x00 jmp RESET
- .org INT0addr jmp Interrupt0
- .org INT1addr jmp Interrupt1
- .org INT2addr jmp Interrupt2
- .org OVF0addr jmp Timer0Overflow
- .org OVF1addr jmp Timer1Overflow
- loadTimer:
- push tmp
- in SREG, tmp
- push tmp
- ; Timer werden hier gesartet
- ;------Timer 0------
- ;Prescaler einstellen
- ldi r16, 0b00000101
- out TCCR0, r16
- ;startwert Laden
- ldi r16, 244 ;haben wir ausgerchnet (4tel sekunde)
- out TCNT0, r16
- ;-------Timer1-------
- ;Anfangswert timer 1 setzen
- ldi r16,0xff-high(6942) ;1min verzögerung
- out TCNT1H, r16
- ldi r16,0xff-low(6942)
- out TCNT1L, r16
- ;Prescaler setzen
- ldi r16, 0b00000011
- out TCCR1B, r16
- pop tmp
- out tmp, SREG
- pop tmp
- ret
- ;-------------------------Interrupt0--------------------------------
- Interrupt0:
- push tmp
- in SREG, tmp
- push tmp
- subi zaehler, 0x00
- brbc 1, Ende0
- call loadTimer
- ;Zaehler setzen
- ldi zaehler, 0x05
- Ende0:
- pop tmp
- out tmp, SREG
- pop tmp
- reti
- ;-------------------------Interrupt1--------------------------------
- Interrupt1:
- push tmp
- in SREG, tmp
- push tmp
- subi zaehler, 0x00
- brbc 1, Ende1
- call loadTimer
- ;Zaehler setzen
- ldi zaehler, 10
- Ende1:
- pop tmp
- out tmp, SREG
- pop tmp
- reti
- ;-------------------------Interrupt2--------------------------------
- Interrupt2:
- push tmp
- in SREG, tmp
- push tmp
- subi zaehler, 0x00
- brbc 1, Ende2
- call loadTimer
- Ende2:
- pop tmp
- out tmp, SREG
- pop tmp
- reti
- ;------------------------Timer0---------------------------------
- Timer0Overflow:
- push tmp
- in SREG, tmp
- push tmp
- subi zaehler, 0x00
- ;wenn kein tee drin -> springe zu ende
- brbc 1, EndeT0
- ;timer 0
- ;startwert Laden
- ldi r16, 244 ;haben wir ausgerchnet (4tel sekunde)
- out TCNT0, r16
- ;blinkt jedesmal (jede lampe)
- ldi r16, 0xff
- out PORTB, r16
- EndeT0:
- pop tmp
- out tmp, SREG
- pop tmp
- reti
- ;--------------------------Timer1------------------------------
- Timer1Overflow:
- push tmp
- in SREG, tmp
- push tmp
- ;Anfangswert timer 1 setzen
- ldi r16,0xff-high(6942) ;1min verzögerung
- out TCNT1H, r16
- ldi r16,0xff-low(6942)
- out TCNT1L, r16
- subi zaehler, 1
- brbc 1, Weiter
- ;code für nicht durchlaufene zeit
- ;Prescaler setzen, dann läuft er ned weiter
- ldi r16, 0b00000000
- out TCCR1B, r16
- Weiter:
- pop tmp
- out tmp, SREG
- pop tmp
- reti
- RESET:
- ;Stack definieren
- ldi r16, high(RAMEND)
- out SPH, r16
- ldi r16, low(RAMEND)
- out SPL, r16
- ;ports deklaration
- ldi r16, 0xff ;Datenrichtung konfig.
- out DDRB, r16
- ;---------interrupts und Timer definieren--------
- ;Int0 + int1
- ;Steigende Flanke von int0 und int1
- ldi r16, 0b00001111
- out MCUCR, r16
- ;int2 Ihr müsst injt2 ned können
- ldi r16, 01000000
- out MCUCSR, r16
- ;GICR - wir wollen int0
- ldi r16, 0b11100000
- out GICR, r16
- ;Interrupts freigeben
- ;Timer 0 und 1 im Timsk starten
- ldi r16, 0b00000101
- out TIMSK, r16
- sei
- ;wir setzen beide timerVariablen auf 0
- ldi zaehler, 0x00
- Endlos:
- jmp Endlos;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement