Forum: Mikrocontroller und Digitale Elektronik UART "hängt sich auf"


von Josh I. (aproquos)


Angehängte Dateien:

Lesenswert?

Hi,

ich habe einen Roboterarm mit 5 Servos gebaut. Diesen möchte ich nun per 
UART ansteuern. Ich habe die UART schon öfters zur Datenübertragung 
benutzt, jetzt tritt jedoch plötzlich ein Problem auf:

Ich schicke per VB2010 mein 6-Byte Protokoll und der uC antwortet mir, 
wenn er alles empfangen hat. Das funktioniert auch einwandfrei!
In unregelmäßigen Abständen "hängt" sich die UART jedoch auf und ich 
erhalte keine Antwort mehr vom uC.
Wenn ich jetzt den  MAX232  resete (VCC kurz trenne) geht es wieder eine 
Weile lang einwandfrei, bis das ganze wieder nicht reagiert.
Der MAX232 ist laut Datenblatt (siehe Anhang) geschalten.

Hat jemand eine Idee, woran es liegen könnte?
Der UART Empfang ist per Interrupt in Bascom gelöst:
1
$regfile = "2313def.dat"
2
$crystal = 8000000
3
$baud = 4800
4
5
On Urxc Signal
6
Enable Urxc
7
Enable Interrupts
8
9
'zu empfangendes Protokoll besteht aus 6 Bytes:
10
' "0" + 5 Datenbytes
11
Dim S1 As Byte
12
Dim S2 As Byte
13
Dim S3 As Byte
14
Dim S4 As Byte
15
Dim Sc As Byte
16
17
Dim Bytenr As Byte  'zählt die 6 Bytes des Protokolls ab
18
Bytenr = 0
19
20
Do
21
 !NOP
22
Loop
23
24
Signal:
25
   Dim Inb As Byte
26
   Inb = Udr  'Byte einlesen
27
   If Inb = 0 Then  'Anfang des Protokolls erkennen
28
      Bytenr = 1
29
   Elseif Bytenr > 0 Then
30
      Select Case Bytenr
31
         Case 1:
32
            S1 = Inb
33
         Case 2:
34
            S2 = Inb
35
         Case 3:
36
            S3 = Inb
37
         Case 4:
38
            S4 = Inb
39
         Case 5:
40
            Sc = Inb
41
            Bytenr = 0
42
            Print "Empfangen:"
43
            Print S1
44
            Print S2
45
            Print S3
46
            Print S4
47
            Print Sc
48
            Print " "
49
            Return
50
      End Select
51
      Bytenr = Bytenr + 1
52
    End If
53
Return

von Niemand (Gast)


Lesenswert?

Hi,
der MAX232 ist "nur" ein Pegelwandler. Es gibt also keine Logik, die 
durch das Wegnehmen von VCC zurückgesetzt wird. Als Fehlerquelle kommen 
somit sehr viele Komponenten in Frage. Der Pegel auf der RS232 vom 
MAX232 könnte zu gering, verrauscht, vertauscht oder niederohmig 
verbunden sein. Durch das abschalten der VCC am MAX232 werden natürlich 
auch die Signale zum Prozessor verändert. Hier könnte eine falsche 
Initialsierung sein, ein Programmierfehler, ein fehlendes Stop-Bit etc. 
Natürlich wird auch auf der Gegenseite ein Signal ausgelöst, dadurch 
kann der Fehler durchaus auch auf der PC-Seite sein. Zudem könnte die 
Baudrate einen zu grossen Fehler beinhalten, so daß die Übertragung nach 
einer gewissen Zeit "aus dem Ruder" läuft. Du sollstest versuchen die 
Situation kurz vor dem hang-up genauer zu bestimmen.

von Josh I. (aproquos)


Lesenswert?

Hi,

bei einer Quarzfrequenz von 8MHz und einer Baud von 4800 habe ich mir 
eine Fehlerrate von ca 0,19% ausgerechnet. Wenn dieser Wert stimmt, ist 
es unlogisch, dass im Mittel bei jeder dritten Datenübertragung nichts 
mehr geht!? - oder liege ich da falsch?
Außerdem kommt ja ABSOLUT NICHTS mehr zurück, wenn ein 
Übertragungsfehler auftreten würde, würde ja halt was Falsches 
zurückkommen, oder?

