PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AT90S2313 - RX-Interupt - Der "hängt sich auf"



Gottfreak
12.05.2004, 17: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).

Gottfreak
13.05.2004, 01:15
Falls es jemandem hilft (dabei, mir zu helfen): Ich hab' auch den AVR und den Max232 ausgetauscht (an denen wird es also auch nicht gelegen haben.). An V+ und V- des Max232 messe ich (mit 'nem billigen Digimultimeter) jeweils ca. +/- 9V(laut Datenblatt sollten es 10 sein. Aber da der AVR an den PC senden kann und er umgekehrt nur abstürzt, wenn der RX-Interrupt an ist, der dann auch garnicht ausgeführt wird, verstehe ich da den Zusammenhang auch nicht.).
Mit "Der bleibt stehen" meine ich, dass er im aktuellen Zustand "gefriert" also alle Ports auf ihrem Wert stehen bleiben.

Gottfreak
13.05.2004, 19:23
Kann sowas am Serialport meines Rechners liegen(in einem anderen Forum hat jemand sowas ähnliches erwähnt(leider ist der Beitrag sehr alt und von dem Kerl hab' ich auch keine Kontaktdaten).)?
Was muss die für einen Pegel liefern, wenn ich nichts mit der mache (kann man das mit 'nem einfachen Messgerät irgendwie überprüfen?).
Wenn ich hinter dem Max232 RXD und TXD verbinde, kann der Rechner seine eingenen Signale verstehen. Kann es trotzdem sein, dass der AVR damit nicht klarkommt (also ist da irgendwas anders?)?
PS: Ist es ausgeschlossen (wie ich eigentlich immer angenommen hatte), dass ein einfaches Messgerät mit seinen Messströmen (etwa, wenn ich den Widerstand zwischen zwei Ports messe, um einen Kurzschluss auszuschließen), einen AVR beschädigt.

13.05.2004, 19:27
Schreib doch erst mal ein kleines Testprogramm mit Bascom

Dino Dieter
13.05.2004, 19:28
Hallo

Habe dein Prgramm eben mal getestet und kann keinen Fehler feststellen. Der RX Int. wird an gesprungen und sauber ausgeführt.

Das einigste was mir aufgefallen ist, das du nicht prüfst, ob das UDR leer ist, bevor du da was reinschreibst. . Tut hier aber nichts zur Sache, mann kann später halt mal ein paar Zeichen verlieren.

Also ich habe in der RX Int nur 2 Zeilen zum Testen angefügt.

ldi r16, 65
out UDR, r16

Geht auch so, wie gedacht.

Auch der Timer Int wird sauber ausgeführt.

MFG
Dieter

Dino Dieter
13.05.2004, 19:45
Hallo

Habe jetzt mal gemmessen.

Wenn ich nichts mache, messe ich - 8 Volt Gleichspannung und 0 Volt Wechselspannung, an PIN 3 der RS232, da wo der AVR daran soll.

Mit Terminal Prog. bei Ausgabe eines A bei 600 BAUD messe ich -1,1 Volt Gleichspannung bei wilden Sprüngen und 7,5 Volt Wechselspannung relativ stabil.

MFG
Dieter

Gottfreak
13.05.2004, 19:50
Dann bleibt ja eingentlich nurnoch mein Rechner als Fehlerquelle übrig(wenn ich mir nicht beide AVRs zerschossen hab').


Das einigste was mir aufgefallen ist, das du nicht prüfst, ob das UDR leer ist, bevor du da was reinschreibst. . Tut hier aber nichts zur Sache, mann kann später halt mal ein paar Zeichen verlieren.

Kann ich mich, wenn ich jeweils beim Empfang eines Zeichens eines zurücksende, nicht darauf verlassen, dass UDR leer ist?
Das ganze soll eine Art Servocontroller werden, der Servosignale eines Modellempfängers versteht und sie immer dann an den Haupt-µC sendet, wenn der die Position der Servos aktualisiert.

Dino Dieter
13.05.2004, 20:03
Hallo

Hast denn mal gemessen?

Wenn du in der RX INT eins ins UDR schreibst, kann du sicher sein, das es leer ist. In Wirklichkeit sind es ja 2 Register, eins zum senden und eins zum empfangen. Heißen nur halt beide gleich.

War auch mehr so allgemein gemeint, das mir dem Abfragen vor dem schreiben.

MFG
Dieter

Gottfreak
13.05.2004, 21:26
Hast denn mal gemessen?

Ne, ich hab' nix gemessen. Wie man 'nem Serialport "nachmisst" hab' ich oben ja vergeblich gefragt.
Im Übrigen funktioniert ein Bascom-Programm, dass diesen Interrupt benutzt wider Erwarten bei mir.
Da also der Code von Oben bei dir läuft, sollte es nicht daran liegen.
Da Bascom das kann, was mit dem Prog oben nicht geht, kann es die Hardware eigentlich auch nicht sein...
Jetzt bin ich noch verwirrter als vorher.
Macht Bascom im Umgang mit dem UART oder mit Interrupts irgendwas anders als ich es da gemacht hab' ? Wird vielleicht irgendein vorhandener Fehler da besser abgefangen?
Könntest du mir vielleicht die von dir verwendete "2313def.inc" schicken oder die hier posten? Das ist ja so ziemlich das Einzige, das noch den Unterschied machen könnte, warum es bei mir nicht geht.

Dino Dieter
13.05.2004, 21:37
Hallo

Hier die Daten

Habe nur 3 Zeilen eingefügt.

Einmal .org 0x001f sonst kam im AVR Studio ein Fehler und

ldi S1Les,69 ;nur zum Test für den INT

ldi S2Les,76 zum testen der INT

Habe oben doch mal geschrieben, was ich so messe an der RS232.

MFG
Dieter

Gottfreak
13.05.2004, 23:32
Habe nur 3 Zeilen eingefügt.

Einmal .org 0x001f sonst kam im AVR Studio ein Fehler

JAU !
Wenn ich das bei mir am Start einfüge, geht alles !
Im Nachhinein hätte ich da, bei all dem, was ich in den letzt so ca. 35 Std. probiert habe, auch drauf kommen können, dass der sonst an der ersten freien Stelle anfängt, seinen Programmcode abzulegen (also womöglich zwischen den Interruptvektoren oder weis der Geier wo).
Nochmal herzlichen Dank !