ITG-ABI 10/11 |
18.3.2011 |
Korrekturhinweise / Lösungsvorschlag |
|---|
Verwendeter µC: ATMEL AVR 8 Bit RISC.
| 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.
| 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 |

| 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 |
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.

| 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;
}
|

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