Ich habe aktuelle ein Problem mit meiner RS-232 Schnittstelle. Ich
verwende die Usart- Libary von peter Fleury, die in der Vergangenheit
gut funktioniert hat. Neues Board, neues Glück. Diesmal ziert sich das
Ganze ziemlich.
Ich bekomme nur kryptische Zeichen im HTerm angezeigt. Frequenz und
Baudrate stimmen wahrscheinlich. 16 Mhz(Quarz) und Baudrate 9600
erzeugen wohl nur einen Fehler von 0,2% lt. Datenblatt.
#define F_CPU 16000000UL
#define UART_BAUD_RATE 9600
Da ich ja Zeichen empfange schliesse ich mal einen Kabelfehler aus,
wobei ich mir hier nicht sicher bin, ob GND verbunden werden muss, oder
ob TX und RX reichen. Ich verwende den Atmega 128 und hier das Interface
1 an den Ports D.2 und D.3
uart1_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
uart1_puts("Test");
Was kann falsch sein? bzw wo fang ich mit der Fehlersuche an?
Daniel F. schrieb: > wobei ich mir hier nicht sicher bin, ob GND verbunden werden muss, oder > ob TX und RX reichen. Auf jeden Fall mit verbinden. GND ist das Bezugspotential.
naja egal obs dranhängt oder nicht, die ausgabe im terminal ist immer die gleiche. Ich hab jetzt auch schon die Baudraten varriiert, aber keine Änderung.
Gast
#1908716
Läuft der uC wirklich mit 16MHz? Fuses! Sind beim MAX232 auch VCC und GND angeschlossen?
Fuses ist auf Ext Crystal/resonator High Freq Stat-up Time 16K CK + 64 ms gestellt. Um den RS232 auf meinem Borad nutzen zu können, musste ich zwei Lötbrücken schliessen, das habe ich getan. Und da ja irgendwas übertragen wird, kann ich doch davon ausgehen, dass das alles korrekt läuft. Yo?????<\0>V??<26>???<23>!<27>57?-#?Y[}e?Y<23><27>-#1?<25><23>!<27>57?-# ?sg}Yo?????<\0> Das ist die Ausgabe des Fleury Testprogramms.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
88 | |
89 | |
90 | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 | |
97 | |
98 | |
99 | |
100 | |
101 | |
102 | |
103 | |
104 | |
105 | |
106 | |
107 | |
108 | |
109 | |
110 | |
111 | |
112 | |
113 | |
114 | |
115 | |
116 | |
117 | |
118 | |
119 | |
120 | |
121 | |
122 | |
123 | |
124 | |
125 | |
126 | |
127 | |
128 | |
129 | |
130 | |
131 | |
132 | |
133 | |
134 | |
135 | |
136 | |
137 | |
138 | |
139 | |
140 | |
141 | |
142 | |
143 | |
Gast
#1908742
#include "uart.h" /* define CPU frequency in Mhz here if not defined in Makefile */ #ifndef F_CPU #define F_CPU 16000000UL #endif Und woher bekommt uart.h seine F_CPU? Hoffentlich aus dem makefile.
UART_BAUD_SELECT(baudRate,xtalCpu) ((xtalCpu)/((baudRate)*16l)-1)
Dieses Makro wird an die Init Methode übergeben.
und wenn ich das richtig deute, dann ist
>uart1_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
völlig in Ordnung.
Abgesehen davon steht im Makefile auch eine Baudrate von 16 Mhz
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
Gast
#1908791
Was ist mit der CKOPT und der M103C Fuse?
Sind beide nicht aktiv ... ich habe so wenig wie möglich dort geändert, da ich mir schon einmal das Board verfused habe :)
M103C ist neu für mich, und ich darf das auf keinen Fall einstellen. Ich brauche TWI den Port C teilweise als Eingang und ganz wichtig Uart Interface 1. 0 ist wohl mit der ISP Schnittstelle belegt. CKOpt klingt nach der Lösung des Problems, aber ich bin nicht sicher, ob ich nicht irgendwas kaputt mache, wenn ich dieses Fuse Bit setze. Ich glaube meine Nerfen ertragen keinen verfusten µC.
Gast
#1908885
>M103C ist neu für mich, und ich darf das auf keinen Fall einstellen. Ich wollte ja nur sichergehen das du die NICHT aktiviert hast. >CKOpt klingt nach der Lösung des Problems, aber ich bin nicht sicher, ob >ich nicht irgendwas kaputt mache, wenn ich dieses Fuse Bit setze. Nö, warum?
naja grundsätzliche Angst dort was zu ändern... zu oft in diese Steckdose gefasst :) ich habs mal probiert (CKOpt), und es bringt keinerlei Änderungen. Alles bleibt beim Alten. Exakt die selben Ausgaben.
Gast
#1908937
>ich habs mal probiert (CKOpt), und es bringt keinerlei Änderungen. Alles >bleibt beim Alten. Exakt die selben Ausgaben. Auch wenn du die Baudrate änderst? Bist du sicher das du das richtige Hexfile brennst?
Das hab ich schon überprüft.... Auch wenn ich die Baudrate ändere sieht die Ausgabe im Terminal gleich aus. Sollte sie ja auch, da ja das gleiche ankommt. ?::<\n><\0> Das ist mein String "Hallo".
Gast
#1908963
>Auch wenn ich die Baudrate ändere sieht >die Ausgabe im Terminal gleich aus. Sollte sie ja auch, da ja das >gleiche ankommt. Sag mal hast du üerhaupt einen MAX232 Pegelwandler auf deinem Board?
Ich zitiere mal aus der Anleitung des Boards. Ich denke ja, es gibt diesen Pegelwandler. Alles andere würde hier keinen Sinn machen. Jedenfalls wenn ich folgenden Text richtig verstehe. Das Interface 1 steht an den Ports D.2 und D.3 zur Verfügung. Diese beiden Ports sind mit dem RS-232-Interface-Chip auf dem Board verbunden, denn der Mikrocontroller kennt nur den Pegel von 5 Volt und wie Sie oben lesen konnten, sind für RS-232 Spannungen notwendig, die nicht Mikrocontroller-tauglich sind. Wenn Sie die RS-232 Leitung des PCs direkt an den Mikrocontroller anschließen würden, würde dieser vermutlich zerstört werden. Achtung: Um RS232 nutzen zu können, müssen Sie zuerst 2 Lötbrücken schließen. Mehr dazu auf Seite 31. Da der RS232-Transceiver an die Ports D2 und D3 angeschlossen ist (Rx1 und Tx1 des Mikrocontrollers),würde der Transceiver diese Ports beeinflussen, selbst wenn kein RS232- Empfang oder Sendebetrieb stattfindet. Wenn Sie also eine „echte“ RS232-Verbindung (über die beiden Anschlüsse RX und TX) nutzen möchten, können Sie nicht auch gleichzeitig die Ports D.2 und D.3 nutzen. Daher wurde der Transceiver durch diese beiden Brücken abgekoppelt. Das bedeutet,wenn Sie RS232 nutzen möchten, so müssen Sie J6 und J7 zuerst schließen. D.2 und D.3 stehen trotzdem immer an der Pfostenleiste zur Verfügung, lediglich die Verbindung zum RS232 Chip wird durch die Brücken geschlossen.
Gast
#1908986
Brenn mal diese HEX Datei. Es wird dauernd ein U gesendet. ATMega128, 16MHz, 9600Baud
Da kommt gar nix an
Gast
#1908997
>Da kommt gar nix an
Kann ja auch nicht, war für UART0 und nicht UART1.
Gibts noch nen Anschluss für UART0 wo du mal nachsehen kannst?
Was für ein Board ist das überhaupt?
kann es sein, dass die Libary von Peter Fleury mit dem Atmega128 gar nicht funktioniert. Ich sehe hier in der init Methode eine Variable URSEL1 im UCSR1C Register. Die gibt es laut Datenblatt gar nicht.
holger schrieb: >>Da kommt gar nix an > > Kann ja auch nicht, war für UART0 und nicht UART1. > Gibts noch nen Anschluss für UART0 wo du mal nachsehen kannst? > > Was für ein Board ist das überhaupt? Es steht ausdrücklich im Handbuch meines Boards, dass Interface 1 zu verwenden ist, da Interface 0 schon genutzt wird. Zitat: das andere ist das Interface 0 – wir nutzen es hier nicht, da die Ports dieser Schnittstelle gleichzeitig auch für die ISP-Programmierung genutzt werden – mehr dazu im ATMega128-Datenblatt Es ist das D072 von Display3000.
Das kann doch nicht angehen. Es folgt mein neuer Code. Ich habe mich jetzt exakt ans Datenblatt gehalten und immer noch sendet der µC nur Mist. Ich denke der Code stimmt so, also muss es vielleicht doch entweder an den Fuses liegen oder an der Hardware. Die Fuses hab ich nochmals überprüft und es auch mit CKOpt versucht. Keine Veränderung. Das Board selbst hat keine Jumper und läuft ziemlich sicher mit 16 Mhz. Sowohl I2C als auch ADC und so weiter laufen korrekt. (hier in diesem Beispiel nicht aktiviert.) Fuses sind wie folgt: Extended 0xFF High 0xC1 Low 0xBF Ausgabe im Terminal ASCII USt<\0> HEX 55 53 74 00
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
for(;;)
{
delay_ms(1000);
USART_Transmit('D');
}
Wenn ich das hier Sende, kommt <\0> oder in Hex 0x00 an.
Hilft das eventuell weiter?
Langsam verzweifle ich wirklich.
Gast
#1909581
>Das Board >selbst hat keine Jumper und läuft ziemlich sicher mit 16 Mhz. Laut Datenblatt mit 8MHz. Hast du den Quarz nachgerüstet oder ist da einer drauf? Ohne würde es mit deinen Fuses aber gar nicht laufen. RS232 Kabel selber gebaut? Dann könntest du einen Dreher bei GND und TxD haben.
Ja es ist ein Quarz nachgerüstet... Wenn ich TX und RX vertausche bekomm ich keine ausgabe im Terminal. Wird also stimmen. GND ist auch verbunden. Ich habe grade ein LED Blinkprogramm geschrieben, und die LED blinkt fein im Sekundentakt. Also ist 1Mhz und 8Mhz ausgeschlossen. (Mal abgesehen von der richtig gesetzten Fuse) An was kann es denn liegen dass es nicht geht? Kann Interface 0 stören, da hier SPI verbunden ist?
Gast
#1909616
UCSR0C = (0<<UMSEL1)|(0<<USBS1)|(3<<UCSZ11); //Asynchron 8N1
^
|
|
Fällt dir da was auf?
Jop ... ändert die Sache ein wenig ECp<\0> ist jetzt die Ausgabe... nicht wirklich besser. Ich habe das ganze grade auf dem Interface0 versucht. Da ist die Ausgabe genau die Gleiche wie jetzt auf Interface1.
Gast
#1909671
>Ich habe das >ganze grade auf dem Interface0 versucht. Da ist die Ausgabe genau die >Gleiche wie jetzt auf Interface1. Könnte es sein das du tatsächlich die Pins D2, D3 benutzt statt RX und TX?
hmmm wie stell ich das fest? Ich habe die Anleitung befolgt, und diese sagte mir: Schliesse die Lötbrücken J6 und J7 um RS232 zu verwenden. Damit soll laut Handbuch die Verwendung von D2 und D3 unterbunden sein. Also gehe ich davon aus, dass ich wirklich TX und RX verwende. Ich habe grade etwas versucht. Ich habe einen Char gesendet und das terminal immer wieder verbunden, und getrennt... Folge: Das was ankommt ist inner was anderes (bekomme son 3-4 verschiedene Ausgaben die sich immer wieder wiederholen.) Habe ich in meiner while schliefe nen Delay ist die Ausgabe hier immer 00. Ich bin jetzt völlig ratlos. Dachte ich hätte es verstanden, aber dem ist wohl nicht so. Ich mach das ja nicht zum ersten Mal. Auf meinem STK 500 habe ich nen Atmega 644 und da klappt es alles prima. Wobei ich eben nicht weiss, was mir das STK500 alles abnimmt. Vielleicht ist wirklich der MAX232 (Pegelwandler?) gar nicht vorhanden auf dem Board D072. Aber ich finde keinen Hinweis darauf im Handbuch.
Gast
#1909746
>hmmm wie stell ich das fest?
Auf das Board schauen? Neben den Pins für PORTF
sieht man doch deutlich ein RX und ein TX aufgedruckt.
Gast
#1909751
Hallo, hast Du das Signal schon mal mit dem Oszi angeschaut, so vorhanden? Bernhard
das ist doch für Uart Interface 0 oder?
>Das Interface 1 steht an den Ports D.2 und D.3 zur Verfügung.
Das steht so im Handbuch.
Ich habs mal umgesteckt... und naja das ergebnis ist genau das
Gleiche..... also ob D2 und D3 oder TX RX Pins... kein Unterschied.
Bernhard schrieb: > Hallo, > hast Du das Signal schon mal mit dem Oszi angeschaut, so vorhanden? > > Bernhard Hab ich leider keines zur Verfügung. Leider ...
Gast
#1909784
>Ich habs mal umgesteckt... und naja das ergebnis ist genau das >Gleiche..... also ob D2 und D3 oder TX RX Pins... kein Unterschied. Dann ist irgendwas kaputt. Laut dem Handbuch liegen auf RX/TX RS232 Signale mit mehr als 5V. Da musst du ran und nirgendwo anders. GND muss natürlich auch verbunden werden. Wenn du dann die richtige Baudrate beim uC UND beim PC einstellst dann sollte es auch passen.
6,7 V etwa ... schwankt etwas. Kaputt... darf nicht sein, kann nicht sein :) Hab ich oft gedacht, dann wars wieder irgendwas anderes ... Kann es ein Fehler sein bei der Baudratenberechnung ? Oder doch der Takt ? Würde mein µC denn überhaupt funktionieren wennd er Takt falsch wäre ? Ich meien nach den Fuses muss es stimmen.
DANKE DANKE DANKE !!! ich habe grade die Fleury Lib wieder eingebunden. Und siehe da... es tut. Ich bekomme der verfluchten Text übersendet. Es lag tatsächlich an den doofen Pins. Da wär ich wahrscheinlich nieee drauf gekommen. 3 Tage Horror haben nun ein Ende :)
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.