PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Anfaengerproblem UART



tbasnoopy
19.02.2012, 22:07
Hallo,

heute versuche ich mal meinen MAX232 zum kommunizieren zu bringen. Ich benutze einen ATMEGA16 Schaltplan siehe Anhang.

F_CPU ist mit 16Mhz im Makefile definiert
F_CPU = 16000000



//---------------------------------------------------------
#include <avr/io.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//---------------------------------------------------------
#ifndef F_CPU
#error "F_CPU is not defined"
#endif
//---------------------------------------------------------
#define BAUD 38400
#include <util/setbaud.h>
#include <CLED.h>
//---------------------------------------------------------
CLED *tmpLED;

void uart_init(void)
{
UBRRH = UBRRH_VALUE;
UBRRL = UBRRL_VALUE;
/* evtl. verkuerzt falls Register aufeinanderfolgen (vgl. Datenblatt)
UBRR = UBRR_VALUE;
*/
#if USE_2X
/* U2X-Modus erforderlich */
UCSRA |= (1 << U2X);
#else
/* U2X-Modus nicht erforderlich */
UCSRA &= ~(1 << U2X);
#endif

// hier weitere Initialisierungen (TX und/oder RX aktivieren, Modus setzen
UCSRB |= (1<<TXEN); // UART TX einschalten
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // Asynchron 8N1
}
//---------------------------------------------------------
int uart_putc( unsigned char c )
{
tmpLED->On();

/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) )
;

/* Put data into buffer, sends the data */
UDR = c; /* sende Zeichen */

tmpLED->Off();
return 0;
}
//---------------------------------------------------------
void uart_puts( char *s )
{
while( *s )
{ /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
uart_putc(*s);
s++;
}
}
//---------------------------------------------------------
int main( void )
{
tmpLED = new CLED( ERegC, 3, false );

tmpLED->Off();

uart_init();

tmpLED->Off();

while (1)
{
uart_puts( "hallo" );

_delay_ms( 4000 );
tmpLED->On();
_delay_ms( 1000 );
tmpLED->Off();
}

return 0;
}
//---------------------------------------------------------


Leider kommt bei mir am Rechner nur sporadisch irgendein Muell. Sporadisch heist, dass es nicht alle ~5 sec zu einem Byte kommt sondern ca. alle 20sec.

Empfangen wird:
FF FF F8 F8 FF FF F8 F8 FF FF FF FF F8 F8

Empfangen habe ich mit einem USB2Serial converter und HTerm 0.8.1beta mit folgenden Einstellungen: COM4 (B:38400 d:8 s:1 p:None).

Wie ich bereits nachgelesen habe sind die meisten Fehler in dem Bereich ungenauigkeiten mit der Baudrate. Lt. dieser Liste http://www.wormfood.net/avrbaudcalc.php sind 38400 okay. Das externe Quarz wird auch verwendet. Zumindest kann man das mit einem Blink Test der LED einigermasen kontrollieren.


Kann mir wer nen Tip geben was ich noch kontrollieren kann?

masasibe
20.02.2012, 06:27
Hast du es denn schon einmal Testweise mit einer niedrigeren Baud versucht?
So unter 10000.
Wenn es dann funktioniert, weißt du zumindest, dass es nicht am Programmm und nicht an der Beschaltung liegt.

Bei den AVRs ist standardmäßig der interne 8-fach Taktteiler aktiviert. Hast du den auch abgeschaltet?


mfg masasibe

Hubert.G
20.02.2012, 12:06
Wenn du deinen Mega16 steckbar hast, dann heraus nehmen, eine Brücke zwischen RX und TX machen, am Hterm was eingeben, es sollte als Echo zurück kommen.
Wenn das klappt kannst du dich auf den Mega16 konzentrieren.
Auf deinem Plan hast du Pin 15 und 16 nicht beschaltet.
Woher hast du in deinem Programm UBRR_VALUE; ?

sternst
20.02.2012, 12:14
Woher hast du in deinem Programm UBRR_VALUE; ?
#include <util/setbaud.h>

