ITG-ABI 08/09 |
30.3.2009 |
Korrekturhinweise / Lösungsvorschlag |
|---|
Verwendeter µC: ATMEL AVR 8 Bit RISC.
| Portpin | PC7 | PC6 | PC5 | PC4 | PC3 | PC2 | PC1 | PC0 | PB7 | PB6 | PB5 | PB4 | PB3 | PB2 | PB1 | PB0 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Segment | --- | g | f | e | d | c | b | a | --- | --- | --- | --- | A4 | A3 | A2 | A1 |
.def akku = R16 ;Hommage an die alten Akku-Maschinen
.def zaehler = R17
.def null = R18 ;Hilfsregister mit Inhalt 0
.dseg ;SRAM Bereich
daten: .byte 4 ;reserviere 4 Byte für A1..A4
.cseg ;Programmbereich
steuer: .db 0x0E, 0x0D, 0x0B, 0x07 ;Tabelle zur Ansteuerung der Anzeigen
seg7: .db ... ;Tabelle zum 7-Segmentkodierer
anzeige: clr zaehler ;Anzeigezähler zurücksetzen
loop: ldi akku 0x0F
out PORTB,akku ;alle Anzeigen aus
ldi XH, HIGH(daten) ;laden der Daten aus dem SRAM
ldi XL, LOW(daten)
add XL, zaehler
adc XH, null
ld akku, X ;Daten für Anzeige lesen
ldi ZH, HIGH(seg7*2) ;laden des Segmentcodes aus dem Programmspeicher
ldi ZL, LOW(seg7*2)
add ZL, akku
add ZH, null
lpm akku, Z ;Anzeigedaten kodieren
out PORTC, akku ;ausgeben Segmentcode
ldi ZH, HIGH(steuer*2) ;laden Steuercode aus dem Programmspeicher
ldi ZL, LOW(steuer*2)
add ZL, zaehler
add ZH, null
lpm akku, Z ;Steuercode laden
out PORTB, akku ;Anzeige aktivieren
cpi zahler, 3
brne inc_za
ret
inc_za: inc zahler
rjmp loop
Lösung entspricht PAP, allerdings ist sie nicht praxisgerecht, LEDs würden recht dunkel bleiben, da nur kurz eingeschaltet während eines Zyklus.
Externe Interrupts können bei Atmel AT90S2313 an Pin 6 (INT0/PD2) und Pin 7 (INT1/PD3) ausgelöst werden.
.def akku = R16
rjmp reset
rjmp isr_int0
rjmp isr_int1
.org 0x10
steuer:...
seg7:...
isr_int0:...
reti
isr_int1:...
reti
anzeige:...
ret
reset: ldi akku,high(RAMEND)
out SPH,akku ;Stackpointer initialisieren
ldi akku,low(RAMEND)
out SPL,akku
ldi akku,0b01111111 ;7Segment Anzeige
out DDRC,akku ;PC Ausgänge
ldi akku,0b00001111
out PORTB,akku ;Enable aus
out DDRB,akku ;PB Ausgänge
ldi akku,0b00001010 ;Fallende Flanken bei beiden Interrups
out MCUCR,akku
ldi akku,0b11000000 ;Externe Interrups freigeben
out GIMSK,akku
sei ;Globale Interruptfreigabe
loop: rcall anzeige
rjmp loop
void main(){
DDRC = 0x7F; //PC als Ausgang für 7Segment Anzeige
PORTB= 0x0F; //Enable aus
DDRB = 0x0F; //PB Enableausgänge
MCUCR |= (1<<ISC01)|(1<<ISC11); //Fallende Flanken
GIMSK |= (1<<INT0)|(1<<INT1); //Interrupts freigeben
sei(); //Globale Interruptfreigabe
while(1)
anzeige();
}