Ich habe ein Problem und zwar kann ich mit dem atmega324p kein UART programmieren bzw. ich habe es noch nicht hingekriegt. Im Anhang ist mein Programmcode. Kann mir jemand sagen, was ich falsch programmiert habe. Ich will mit der Baudrate von 9600 senden und empfangen. Mit freundlichen Grüssen Reiner Zufall
wozu U2X0? Überleg Dir mal eine genauere Fehlerbeschreibung als wie 'geht nicht'. Dann geh [1] durch. HTH [1] http://www.mikrocontroller.net/articles/AVR_Checkliste#UART.2FUSART
>Ich möchte keine Interrupts programmieren. >schade Blockierend mit dem Uart zu arbeiten ist weder uebersichtlich noch vernuenftig debugbar.
Reiner Zufall schrieb: > Ich will mit der Baudrate von 9600 senden und empfangen. Das ist bei einer seriellen Datenübertragung aber nicht die ganze Wahrheit. Was ist mit: Anzahl Datenbits, Parity, Anzahl Stopbits? Dann in deiner .c : Am Anfang:
1 | void uart_init(void) |
2 | { |
3 | //UCSR0A=0; //Register UCSR0A auf Null setzten |
4 | //UCSR0B=0; //Register UCSR0B auf Null setzten |
5 | //UCSR0C=0; //Register UCSR0C auf Null setzten |
6 | UBRR0H = (unsigned char)0; //Baudrate setzten |
7 | UBRR0L = (unsigned char)129; //Baudrate setzten |
8 | UCSR0C |= 0x86; //8 Bit Datentransfer |
9 | UCSR0B = (1<<RXEN0)|(1<<TXEN0); //RxD0 & TxD0 aktivieren |
10 | UCSR0A |= (1<<U2X0); //Doublespeed aktivieren |
11 | } |
und am Ende nochmal?:
1 | void set_baudrate(void) |
2 | { |
3 | UCSR0B = 0x00; //Setzt Register UCSR0B auf Null |
4 | UBRR0H = ((((((long)MCU_CLOCK)*2)/(8*((long)1000000))+1)/2-1)>>8)&0xff;//Baudrate setzten |
5 | UBRR0L = (((((long)MCU_CLOCK)*2)/(8*((long)1000000))+1)/2-1)&0xff;//Baudrate setzten |
6 | UCSR0B = (1<<RXEN0)|(1<<TXEN0); //RxD0 & TxD0 aktivieren |
7 | UCSR0C = (1<<UCSZ00)|(1<<UCSZ01); //8 Bit Datentransfer |
8 | UCSR0A |= (1<<U2X0); //Doublespeed aktivieren |
9 | } |
und ich seh gerade: void vnc1l_init(void) Wollte der vnc1l nicht 9 bits sehen?
Eigentlich ist U2X0 auf eins. Ich habe zwei UART-Eingänge. Ich muss zuerst mit dem Computer über rs232 kommunizeren können bis ich mit dem vnc1l weiterfahre. void set_baudrate(void) { UCSR0B = 0x00; //Setzt Register UCSR0B auf Null UBRR0H = ((((((long)MCU_CLOCK)*2)/(8*((long)1000000))+1)/2-1)>>8)&0xff;//Baudrate setzten UBRR0L = (((((long)MCU_CLOCK)*2)/(8*((long)1000000))+1)/2-1)&0xff;//Baudrate setzten UCSR0B = (1<<RXEN0)|(1<<TXEN0); //RxD0 & TxD0 aktivieren UCSR0C = (1<<UCSZ00)|(1<<UCSZ01); //8 Bit Datentransfer UCSR0A |= (1<<U2X0); //Doublespeed aktivieren } Dieser Programmcode wäre für später. Habe ihn von irgendwo abgeschrieben.
> Eigentlich ist U2X0 auf eins.
..ich stelle die Frage anders: Warum setzt du U2X0? Die 129 in
uart_init() güldet für normale Geschwindigkeit.
Und ich wiederhole die andere: Wie lautet eine ∗genaue∗
Fehlerbeschreibung?
Und eine füg ich noch hinzu: Was ist das Ergebnis aus der
UART-Checkliste?
HTH
Ich kann weder daten senden, noch daten empfangen weil es bei der übertragung immer einen Fehler gibt.
> weil es bei der übertragung immer einen Fehler gibt
? Was für einen? Woran erkennst du ihn? Was sollte passieren? Was
passiert stattdessen? Was hast Du schon alles probiert? Warum hast Du
das, was Du probiert hast, probiert? Warum hat es nicht funktioniert?
Woran hast Du erkannt, dass es nicht funktioniert hat?
Gibt Dir doch bitte mal ein bisschen mehr Mühe.
Einen Fehler ???? Der erste Schritt ist jeweils vom Controller mit einem Timer einen Buchstaben zu senden, zB 0xC5, und dann mit dem Scope zu pruefen, ob der auch rauskommt. Wenn der rauskommt, dann den Tx auf den Rx und pruefen ob der auch das 0xC5 empfaengt. Dann den PC anschliessen. Wenn der Muell bringt ist die Baudrate nicht genau genug. usw.
Wenn ich das Ausgangssignal wieder in den Eingang vom uC leite, empfängt er das richtige Zeichen. Es kommt also etwas auf dem uC und der uC kann auch etwas empfange. Ich kann aber vom PC aus nichts senden oder empfangen, ohne eine Fehler.
Lieber Reiner du hattest 1,2 Fehler drin ich weiss nicht wo du programieren gelernt hast... DIESER CODE GEHT void set_baudrate(void) { UCSR0B = 0x00; //Setzt Register UCSR0B auf Null UBRR0H = ((((((long)MCU_CLOCK)*2)/(8*((long)1000000))+1)/2-1)>>8)&0xff;//Baudrate setzten UBRR0L = (((((long)MCU_CLOCK)*2)/(8*((long)1000000))+1)/2-1)&0xff;//Baudrate setzten UCSR0B = (1<<RXEN0)|(1<<TXEN0); //RxD0 & TxD0 aktivieren UCSR0C = (1<<UCSZ00)|(1<<UCSZ01); //8 Bit Datentransfer UCSR0A |= (1<<U2X0); //Doublespeed aktivieren }
Reini Breite Dieser Code brauche ich erst später. Ausserdem ist dieser Code von mir kopiert!
Meine Kommunikation zwischen dem PC und dem uC gibt mysteriöse Zeichen aus. Wenn ich vom PC aus ein Signal sende und dieses vom uC wieder zurücksende bekomme ich völlig andere Zeichen zurück. Wenn ich nur vom uC über eine Tastatur die Zeichen einlese und diese dann dem PC sende, gibt es auch Fehler, weil das Zeichen nicht korrekt übertragen wird.
> mysteriöse Zeichen mach endlich mal [1] durch. HTH und nix für ungut. [1] http://www.mikrocontroller.net/articles/AVR_Checkliste#UART.2FUSART
Ich glaube ich habe meinen Fehler gefunden, ich weiss allerdings nicht wie ich ihn beheben kann. Ich benutze den Atmega324p und einen externen Oszillator mit 20MHz. Ich vermute, dass ich bei der Taktfrequenz etwas falsch gemacht habe. Ausserdem weis ich nicht ob ich eine Fuse clkdiv habe und ob ich diese richtig eingestellt habe. Ich habe einen aufbau gemacht, wo ein LED im Sekundentakt blinken soll, die LED blinkt aber viel langsamer. Vielleicht liegt das Problem beim aufbau auf der Lochplatte aber ich glaube eher, dass ich die Taktfrequenz falsch eingestellt habe.
und wieviel langsamer ist das? und wenn das zu schwer ist, dann compiliere den blinkcode soooolange mit unterschiedlichen FCPU bis der Blinktakt stimmt. 1,2,4,5,8,10Mhz könnten mögliche frequenzen sein.
Wenn ich die Taktfrequenz zwischen 2.5-2.6 MHz einstelle, ist es ungefähr eine Sekunde. Habe ich bei den Fuses etwas falsches eingestellt oder ist der Oszillator defekt?
Wie kann man den ISP ansteuern und was sind die unterschiede zwischen uart und isp?
hallo reini ich bin noch ein anfänger im programmieren und bin im zweiten lehrjahr als Elektroniker... Kann mir jemand erklären was ISP ist? Liebe Grüsse cédi51 [www.display-magazin.ch/ REINSCHAUEN UND ABONIEREN]
1. man kapert keine Threads für neue Fragen 2. es gibt ein Tutorial 3. eigene Reklame macht man nicht ohne die Betreiber zu fragen
> Wenn ich die Taktfrequenz zwischen 2.5-2.6 MHz einstelle, ist es > ungefähr eine Sekunde. Klingt verdächtig nach CKDIV8 (-> Datenplatt lesen, CKDIV8 löschen). Hättest Du übrigens gestern ab 10:17 Uhr schon feststellen können wenn Du die bereits da verlinkte Checkliste durchgegangen wärst. Nix für ungut
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.