ITG-ABI 13/14 |
19.03.2014 |
Korrekturhinweise / Lösungsvorschlag |
|---|
Verwendeter µC: ATMEL AVR 8 Bit RISC.
; zur info avr-Assembler: sei P3.2 als PD2 verwendet; PD2 hat den Wert 2 .def zeiger = R16 wartlow: sbic PIND,2 ;ueberspringe folgenden Befehl wenn PD2 = 0 rjmp wartlow ;Taste nicht gedrueckt PD2 = 1 warthigh: sbis PIND,2 ;ueberspringe folgenden Befehl wenn PD2 = 1 rjmp warthigh ;Taste gedrueckt PD2 = 0 inc zeiger cpi zeiger,26 ;vergleiche mit Konstanten brlo skip ;wenn kleiner Sprung clr zeiger ;sonst auf 0 setzen skip: rcall zeitwerte rjmp wartlow
Falls Lösung mit Compare Match Interrupt:
void zeitwerte(){
OCR1A = tab[zeiger]; Timer/Counter Output Compare Register A
}
Sollte Schüler Overflow Interrupt gewählt haben wird das UP zeitwerte() eher überflüssig, denn bei jedem Interrupt muss Timer erneut vorgespannt werden.
Durch die PWM-Einheit des AVR ist ein Interterrupt zur Signalerzeugung nicht unbedingt nötig. Bei entsprechender Pin-Belegung könnte die Hardware das Signal auch ohne Interrupt erzeugen. Zwei Interruptquellenarten könnten genutzt werden: Der Overflow- oder der Compare Match Interrupt. Hier die Lösung mit Overflow-Interrupt:
void init(){
TCCR0B = 1; //Timer mit Systemtakt
TIMSK |= (1<<TOIE0); //Timer Overflow Interrupt Enable 0 ist Bit 1, Wert 2
sei(); //Globale Intrruptfreigabe
}
ISR(TIMER0_OVF_vect){
TCNT0 = 256 - tab[zeiger]; //Vorspannen des Timers
if(PORTB&1) //wenn PB0 == 1
PORTB &= ~1; //dann PB0 = 0
else
PORTB |= 1; //sonst PB0 = 1
}
Zykluszeit bei 1 Mhz vergleichbar mit 8051 bei 12 Mhz: 1µSec.
2.6.1 Bei 10000Hz ist Periodendauer 100 µs somit alle 50 µs Interrupt. Timervorspannung ist bei Systemtakt und 8Bit-Timer 256-50 = 206 (oder Comparewert ist 49).
2.6.2 ISR kommt durch zu langer Ausführungszeit nicht hinterher. Zwischen zwei Interrupts wird bei AVR-Architektur jedoch mindestens 1 Befehl des Hauptprogramms ausgeführt.