Ich habe den MAX232 mal ersetzt, tritt immernoch der gleiche Fehler auf!
Das Programm habe ich auf folgendes vereinfacht:
1
$regfile = "2313def.dat"
2
$crystal = 8000000
3
$baud = 4800
4
5
On Urxc Signal
6
Enable Urxc
7
Enable Interrupts
8
9
Do
10
 !NOP
11
Loop
12
13
Signal:
14
   Dim Inb As Byte
15
   Inb = Udr
16
   Print Inb
17
Return

Ich wüsste nicht, wo bei dem Code ein Fehler liegen könnte?

Auf PC-Seite habe ich auch mal verschiedene Terminal-Programme benutzt, 
bei allen das gleiche!

Ich schicke jetzt per VB Zufallszahlen an den uC, im 2-Sekunden Takt.
Der uC braucht 23ms zum Antworten.
Manchmal hängt es sich nach der ersten, manchmal erst anch der 15. 
Übertragung auf ...
Der Fehler ist nicht reproduzierbar!

Um die Zeit kurz davor zu untersuchen, leihe ich mir morgen ein Oszi 
....

Hat jemand einen Tipp, wie ich jetzt noch weiter den Fehler suchen 
könnte?

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Wie sieht dein Verbindungskabel zwischen MAX232 (bzw. dem SubD 
Steckverbinder) und dem COM Port am PC aus? Sag nicht dass du die Masse 
(Pin 5 am SubD) nicht verbunden hast!

von Josh I. (aproquos)


Lesenswert?

Masse ist natürlich verbunden ...
Habe auch schon mehrere Kaebel getestet,
die Kommunikation geht ja auch, aber irgendwann ist der uC halt 
plötzlich nicht mehr ansprechbar, bis ich ihn komplett resete.
Wie gesagt unregelmäßige Abstände und nicht reproduzierbar...

Hatte noch nie jemand so ein Problem?
Das in meinem letzten Beitrag gepostete Programm ist doch korrekt oder?

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Wird der MAX heiß?

von Josh I. (aproquos)


Lesenswert?

Abdul K. schrieb:
> Wird der MAX heiß?

Nein!

von Paul Baumann (Gast)


Lesenswert?

Versuche es mal so:

$regfile = "2313def.dat"
$crystal = 8000000
$baud = 4800
Dim Inb As Byte
On Urxc Signal
Enable Urxc
Enable Interrupts

Do
 !NOP
Loop

Signal:
   Inb = Udr
   UDR = INB
Return

MfG Paul

von Josh I. (aproquos)


Lesenswert?

Paul Baumann schrieb:
> Versuche es mal so:

Da kommt überhaupt nichts zurück!?

Was sollte denn passieren?

von Paul Baumann (Gast)


Lesenswert?

Es sollte passieren, daß das vom Terminal gesendete Zeichen sofort
wieder zum Terminal zurückgesendet wird.

MfG Paul

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Wenn Du den MAX in Verdacht hast, kannst Du das letzte Progrämmchen auch 
in Hardware realisieren. Dazu benötigst Du einen Draht(!). Einfach den 
µC rausnehmen und Rx/Tx verbinden. Dann kannst Du den MAX gemütlich am 
PC durchtesten.

von Josh I. (aproquos)


Lesenswert?

Geniale Idee! So einfach habe ich garnicht gedacht.

Der MAX funktioniert einwandfrei!

Mit dem exakt gleichen Code (außer der regfile natürlich) funktioniert 
auch alles auf dem Atmega48 -> es hängt sich nichts auf!
Bei allen drei Attiny2313s, die ich hier habe geht es nicht (?!) aber 
bei dem Atmega??? Wie gesagt exakt der gleiche Code.

Gibt es dafür eine Erklärung?

MfG
Josh

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Klingt nach WDT.

von holger (Gast)


Lesenswert?

>Bei allen drei Attiny2313s, die ich hier habe geht es nicht (?!) aber
>bei dem Atmega??? Wie gesagt exakt der gleiche Code.

>Gibt es dafür eine Erklärung?

Der ATMega hat mehr RAM.

von Frank (Gast)


Lesenswert?

Josh I. schrieb:
> Signal:
>    Dim Inb As Byte
>    Inb = Udr
>    Print Inb
> Return

print bzw. längere Aktionen im Interrupt sind nicht so geschickt

von mue-c (Gast)


Lesenswert?

Und wenn du wirklich ATtiny2313 hast, ist $regfile = "2313def.dat"
der falsche Konfig. File. Nimm mal diesen:
$regfile = "attiny2313.dat"

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Mit dem 'mehr RAM' könnte auf Stack-Overflow hinweisen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.