tbasnoopy
20.02.2012, 15:25
Hast du es denn schon einmal Testweise mit einer niedrigeren Baud versucht?
So unter 10000.
Ich habe alle Baudraten die im HTerm angegeben sind ausprobiert - sogar die schon rein rechnerisch nicht gehen. Interessanter weise bekam ich nur bei rel. hohen Baudraten ueberhaupt eine Ausgabe in HTerm


Bei den AVRs ist standardmäßig der interne 8-fach Taktteiler aktiviert. Hast du den auch abgeschaltet?
welchen 8-Fach teiler meinst du? UBRR? der wird durch -siehe Beitrag sternst- berechnet und durch uart_init( uint baudrate ) gesetzt.


Wenn du deinen Mega16 steckbar hast, dann heraus nehmen, eine Brücke zwischen RX und TX machen, am Hterm was eingeben, es sollte als Echo zurück kommen.
Das mit der Bruecke probiere ich gleich mal aus.


Auf deinem Plan hast du Pin 15 und 16 nicht beschaltet.
Der MAX ist beschalten (siehe Anhang)

sternst
20.02.2012, 15:41
welchen 8-Fach teiler meinst du?Er meint damit die Fuse CKDIV8, die dein ATmega16 aber gar nicht hat.

masasibe
20.02.2012, 17:41
Er meint damit die Fuse CKDIV8, die dein ATmega16 aber gar nicht hat.

Oh du hast Recht! Ich sehe gerade, dass der ATmega16 den CKDIV8 wirklich nicht hat.
Das habe ich dann mit dem ATmega48 verwechselt, den ich so gerne verwende. ;-)

mfg masasibe

tbasnoopy
20.02.2012, 20:29
Ahhh okay.


Ich habe die Pins 15 u. 14 des ATmegas ueberbrueckt (nachdem ich ihn rausgezogen habe). Aber wenn ich mit HTerm was schicke kommt nichts zurueck. Habe auch Strom auf die Platine gegeben aber keine Reaktion.

Wenn ich mein Kabel welches ich auf die Platte stecke ueberbruecke funktioniert es. Also liegt mein Problem irgendwo auf der Platine. Wahrscheinlich sogar schon beim MAX232. Ich mess jetzt mal alle Kontakte durch und suche den Fehler. Glaube inzwischen das ich den Mega "richtig" programmiert habe aber die "Verloetung" nicht stimmt.

Kampi
20.02.2012, 20:44
Ahhh okay.


Ich habe die Pins 15 u. 14 des ATmegas ueberbrueckt (nachdem ich ihn rausgezogen habe). Aber wenn ich mit HTerm was schicke kommt nichts zurueck. Habe auch Strom auf die Platine gegeben aber keine Reaktion.

Wenn ich mein Kabel welches ich auf die Platte stecke ueberbruecke funktioniert es. Also liegt mein Problem irgendwo auf der Platine. Wahrscheinlich sogar schon beim MAX232. Ich mess jetzt mal alle Kontakte durch und suche den Fehler. Glaube inzwischen das ich den Mega "richtig" programmiert habe aber die "Verloetung" nicht stimmt.

Sicher das du den Stecker auf der Platine richtig herum drauf hast? Wenn du ihn verdreht hast funktioniert die Kommunikation auch nicht.

tbasnoopy
20.02.2012, 20:54
Sicher das du den Stecker auf der Platine richtig herum drauf hast? Wenn du ihn verdreht hast funktioniert die Kommunikation auch nicht.


Sicher bin ich mir nicht aber ich habs jetzt mal umgepolt (also TX mit RX vertauscht) und beim Mega die Bruecke gesetzt. Und.... nichts -.-

tbasnoopy
20.02.2012, 21:45
Habe gerade noch beim testen einen Kondensator abgebrochen -.- den hab ich jetzt ausgetauscht und alles durchgetestet. Es scheint alles okay zu sein. Allerdings wenn ich die Pins ueberbruecke und mit hterm und einer Baudrate von 1200 etwas sende kommt nur sporadisch ein 0x00 zurueck. Also auch nicht fuer jedes Zeichen das ich sende sondern nur alle heilig zeiten.

