teslanikola
22.03.2006, 22:33
Hallo leute,
ich hab hier eine ganz komische sache bemerkt:
wenn ich in meinem Porgramm mit In den Inhalt von Portb in ein Register ( R16 ) schreibe wird auch das R26 beschrieben ( als XH verwendet ), woran leigt das, wie kann ich das vermeiden???
hier mal der Anomaliencode:
in temp2,portd ; Lese Portd aus
lsl temp2 ; Schiebe alle Bits eins nach links
Mein gesammter Code:
;************************************************* **********************************
;* Beschaltung: *
;* *
;* PB0 >----[200R]--A-[D]--[D]--[D]--[D]--[D] Die 5 Anoden einer LED-Reihe *
;* | | | | | sind miteinander verbunden und *
;* PB1 >----[200R]--A-[D]--[D]--[D]--[D]--[D] über einen Vorwiderstand an *
;* | | | | | einen Portpin angeschlossen. *
;* PB2 >----[200R]--A-[D]--[D]--[D]--[D]--[D] Die Kathoden der LEDs einer *
;* | | | | | Spalte sind ebenfalls mit- *
;* PB3 >----[200R]--A-[D]--[D]--[D]--[D]--[D] einander verbunden und über *
;* | | | | | einen Transitor nach GND ge- *
;* PB4 >----[200R]--A-[D]--[D]--[D]--[D]--[D] schalten. *
;* | | | | | *
;* PB5 >----[200R]--A-[D]--[D]--[D]--[D]--[D] LEDs: LED Rot *
;* | | | | | Transistoren: BC547 *
;* PB6 >----[200R]--A-[D]--[D]--[D]--[D]--[D] Widerstände: 1/4W Kohleschicht *
;* | | | | | *
;* K K K K K *
;* | | | | | *
;* |/ | | | | *
;* PD0 >----[10k]----| | | | | *
;* |> | | | | *
;* | | | | | *
;* | | | | | *
;* | |/ | | | *
;* PD1 >----[10k]---------| | | | *
;* | |> | | | *
;* | | | | | *
;* | | | | | *
;* | | |/ | | *
;* | | |> | | *
;* | | | | | *
;* | | | | | *
;* | | | |/ | *
;* PD2 >----[10k]-------------------| | *
;* | | | |> | *
;* | | | | | *
;* | | | | | *
;* | | | | |/ *
;* PD3 >----[10k]------------------------| *
;* | | | | |> *
;* | | | | | *
;* | | | | | *
;* GND >---------------o----o----o----o----o *
;* *
;* *
;************************************************* **********************************
;-------[ Assembler Einstellungen ]-------------------------------------------------
;Includedatei für AT90S2313 laden
.include "2313def.inc"
;Arbeitsregister definieren
.def temp1 = r16 ; Universalregister 1
.def temp2 = r17 ; Universalregister 2
.def temp3 = r18 ; Universalregister 3
;-------[ µC Einstellungen ]--------------------------------------------------------
;Interupt Config. I
.org 0000
rjmp start
reti
reti
reti
reti
rjmp t1int
Start:
;Interupt Config II
sei ; Interuptts freigeben
ldi temp1, (1<<TOIE1) ; Timer1 Interrupt
out timsk, temp1 ; aktivieren
clr temp1 ; TCCR1 High auf 0
out tccr1a,temp1
ldi temp1,(1<<ICNC1)|(1<<CS10) ; Noiscanceler deaktiv.
out tccr1b,temp1 ; Timer1 Clock = Clock
ldi temp1,0xE8 ; Timervorgabewerte:
out tcnt1h, temp1 ; Highbyte= 0xE8
ldi temp1,0x90 ; Lowbyte = 0x90
out tcnt1l, temp1 ; Wert = 0xE890 => 500Hz Interruptfreq.
;Stack einrichten
ldi temp1,low(ramend-0x05) ; 5 Bytes für Matrixdaten (VGA) im SRAM reservien
out spl,temp1
;I/O-Ports Config.
;PortB
ser temp1 ; PortB als Ausgang def.
out ddrb, temp1
;PortD
ser temp1 ; PortD als Ausgang def.
out ddrd, temp1
;Pointerregister def.
;X-Pointer für Multiplexer
ldi xl, low(RAMEND) ; Addresse vom Ramende
ldi xh, high(RAMEND)
;Z-Pointer für ASCII-Werteauslesen
ldi zl, low(ASCII*2) ; Addresse vom Beginn der ASCII-Tabelle
ldi zh, high(ASCII*2)
ldi temp1,16 ; Wenn PB.5=1, dann PortD = 1
out portd, temp1
;-------[ Hauptprogramm Beginn ]----------------------------------------------------
Main:
ldi temp1, 0b01010101
sts (ramend-0x00),temp1
ldi temp1, 0b01010101
sts (ramend-0x01),temp1
ldi temp1, 0b01010101
sts (ramend-0x02),temp1
ldi temp1, 0b01010101
sts (ramend-0x03),temp1
ldi temp1, 0b01010101
sts (ramend-0x05),temp1
call delay
rjmp Main
;-------[ Hauptprogramm Ende ]------------------------------------------------------
;-------[ Delay-Routine (1 Sekunde) ]-----------------------------------------------
Delay:
ldi R21, $1F
WGLOOP0: ldi R22, $FD
WGLOOP1: ldi R23, $FE
WGLOOP2: dec R23
brne WGLOOP2
dec R22
brne WGLOOP1
dec R21
brne WGLOOP0
nop
nop
ret
;-------[ Multiplex-Interrupt-Routine]----------------------------------------------
t1int:
ldi temp1,0xE8 ; Timervorgabewerte:
out tcnt1h, temp1 ; Highbyte= 0xE8
ldi temp1,0x90 ; Lowbyte = 0x90
out tcnt1l, temp1 ; Wert = 0xE890 => 500Hz Interruptfreq.
LD temp1,x ; Lese ein Matrix-Byte aus SRAM ; Lese ein Matrix-Byte aus SRAM
sbiw xl,1
cpi XL,Ramend-0x05
breq noreset
ldi XH,HIGH(RAMEND)
ldi XH,LOW(RAMEND)
noreset:
in temp2,portd ; Lese Portd aus
lsl temp2 ; Schiebe alle Bits eins nach links
out portb,temp1 ; Schreibe SRAM-Daten in den PortB
out portd, temp2 ; Schreibe PortD ( Shifted nach links)
sbis portd,5 ; Schauen ob PD.5 = 1
rjmp endmulti ; Wenn PB.5=0, dann springe nach endmulti
ldi temp1,1 ; Wenn PB.5=1, dann PortD = 1
out portd, temp1
endmulti:
reti
;-------[ ACII-HEX-Tabelle und Text ]-----------------------------------------------
;ASCII-HEX-Tabelle
ASCII:
;Text
Text:
.db "Hallo, ich bin ein AVR!",0
;=======[ Programm ENDE ]================================================== =========
ich hab hier eine ganz komische sache bemerkt:
wenn ich in meinem Porgramm mit In den Inhalt von Portb in ein Register ( R16 ) schreibe wird auch das R26 beschrieben ( als XH verwendet ), woran leigt das, wie kann ich das vermeiden???
hier mal der Anomaliencode:
in temp2,portd ; Lese Portd aus
lsl temp2 ; Schiebe alle Bits eins nach links
Mein gesammter Code:
;************************************************* **********************************
;* Beschaltung: *
;* *
;* PB0 >----[200R]--A-[D]--[D]--[D]--[D]--[D] Die 5 Anoden einer LED-Reihe *
;* | | | | | sind miteinander verbunden und *
;* PB1 >----[200R]--A-[D]--[D]--[D]--[D]--[D] über einen Vorwiderstand an *
;* | | | | | einen Portpin angeschlossen. *
;* PB2 >----[200R]--A-[D]--[D]--[D]--[D]--[D] Die Kathoden der LEDs einer *
;* | | | | | Spalte sind ebenfalls mit- *
;* PB3 >----[200R]--A-[D]--[D]--[D]--[D]--[D] einander verbunden und über *
;* | | | | | einen Transitor nach GND ge- *
;* PB4 >----[200R]--A-[D]--[D]--[D]--[D]--[D] schalten. *
;* | | | | | *
;* PB5 >----[200R]--A-[D]--[D]--[D]--[D]--[D] LEDs: LED Rot *
;* | | | | | Transistoren: BC547 *
;* PB6 >----[200R]--A-[D]--[D]--[D]--[D]--[D] Widerstände: 1/4W Kohleschicht *
;* | | | | | *
;* K K K K K *
;* | | | | | *
;* |/ | | | | *
;* PD0 >----[10k]----| | | | | *
;* |> | | | | *
;* | | | | | *
;* | | | | | *
;* | |/ | | | *
;* PD1 >----[10k]---------| | | | *
;* | |> | | | *
;* | | | | | *
;* | | | | | *
;* | | |/ | | *
;* | | |> | | *
;* | | | | | *
;* | | | | | *
;* | | | |/ | *
;* PD2 >----[10k]-------------------| | *
;* | | | |> | *
;* | | | | | *
;* | | | | | *
;* | | | | |/ *
;* PD3 >----[10k]------------------------| *
;* | | | | |> *
;* | | | | | *
;* | | | | | *
;* GND >---------------o----o----o----o----o *
;* *
;* *
;************************************************* **********************************
;-------[ Assembler Einstellungen ]-------------------------------------------------
;Includedatei für AT90S2313 laden
.include "2313def.inc"
;Arbeitsregister definieren
.def temp1 = r16 ; Universalregister 1
.def temp2 = r17 ; Universalregister 2
.def temp3 = r18 ; Universalregister 3
;-------[ µC Einstellungen ]--------------------------------------------------------
;Interupt Config. I
.org 0000
rjmp start
reti
reti
reti
reti
rjmp t1int
Start:
;Interupt Config II
sei ; Interuptts freigeben
ldi temp1, (1<<TOIE1) ; Timer1 Interrupt
out timsk, temp1 ; aktivieren
clr temp1 ; TCCR1 High auf 0
out tccr1a,temp1
ldi temp1,(1<<ICNC1)|(1<<CS10) ; Noiscanceler deaktiv.
out tccr1b,temp1 ; Timer1 Clock = Clock
ldi temp1,0xE8 ; Timervorgabewerte:
out tcnt1h, temp1 ; Highbyte= 0xE8
ldi temp1,0x90 ; Lowbyte = 0x90
out tcnt1l, temp1 ; Wert = 0xE890 => 500Hz Interruptfreq.
;Stack einrichten
ldi temp1,low(ramend-0x05) ; 5 Bytes für Matrixdaten (VGA) im SRAM reservien
out spl,temp1
;I/O-Ports Config.
;PortB
ser temp1 ; PortB als Ausgang def.
out ddrb, temp1
;PortD
ser temp1 ; PortD als Ausgang def.
out ddrd, temp1
;Pointerregister def.
;X-Pointer für Multiplexer
ldi xl, low(RAMEND) ; Addresse vom Ramende
ldi xh, high(RAMEND)
;Z-Pointer für ASCII-Werteauslesen
ldi zl, low(ASCII*2) ; Addresse vom Beginn der ASCII-Tabelle
ldi zh, high(ASCII*2)
ldi temp1,16 ; Wenn PB.5=1, dann PortD = 1
out portd, temp1
;-------[ Hauptprogramm Beginn ]----------------------------------------------------
Main:
ldi temp1, 0b01010101
sts (ramend-0x00),temp1
ldi temp1, 0b01010101
sts (ramend-0x01),temp1
ldi temp1, 0b01010101
sts (ramend-0x02),temp1
ldi temp1, 0b01010101
sts (ramend-0x03),temp1
ldi temp1, 0b01010101
sts (ramend-0x05),temp1
call delay
rjmp Main
;-------[ Hauptprogramm Ende ]------------------------------------------------------
;-------[ Delay-Routine (1 Sekunde) ]-----------------------------------------------
Delay:
ldi R21, $1F
WGLOOP0: ldi R22, $FD
WGLOOP1: ldi R23, $FE
WGLOOP2: dec R23
brne WGLOOP2
dec R22
brne WGLOOP1
dec R21
brne WGLOOP0
nop
nop
ret
;-------[ Multiplex-Interrupt-Routine]----------------------------------------------
t1int:
ldi temp1,0xE8 ; Timervorgabewerte:
out tcnt1h, temp1 ; Highbyte= 0xE8
ldi temp1,0x90 ; Lowbyte = 0x90
out tcnt1l, temp1 ; Wert = 0xE890 => 500Hz Interruptfreq.
LD temp1,x ; Lese ein Matrix-Byte aus SRAM ; Lese ein Matrix-Byte aus SRAM
sbiw xl,1
cpi XL,Ramend-0x05
breq noreset
ldi XH,HIGH(RAMEND)
ldi XH,LOW(RAMEND)
noreset:
in temp2,portd ; Lese Portd aus
lsl temp2 ; Schiebe alle Bits eins nach links
out portb,temp1 ; Schreibe SRAM-Daten in den PortB
out portd, temp2 ; Schreibe PortD ( Shifted nach links)
sbis portd,5 ; Schauen ob PD.5 = 1
rjmp endmulti ; Wenn PB.5=0, dann springe nach endmulti
ldi temp1,1 ; Wenn PB.5=1, dann PortD = 1
out portd, temp1
endmulti:
reti
;-------[ ACII-HEX-Tabelle und Text ]-----------------------------------------------
;ASCII-HEX-Tabelle
ASCII:
;Text
Text:
.db "Hallo, ich bin ein AVR!",0
;=======[ Programm ENDE ]================================================== =========