Atmega644 UART empfangen funktioniert nicht

Gast #708202
Lesenswert?
• ▲
▼
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
Gast #709768
Lesenswert?
• ▲
▼
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
Gast #710603
Lesenswert?
• ▲
▼
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.
Gast #712559
Lesenswert?
• ▲
▼
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
Gast #712782
Lesenswert?
• ▲
▼
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 );
}
Gast #713299
Lesenswert?
• ▲
▼
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"?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren