Forum: Mikrocontroller und Digitale Elektronik ATMega128 RS232 Verbindung spinnt


von Etros (Gast)


Lesenswert?

Hallo liebe Forengemeinde,
Für ein Projekt arbeite ich mit einem ATMega128 dessen UART ich für eine 
RS232 Verbindung zu einem PC benötige. RS232 Verbindungen haben mir 
eigentlich noch nie Probleme bereitet. Der ATMega128 will aber nicht so 
recht. Erst hab ich nix empfangen und dachte es liege an einer 
Fehlverdrahtung vom MAX232. Nach eingehenden Tests kann ich sagen, dass 
die Hardwareverkablung richtig ist. Ich bin jetzt so weit, dass der 
Controller Zeichen senden kann, diese werden aber nur in 10% der Fäll 
richtig übertragen, sprich wenn ich 10-mal das Zeichen a sende ist nur 
einmal  a im Hyperterminal zu sehen, sonst nur Sonderzeichen. Wenn ich 
die Verbindung mit meinem USB-RS232 Adapterkabel aufbaue, funktioniert 
alles reibungslos. Ich würde ja davon ausgehen, dass die onboard RS232 
Schnittstelle einen Fehler hätte doch sie verhält sich nur mit diesem 
Controller so eigenartig. Hat jemand eine Idee woran das liegen könnte. 
Wäre echt dankbar. Anbei noch der Source des simplen Testprogramm.
1
.equ fCpu = 8000000
2
.equ Baud = 9600
3
4
.org 0x0000
5
rjmp start
6
7
8
start:            ldi r16,LOW(RAMEND)
9
      out SPL,r16
10
      ldi r16,HIGH(RAMEND)
11
      out SPH,r16
12
13
      ldi r16,(fCpu/(8*Baud))-1
14
      out UBRR0L,r16
15
      clr r16
16
      sts UBRR0H,r16
17
18
      ldi r16,(1<<U2X0)
19
      out UCSR0A,r16
20
21
      ldi r16,(1<<RXEN0)|(1<<TXEN0)
22
      out UCSR0B,r16
23
24
      ldi r16,(1<<UCSZ00)|(1<<UCSZ01)
25
      sts UCSR0C,r16
26
27
      
28
loop:            rcall TerminalGetChar
29
                 rcall TerminalPutChar
30
                 nop
31
                 rjmp loop
32
33
34
35
TerminalGetChar:                  sbis UCSR0A,RXC0
36
                                  rjmp TerminalGetChar
37
                                  in r16,UDR0
38
                                  ret
39
40
TerminalPutChar:                  sbis UCSR0A,UDRE0
41
                                  rjmp TerminalPutChar
42
                                  out UDR0,r16
43
                                  ret

von Magic S. (magic_smoke)


Lesenswert?

Das klingt mir sehr nach einem Baudratenproblem, was ohne Baudratenquarz 
bei genau 8MHz Takt auch recht wahrscheinlich ist.

von holger (Gast)


Lesenswert?

>Wenn ich die Verbindung mit meinem USB-RS232 Adapterkabel aufbaue, >funktioniert 
alles reibungslos.

>Das klingt mir sehr nach einem Baudratenproblem

Wohl eher nicht. Das klingt nach einem Schaltungsproblem.
Mal wieder Masse am Sub-D vergessen?

von Etros (Gast)


Lesenswert?

Pin 5 liegt sauber auf GND

von Wolfgang (Gast)


Lesenswert?

Etros schrieb:
> Ich bin jetzt so weit, dass der
> Controller Zeichen senden kann, diese werden aber nur in 10% der Fäll
> richtig übertragen, sprich wenn ich 10-mal das Zeichen a sende ist nur
> einmal  a im Hyperterminal zu sehen, sonst nur Sonderzeichen.

Dann nimm dir mal ein vernünftiges Terminalprogramm (z.B. HTerm), guck 
dir an, welchen HexCode die Sonderzeichen haben, male dir das serielle 
Signal auf und überlege, ob das wohl an falschem Timing liegen kann.

