Hallo, Ich habe den Code von mikrocontroller.net ausprobiert, aber bei der Seriellen Schnittstelle tut sich nichts. Es wird ein Atmega16 verwendet!! Könnte mir jemand bei diesem Problem helfen? Lg Resic Bekit
> Es wird ein Atmega16 verwendet!! >> /* UART-Init beim AT90S2313 */ Wenn es schon so los geht :) Probier es es damit:
1 | int main(void) |
2 | {
|
3 | UCSRB |= (1<<TXEN); // UART TX einschalten |
4 | UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1 |
5 | |
6 | UBRRH = UBRR_VAL >> 8; |
7 | UBRRL = UBRR_VAL & 0xFF; |
8 | |
9 | while(1) |
10 | {
|
11 | while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */ |
12 | {
|
13 | }
|
14 | UDR = 'x'; |
15 | }
|
16 | }
|
Außerdem, hast Du im Projekt den richtigen Prozessor und Taktfrequenz eingestellt sonst passt da gar nichts. Gruß Tom
Dieser Code müsste eigentlich mit dem Atmega16 funktionieren!! #include <stdio.h> #include <string.h> #include <avr/io.h> #ifndef F_CPU #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000" #define F_CPU 4000000UL // Systemtakt in Hz - Definition als unsigned long beachten // Ohne ergeben sich unten Fehler in der Berechnung #endif #define BAUD 9600UL // Baudrate // Berechnungen #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler. #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010)) //#error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! #endif
Bei dem Code in Beitrag "Re: Uart_atmega16" sieht man nicht, ob die Fehler aus Beitrag "Uart_atmega16" mit Hilfe des Listings aus Beitrag "Re: Uart_atmega16" verbessert wurden und ob die Anregungen zur Kontrolle der Projekteinstellungen aus Beitrag "Re: Uart_atmega16" berücksichtigt wurden. Ansonsten gibt es eine AVR Checkliste zum Abarbeiten sonstiger Fehlerquellen: http://www.mikrocontroller.net/articles/AVR_Checkliste#UART.2FUSART
Bekir Resic schrieb:
> Dieser Code müsste eigentlich mit dem Atmega16 funktionieren!!
Welcher Code?
Das was du zeigst, sind ein paar #define
aber den interessanten Teil, den tatsächlich arbeitenden Code, zeigst du
nicht.
Und solange du das hier
1 | while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */ |
2 | { UDR = 'x'; |
3 | }
|
nicht korrigierst, wird sich da auch weiterhin nichts tun.
Rede nicht das/die Tutorials schlecht! Im AVR-Tutorial in der Unterseite zum UART wird der Assemblercode angezeigt, kein C-Code! Im AVR-GCC-Tutorial/Der UART wird C-Code angezeigt. Und das Senden einzelner Zeichen ist unter http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART#Senden_einzelner_Zeichen gezeigt. Und dort ist nicht der Fehler drin, den du in deinem Quelltext hast. Beratungsresistent. Ich bin raus.
Bekir Resic schrieb:
> das Main ist oben schon angeführt worden!!
Wo?
Im Eröffnungsposting?
Dann lass dir zum x-ten mal gesagt sein, dass du hier
1 | while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */ |
2 | { UDR = 'x'; |
3 | }
|
falsch abgeschrieben hast. Der Code im Tuorial macht Warte bis das Senderegister frei ist Sende das Zeichen Dein Code macht Solange das Senderegister nicht frei ist Versuch zu senden. Man kanns auch etwas anders ausdrücken: Dein Handbuch verlangt von dir zu warten bis die Tür offen ist, ehe du durchgehst. Du hingegen willst nur dann durch die Tür durchgehen, solange sie geschlossen ist. Da darfst du dich nicht wundern, wenns weh tut, auch wenn dein Handbuch was anderes sagt.
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.