Hey, ich programmiere gerade einen Atmega644 in C. über UART senden geht, empfangen jedoch nicht. Ich habe das ganze auch mit BASCOM versucht, ebenfalls erfolgslos. Als ich dann einen Atmega32 eingesetzt habe (der Pingleich ist), gings auf einmal (Hab nur Frequenz und definitionsdatei in Bascom geändert). Woran liegt das und wieso geht das mit dem Atmega644 nicht? Gruß, Rasmus
Schau nochmal in zeile 25 bis 29 des Codes nach, ich glaub da stimmt was nicht!
Das ist der Code
1 | $regfile = "m644def.dat" 'bzw "m32def.dat" |
2 | $crystal = 20000000 'bzw $crystal = 16000000 |
3 | $baud = 9600 |
4 | Dim A As Byte , S As String * 20 |
5 | On Urxc Getrs |
6 | Enable Urxc |
7 | Enable Interrupts |
8 | Do |
9 | Print "hallo" |
10 | Waitms 500 |
11 | Loop |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | Getrs: ' |
18 | S = Inkey() |
19 | If Len(s) > 0 Then |
20 | Print S |
21 | End If |
22 | Return |
23 | |
24 | End |
Ich baue jeweils den Quarz um (von 16 Mhz auf 20 Mhz). Er sendet auch alle 0,5Sekunden Hallo. Gruß, Rasmus
Keiner eine Idee, woran es liegen könnte? RS232 Empfang sollte ja eigentlich mit dem Atmega644 funktionieren, oder? Gruß, Rasmus
Die normale Vorgehensweise ist zuerst ein Zeichen zu senden und mit dem Scope zu kontollieren. Dann kann man sich ans Empfangen machen. Wobei natuerlich das vom PC geschickte Zeichen auch auf dem Scope kontrolliert werden muss.
> 20000000
Das ist keine Baudratenquarz, vieleicht liegt es daran? Das nächste
Baudratenquarz wäre 18,432000 MHz
Hmm, hab mal einen Quarz der Baudratengerecht ist eingesetzt - ohne Erfolg. Das merkwürdige ist ja das es mit der gleicehn Schaltung mit dem Atmega32 funzt. Es muss also was grundsätzliches sein was bei dem (neueren) Atmega644 anders ist. Hat einer eine Idee? Gruß, Rasmus
> Hmm, hab mal einen Quarz der Baudratengerecht ist eingesetzt - ohne
Erfolg
Hast Du auch den Sourecode angepasst?
Anbei die funktionierende Initialisierung des Atmega644 UART, direkt aus meinem Projekt. Ist eigentlich nichts spezielles zu beachten. Gruß Roland // Version fuer ATmega644 #define baudrate 38400UL void uart0_init(void) { #if F_CPU <= 1000000UL // Slow system clock, double Baud rate to improve rate error. UCSR0A = (1<<U2X0); UBRR0H = (uint8_t) ((F_CPU / (8 * baudrate)) - 1)>>8; UBRR0L = (uint8_t) (F_CPU / (8 * baudrate)) - 1; #else UBRR0H=(uint8_t)((F_CPU / (16 * baudrate)) - 1)>>8; UBRR0L=(uint8_t)(F_CPU / (16 * baudrate)) - 1; #endif UCSR0C = (1<<UCSZ01) | (1<<UCSZ00); // Asynchron 8N1 UCSR0B = (1<<TXEN0) | (1<<RXEN0); // tx & rx enable } void uart0_putchar( char c ) { loop_until_bit_is_set( UCSR0A, UDRE0 ); UDR0 = c; } char uart0_getchar( void ) { loop_until_bit_is_set( UCSR0A, RXC0 ); return( UDR0 ); }
Hatte ich vergessen zu erwähnen. Bei meiner Anwendung läuft der UART mit 16 MHz externem Quarz.. Gruß Roland
@ robotxy (Gast) >Hmm, hab mal einen Quarz der Baudratengerecht ist eingesetzt - ohne >Erfolg. Du musst auch die AVR Fuses setzen! http://www.mikrocontroller.net/articles/AVR_Checkliste#UART.2FUSART MFG Falk
Ja, die Fuses sind alle gesetzt, der Controller läuft ja auch und sendet. Das gepostet Codebeispiel werde ich nacher mal ausprobieren. Gruß, Rasmus
So, habs probiert - ohne Erfolg. Das ist echt komisch.. Wodran kann es denn liegen wenn es mit der gleichen Schaltung mit dem Atmega32 funktioniert?? Gruß, Rasmus
Hast du den relevanten Pin schon überprüft (als ganz normalen IO geschaltet)? Stell doch mal Deine Hex-Files (32 und 644) zur Verfügung, vieleicht stimmt damit etwas nicht. Vieleicht schwingt das Quarz in Deiner Schaltung nicht richtig. Sind die relevanten Fuses bei beiden CPUs korrekt eingestellt, Stichwort "rail-to-rail swing"?
> Stell doch mal Deine Hex-Files (32 und 644) zur Verfügung
Und Sourcecodes.
> Und Sourcecodes
Vergiss es, sehe gerade oben, dass Du dich mit BASIC quälst.
Einige der UART-Register haben beim 644 eine andere Bit-Belegung! Schau genau! Liefert die inkey-Funktion einen Char oder ein String zurück?
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.