Hallo Könnt ihr mir helfen beim MAx232 hab ich jeweils 1 µF Kondensator und verwende ein Atmega 32 gesendet wirds über ponyprog
Was meinst du mit "gesendet wirds über ponyprog"? Du brauchst auf der PC Seite ein Terminalprogramm wie z.B. das Bray-Terminal, HTerm oder zur Not Hyperterminal... Wo hast du TX vom µC und RX vom PC miteinander verbunden? Ein Schaltplan deines Aufbaus wäre nicht schlecht. Aus main() kehrt man i.A. nicht zurück. Wenn der C-Startup-Code darauf nicht eingerichtet ist und z.B. keine eigene Endlosschleife vorsieht, rast dein µC direkt ins Nirvana. Die Schnittstelleneinstellung habe ich nicht geprüft, du wirst das sicher anhand des Datenblatts geschrieben haben. Nur zwei Sachen - läuft der AVR sicher mit 4 MHz und weisst du, dass man mit dem ungenauen internen RC-Oszillator auch Pech bei der genauen Baudratengenerierung haben kann? Hast du einen Oszi zur Überwachung der TX-Leitung bzw. eine einfache Low-Current-LED inkl. Vorwiderstand, die eine Sendetätigkeit auf TX zwischen C und MAX232 anzeigen kann?
In 2.jpg hast du einen 16 MHz Quarz extern drin. Mit 4 MHz im Programm wird das nix. Wo du RS232 angeschlossen hast, sehe ich auf die Schnelle nicht. Du wirst das gescheckt haben, ob diese Pins von UART bedient werden. In rs232.jpg ist C8 verkehrt gepolt eingezeichnet. Am V- ist die positivere Seite GND. Beim käuflichen Nullmodemkabel sind mehr Leitungen verknotet als man denkt. Ich bevorzuge es die TX/RX Dreherei unter eigener Kontrolle zu haben z.B. zwischen MAX232 und DB-Sub9 Female und dann mit einem 1:1 stinknormalen RS232 Kabel zu verbinden. PS: Die Bilder sind gruselig schlecht ;-)
Blöde Frage aber vielleicht hilft es, hast du die Masse verbunden zwischen PC und ATMEL?? Jochen_s www.rs485-hausbus.de.vu
Das sind mal die Files in PCAD 2001 TXD wird mit RXD pc verbunden RXD wird mit TXT pc verbunden
wenn ich das programm von avr programm atmega rauflade kummt etwas heraus low high low ein wenig verzerrt dargestellt (oszi) kann mit HTerm 0.6.5.b das file auslesen es kommt mal was raus aber mit baund 600 statt 9600 ?? komisch aber war gehts es nicht mit dem serial.c was ich schon gepostet habe
Das sieht so aus, als ob der µC mit 1 MHz rennt (9600/600 = 16). Zufällig ist das die Werkseinstellung des internen R-Oszillators. Hast du die Fuses auch auf die externe Taktquelle (Quarz) gebrannt (Obacht vorher schlau machen!!!)?
Das komische ist das nur \n\r richtig angezeigt wird ??? was kann das sein Ich muss den Reset drücken das etwas gesendet wird mfg Mathias
Ah, du hast jetzt den externen Quarz aussen vor gelassen und die gewünschte Baudrate auf den internen RC-Oszillator bezogen. Du willst 9600 Baud einstellen und fütterst das Baudratenregister mit dem Wert 6. Dieser Wert wird üblicherweise so berechnet (Atmega32 Datenblatt, Tabelle 60): Baudratenwert = Uarthaupttakt / (Baudrate * 16) - 1 1'000'000 / (9'600 * 16) - 1 = 5,51 Wenn du auf 6 aufrundest, machst du einen Fehler von -7.0% (Tabelle 68). Das ist für UART schon happig. Zum Vergleich: Für den Empfängermodus gibt Atmel einen "Recommended Max Receiver Error (%) von +- 2.0% vor (Tabelle 61)... Wie sieht es mit den Bits überhaupt aus? Leider hast du die ASCII-Darstellung im Empfangsprogramm gewählt, die BIN-Darstellung wäre jetzt hilfreicher. Das blau unterlegte a kann ich so nicht zuordnen. Gesendet wird "1". In HEX ist das 0x31 und in BIN 0b00110001. Empfangen wird "q". In HEX ist das 0x71 und in BIN 0b01110001. Verdammt nah dran... ich schätze mit einem besseren UART-Baudratenwert mit weniger Fehlanpassung wird das was. Ich würde zuerst mal eine Baudrate mit weniger Fehlanpassung versuchen und da springen 2400 und 4800 Baud sprichwörtlich ins Auge: 0,2% Fehler... Und höhere Baudraten dann später mit externem Quarz.
BTW. ich würde den µC mal auf "Dauerfeuer" einstellen:
1 | // Quellcode wir dein serial.c nur main() anders:
|
2 | |
3 | int main(void) |
4 | {
|
5 | unsigned char c; |
6 | |
7 | while(1) // für immer und ewig |
8 | {
|
9 | // Alle möglichen Bytes inkl. solche mit gesetztem 8. Bit
|
10 | for (c = 0; c <= 255; c++) |
11 | // Alternative z.B. nur Grossbuchstaben
|
12 | // for (c = 'A'; c <= 'Z'; c++)
|
13 | {
|
14 | uart_putc(c); |
15 | }
|
16 | }
|
17 | |
18 | return 0; // wird nie erreicht |
19 | }
|
> Verdammt nah dran... ich schätze mit einem besseren UART-Baudratenwert > mit weniger Fehlanpassung wird das was. > Ich würde zuerst mal eine Baudrate mit weniger Fehlanpassung versuchen > und da springen 2400 und 4800 Baud sprichwörtlich ins Auge: 0,2% > Fehler... Und höhere Baudraten dann später mit externem Quarz. Der interen RC-Oszillator ist für solide UART Kommunikation viel zu ungenau! Also gleich nen Quarz benutzten (FUSE-Bits), dann klappts auch mit dem UART ohne Baudratenquarz. MfG Falk
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.