Oder nimm ein Oszilloskop ;-)

von Hubert G. (hubertg)


Lesenswert?

Hast du den Programmer noch dran?

von Etros (Gast)


Lesenswert?

Also ich hab mir die einkommenden Zeichen mal mit HTerm angeschaut und 
mir ist aufgefallen das manchmal das 8 Datenbit auch auf 1 ist obwohl es 
0 sein sollte. Schicke ich z.B. 'A' kommt manchmal richtig 0x41 an und 
manchmal 0xC1. Bei anderen Zeichen verhaelt es sich gleich. Manchmal wir 
das 8 Bit einfach High. Am Oszi hab ich mir mal das Signal angeschaut. 
Ich habe testweise ein 'A' alle 8 ms senden lassen. Bei einer Baudrate 
von 9600 muesste jedes Zeichen ungefaehr 0,1 ms anliegen was auch der 
Fall ist. Nur beidem 8 Datenbit und dem Stoppbit ist es so das das 
Stoppbit frueher als erwartet gesendet wird sprich Datenbit 8 liegt nur 
ungefaehr 80% seiner Zeit an, dann kommt schon das Stoppbit. Ich hab 
keine Ahnung was man da machen kann.

@Hubert G. der Programmierer ein JTAGICE3 ist die ganze Zeit ueber die 
JTAG Schnittstelle angeschlossen.

von spess53 (Gast)


Lesenswert?

Hi

>Also ich hab mir die einkommenden Zeichen mal mit HTerm angeschaut und
>mir ist aufgefallen das manchmal das 8 Datenbit auch auf 1 ist obwohl es
>0 sein sollte. Schicke ich z.B. 'A' kommt manchmal richtig 0x41 an und
>manchmal 0xC1.

Sieht nach falscher Baudrate aus.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Etros schrieb:
> Also ich hab mir die einkommenden Zeichen mal mit HTerm angeschaut und
> mir ist aufgefallen das manchmal das 8 Datenbit auch auf 1 ist obwohl es
> 0 sein sollte.

Da auf der RS232 das LSB zuerst übertragen wird, liegt es nahe, dass 
deine Baudrate ein ganz klein wenig daneben liegt, so dass du hier 
manchmal das nach dem 7. Datenbit folgende Stopbit siehst.

die 8Mhz, sind die vom internen RC-Generator erzeugt?

von Etros (Gast)


Lesenswert?

Auf meinem Board habe ich noch einen 16MHz Quarz an dem ATMega128 
angeschlossen. Den hab ich nicht benutzt weils mit dem am Anfang auch 
nicht geklappt hat und ich mit einer niedrigeren Frequenz testen wollte. 
Ich benutze den Quarz jetzt wieder und die Schnittstelle funkt endlich. 
Auf dem Oszi ist zu sehen das der Uebergang zwischen Datenbit 7 und 
Stoppbit sauber ist. Die Schnittstelle funktioniert tadellos auch mit 
XON XOFF bei 115200 Baud. Ist der Fehler also nur daher gekommen, dass 
der interne Quaroszilator  des ATMega128 zu ungenau ist und sich 
deswegen die Signale verschoben haben was dazu gefuehrt hat das sich 
Datenbit 7 und das Stoppbit ueberlappt haben?

von Karl H. (kbuchegg)


Lesenswert?

Etros schrieb:

> XON XOFF bei 115200 Baud. Ist der Fehler also nur daher gekommen, dass
> der interne Quaroszilator  des

Der Fehler ist, dass es keinen internen Quarzoszillator gibt.

Das ist ein stink normales RC-Glied, das da am Werk ist. Und je nach 
Temperatur (aber nicht nur) verändert der seine Frequenz bzw. rauscht 
rund um die Sollfrequenz.

Woher kommt immer dieses 'interne Quarzoszillator'?
Mit ein wenig nachdenken ist doch klar, dass man wohl keinen externen 
Quarz benutzen würde, wenn der IC schon einen eingebaut hätte.

von Etros (Gast)


Lesenswert?

Ok, vielen Dank fuer die Hilfe

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.