Gottfreak
12.05.2004, 18:01
Hi
Ich habe eine Verbindung zwischen AVR und PC via MAX232 hergestellt (nachher sollen mal 2µCs via UART miteinander kommunizieren).
Das Senden an den PC funktioniert auch.
Wenn ich vom PC ein Byte an den AVR sende, bleibt der jedoch einfach stehen.
Hier der Code (zu Testzwecken gekürzt)
.include "2313def.inc" ;Definitionsdatei laden
.equ CLOCK = 8000000
.equ BAUD = 9600
.equ UBRRVAL = CLOCK/(BAUD*16)-1
.def INTtemp=r22
.Def S1Les=r24 ;gemessenes Servosignal in 128tel
.Def S2Les=r23
.def Puls=r21
.equ S1INOffset=128 ;Offset des Eingangssignals in 8µS
.equ S2INOffset=128
.equ S1Offset=4 ;Offsets für Ausgänge in 256µS
.equ S2Offset=4
.Def S1Pos = r28 ;Servo1 invertiert an PB0 - Position in 64tel
.Def S2Pos = r29
.org 0x000
rjmp start
.org URXCAddr
rjmp onRXD ;Interupt für RX
.org 0x006
rjmp T0over
start: ldi r16,low(ramend)
out spl,r16 ;Stackpointer auf RAM-Ende setzen
ldi r16,0b00000000
out ddrd,r16 ;PortD auf Eingang setzen von PortD werden nur INT0-1 benutzt
out portd,r16 ;Interne Pullups von PortD abstellen
ldi r16,0b00000011
out ddrb,r16 ;PortB.0-1 auf Ausgang setzen
out portb,r16 ;Interne Pullups von PortD abstellen, Ausgänge auf high
ldi r16,0b00000011
out TCCR0,r16 ;Prescaler für Timer0 auf 64 stellen
ldi r16,0b00000010
out TIMSK,r16 ;Timer0-Overflow-Interupt anmachen
ldi r16,0b00000010
out TCCR1B,r16 ;Prescaler für Timer1 auf 8 stellen
ldi r16, UBRRVAL
out UBRR, r16 ;Baudrate einstellen
ldi r16, 0b10011000
; ldi r16, 0b00011000 ;TEST! RX-Int Ausmachen
out UCR, r16 ;TX anmachen, RX anmachen, RX-Int anmachen
sei ;interupts an
;-----------------------HAUPTSCHLEIFE ERZEUGT SERVOSIGNALE----------------------------------------------
loop:
rjmp loop
;-----------------------ROUTINEN ZUM AUSLESEN DES SERVOSIGNALS------------------------------------------
T0over: ;Fehlerbehandlung, wenn Timer0 überläuft
ldi puls,0 ;Alle Servopulse als aus markieren. Am Ende des noch laufenden passiert nichts
reti
;-----------------------SERVOPOSITIONEN AM UART EMPFANGEN-----------------------------------------------
onRXD:
; CBI portb,0 ;TEST!!! - Servo1 Puls anmachen
IN INTtemp,UDR
SBRS INTtemp,7 ;Für Servo1 muss Bit7 0 sein, für Servo2 1
RJMP S1stell
SBRC INTtemp,7
RJMP S2stell
reti
S1stell:
MOV S1POS,INTtemp
OUT UDR,S1les
reti
S2stell:
MOV S2POS,INTtemp
OUT UDR,S2les
reti
schon der erste Befehl in der Interupt-Routine wird nicht ausgeführt (was auch immer ich da 'reinschreibe).
Wenn ich den Interupt ausmache, läuft der AVR unbeeinflusst weiter, wenn ich was vom PC schicke(weshalb ich einen Hardware-Fehler ausschließe).
Ich habe eine Verbindung zwischen AVR und PC via MAX232 hergestellt (nachher sollen mal 2µCs via UART miteinander kommunizieren).
Das Senden an den PC funktioniert auch.
Wenn ich vom PC ein Byte an den AVR sende, bleibt der jedoch einfach stehen.
Hier der Code (zu Testzwecken gekürzt)
.include "2313def.inc" ;Definitionsdatei laden
.equ CLOCK = 8000000
.equ BAUD = 9600
.equ UBRRVAL = CLOCK/(BAUD*16)-1
.def INTtemp=r22
.Def S1Les=r24 ;gemessenes Servosignal in 128tel
.Def S2Les=r23
.def Puls=r21
.equ S1INOffset=128 ;Offset des Eingangssignals in 8µS
.equ S2INOffset=128
.equ S1Offset=4 ;Offsets für Ausgänge in 256µS
.equ S2Offset=4
.Def S1Pos = r28 ;Servo1 invertiert an PB0 - Position in 64tel
.Def S2Pos = r29
.org 0x000
rjmp start
.org URXCAddr
rjmp onRXD ;Interupt für RX
.org 0x006
rjmp T0over
start: ldi r16,low(ramend)
out spl,r16 ;Stackpointer auf RAM-Ende setzen
ldi r16,0b00000000
out ddrd,r16 ;PortD auf Eingang setzen von PortD werden nur INT0-1 benutzt
out portd,r16 ;Interne Pullups von PortD abstellen
ldi r16,0b00000011
out ddrb,r16 ;PortB.0-1 auf Ausgang setzen
out portb,r16 ;Interne Pullups von PortD abstellen, Ausgänge auf high
ldi r16,0b00000011
out TCCR0,r16 ;Prescaler für Timer0 auf 64 stellen
ldi r16,0b00000010
out TIMSK,r16 ;Timer0-Overflow-Interupt anmachen
ldi r16,0b00000010
out TCCR1B,r16 ;Prescaler für Timer1 auf 8 stellen
ldi r16, UBRRVAL
out UBRR, r16 ;Baudrate einstellen
ldi r16, 0b10011000
; ldi r16, 0b00011000 ;TEST! RX-Int Ausmachen
out UCR, r16 ;TX anmachen, RX anmachen, RX-Int anmachen
sei ;interupts an
;-----------------------HAUPTSCHLEIFE ERZEUGT SERVOSIGNALE----------------------------------------------
loop:
rjmp loop
;-----------------------ROUTINEN ZUM AUSLESEN DES SERVOSIGNALS------------------------------------------
T0over: ;Fehlerbehandlung, wenn Timer0 überläuft
ldi puls,0 ;Alle Servopulse als aus markieren. Am Ende des noch laufenden passiert nichts
reti
;-----------------------SERVOPOSITIONEN AM UART EMPFANGEN-----------------------------------------------
onRXD:
; CBI portb,0 ;TEST!!! - Servo1 Puls anmachen
IN INTtemp,UDR
SBRS INTtemp,7 ;Für Servo1 muss Bit7 0 sein, für Servo2 1
RJMP S1stell
SBRC INTtemp,7
RJMP S2stell
reti
S1stell:
MOV S1POS,INTtemp
OUT UDR,S1les
reti
S2stell:
MOV S2POS,INTtemp
OUT UDR,S2les
reti
schon der erste Befehl in der Interupt-Routine wird nicht ausgeführt (was auch immer ich da 'reinschreibe).
Wenn ich den Interupt ausmache, läuft der AVR unbeeinflusst weiter, wenn ich was vom PC schicke(weshalb ich einen Hardware-Fehler ausschließe).