-         
+ Antworten
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: AT90S2313 - RX-Interupt - Der "hängt sich auf"

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.03.2004
    Ort
    Paderborn
    Alter
    32
    Beiträge
    614

    AT90S2313 - RX-Interupt - Der "hängt sich auf"

    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)
    Code:
    .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).

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.03.2004
    Ort
    Paderborn
    Alter
    32
    Beiträge
    614
    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.
    it works best if you plug it (aus leidvoller Erfahrung)

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.03.2004
    Ort
    Paderborn
    Alter
    32
    Beiträge
    614
    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.
    it works best if you plug it (aus leidvoller Erfahrung)

  4. #4
    Gast
    Schreib doch erst mal ein kleines Testprogramm mit Bascom

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    28.04.2004
    Ort
    Nähe Köln
    Alter
    49
    Beiträge
    247
    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

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    28.04.2004
    Ort
    Nähe Köln
    Alter
    49
    Beiträge
    247
    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

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.03.2004
    Ort
    Paderborn
    Alter
    32
    Beiträge
    614
    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.
    it works best if you plug it (aus leidvoller Erfahrung)

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    28.04.2004
    Ort
    Nähe Köln
    Alter
    49
    Beiträge
    247
    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

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.03.2004
    Ort
    Paderborn
    Alter
    32
    Beiträge
    614
    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.
    it works best if you plug it (aus leidvoller Erfahrung)

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    28.04.2004
    Ort
    Nähe Köln
    Alter
    49
    Beiträge
    247
    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
    Angehängte Dateien Angehängte Dateien

+ Antworten
Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •