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.