ITG-ABI 13/14

19.03.2014

Korrekturhinweise / Lösungsvorschlag

Teil 1 Aufgabe 2

 

Mikrocontroller

Verwendeter µC: ATMEL AVR 8 Bit RISC.

2.3.2 Hauptprogramm

; 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

2.4 Unterprogramm "Zeitwerte"

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.

2.5 Timer-Interrupt

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
}

2.6 Berechnung der Zeitwerte

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.