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