So langsam glaube ich, dass der MAX kaputt ist oder grundsaetzlich falsch angeschlossen ist. Da ein Grundsaetzliches Anschlussproblem euch aufgefallen waere (und ich ja als Vorlage u.a. http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART benutzt habe) kann es nur noch an defekter Hardware liegen.

Gibt es eine Moeglichkeit den MAX232 auf Funktionsfaehigkeit zu testen?

ePyx
20.02.2012, 22:08
Kannst die Spannungen an den Ladekondensatoren messen. PIN2 sollte +10V und PIN6 -10V haben.

tbasnoopy
20.02.2012, 22:27
unglaublich!

Ich wechsel den MAX232 aus und ueberbruecke die Pins und es geht. Ich bau den Atmega mit dem testprog drauf - nix geht. Atmega runter, Leitung ueberbruecken - nix geht -.-

Kann man mit dem Atmega den MAX232 schiesen?

ePyx
20.02.2012, 22:29
Eigentlich nicht. Aber laut Datenblatt sollte man beim MAX232 auch nur Kondensatoren von 1µF verwenden. Nur bei einem MAX220 sollten 4,7 µF benutzt werden. Eventuell grillst du ihn dann, sobald etwas gesendet/empfangen wird.

tbasnoopy
20.02.2012, 22:52
Kannst die Spannungen an den Ladekondensatoren messen. PIN2 sollte +10V und PIN6 -10V haben.

Beim Durchmessen ist mir aufgefallen das meine Versorgungspannung nur schwankend 3-4V liefert. Anscheinend ist mein 5V Netzteil im Ar...

Mit neuem Netzteil geht es. Auch mit AVR.

vielen dank fuer eure Hilfe.

tbasnoopy
20.02.2012, 22:59
Eigentlich nicht. Aber laut Datenblatt sollte man beim MAX232 auch nur Kondensatoren von 1µF verwenden. Nur bei einem MAX220 sollten 4,7 µF benutzt werden. Eventuell grillst du ihn dann, sobald etwas gesendet/empfangen wird.

Ich hab iwo gelesen das von 1-47uF alles geht. Die 4,7uF hab ich irgendwo aus dem RN-Wiki. Jetzt wo ich mich intensiver mit dem Thema beschaeftigt habe sehe ich eigentlich auch immer nur 1uF. Macht aber wahrscheinlich nix *hoff*

ePyx
20.02.2012, 23:03
Das kommt darauf an, wie die Spannungsregler aufgebaut sind. Mir ist schon einmal ein MAX660 dahingeglitten, weil ich mich im Bauteilwert vertan hab.

Kampi
20.02.2012, 23:04
Ich hab iwo gelesen das von 1-47uF alles geht. Die 4,7uF hab ich irgendwo aus dem RN-Wiki. Jetzt wo ich mich intensiver mit dem Thema beschaeftigt habe sehe ich eigentlich auch immer nur 1uF. Macht aber wahrscheinlich nix *hoff*

Im Zweifelsfall hilft bei sowas immer ein Blick ins Datenblatt. Wobei ich auch nicht glaube das das IC bei zu großen Elkos kaputt gehen sollte.
Das einzigste was vielleicht auftreten kann ist das er die nicht geladen bekommt aber das er dadurch kaputt geht denke ich nicht :)
Aber ich lasse mich gerne eines besseren belehren :D
Probier es mal mit nem neuen Netzteil. Vielleicht klappt es ja dann. Und wenn nicht wird weiter geforscht :)

tbasnoopy
27.02.2012, 22:05
Probier es mal mit nem neuen Netzteil. Vielleicht klappt es ja dann. Und wenn nicht wird weiter geforscht :)

Ju geht ja schon ^^


Mit neuem Netzteil geht es. Auch mit AVR.