ITG-ABI 10/11

18.3.2011

Korrekturhinweise / Lösungsvorschlag

Teil 1 Aufgabe 2

Verwendeter µC: ATMEL AVR 8 Bit RISC.

Mögliche Pin-Belegung

PA = P0; PB = P1; PC = P2; PD=P3

Aufgabe 2.6

Vorteiler Dauer Zählschritt Zählstand
CLK / 1 1µS 1.000.000
CLK / 8 8 µS 125.000
CLK / 64 64 µS 15.625

Mit 16 Bit Timer und Systemtakt 1MHz ein 1Hz-Signal gewinnen.

Gewählt: Vorteiler 64 und Timer auf 65.536-15.625= 49.911 vorspannen und Overflow-Interrupt verwenden.

2.6.1

C-Lösung Assembler
// 2.6.1
TCCR1B = 3; // CLK / 64
TCNT1 = 49911; // vorspannen
TIMSK = 1 << TOIE1; OverflowInterrupt frei geben.
sei(); // globale Interruptfreigabe
ldi tmp,3
out TCCR1B,tmp
ldi tmp,high(49911)
out TCNT1H,tmp
ldi tmp,low(49911)
out TCNT1L,tmp
ldi tmp, 1<<TOIE1
out TIMSK, tmp
sei

2.6.2

2.6.3

C-Lösung Assembler
// 2.6.3
volatile unsigned char sekunde=0;
ISR(TIMER1_OVF_vect){
  TCNT1 = 49911; // vorspannen
  sekunde++;
}
ISR_ovf1: ; Aufgabe 2.6.3
  in itmp,SREG ; Statusregister laden
  push itmp    ; Statusregister retten
  ldi itmp,high(49911) ;obere 8Bit
  out TCNT1H,itmp   ;zuerst High schreiben 
  ldi itmp,low(49911) ;untere 8Bit 
  out TCNT1L,itmp   ;Uebernahme bei Schreiben des LowByte
  inc sekunde ; erhoehe Sekunde 
  pop itmp ; Statusregister holen
  out SREG,itmp ; Statusregister zurueckschreiben
  reti ; return from Interrupt

Aufgabe 2.7

Ein bisschen wunderlich ist die Zuordnung der Ports zu den LED, LSB -die Zehner und MSB -die Einer. Somit wird 12 als 0b00100001 ausgegeben.
Unsere µC verfügen nicht über einen Hardware-DIV-Befehl es stehen in Assembler dafür Makros bereit -siehe lokale Formelsammlung.

2.7.1

2.7.2

C-Lösung Assembler
// 2.7
volatile unsigned char R7,R6,R5;
int main(){ // Hauptprogramm
  unsigned char tmp;
  init();   // Initialisierung
  while(1){ // Endlosschleife
    tmp = R7 % 10; // Einer in tmp
    PORTA=(tmp<<4)|(R7/10); // Verbinden und ausgeben
    tmp = R6 % 10; // Einer in tmp
    PORTB=(tmp<<4)|(R6/10); // Verbinden und ausgeben
    tmp = R5 % 10; // Einer in tmp
    PORTC=(tmp<<4)|(R5/10); // Verbinden und ausgeben
  }
  return 0;
}

				

Aufgabe 2.8

Aufgabe 2.9

Externer Interrupt 0

C-Lösung Assembler
// 2.9.2
  MCUCR = 2; // Interrupt bei fallender Flanke
  GIMSK = 1<<INT0; // Interrupt frei
  sei(); // globale Freigabe