Forum: Mikrocontroller und Digitale Elektronik Atmega644 UART empfangen funktioniert nicht


von robotxy (Gast)


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

von robotxy (Gast)


Lesenswert?

Keiner eine Idee?
Gruß,
Rasmus

von gast2 (Gast)


Lesenswert?

Schau nochmal in zeile 25 bis 29 des Codes nach, ich glaub da stimmt was 
nicht!

von Dietmar E (Gast)


Lesenswert?

Externes Quarz?

von robotxy (Gast)


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

von robotxy (Gast)


Lesenswert?

Keiner eine Idee, woran es liegen könnte? RS232 Empfang sollte ja 
eigentlich mit dem Atmega644 funktionieren, oder?
Gruß,
Rasmus

von sechszweifuenf (Gast)


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.

von Dietmar E (Gast)


Lesenswert?

> 20000000

Das ist keine Baudratenquarz, vieleicht liegt es daran? Das nächste 
Baudratenquarz wäre 18,432000 MHz

von robotxy (Gast)


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

von Dietmar E (Gast)


Lesenswert?

> Hmm, hab mal einen Quarz der Baudratengerecht ist eingesetzt - ohne
Erfolg

Hast Du auch den Sourecode angepasst?

von robotxy (Gast)


Lesenswert?

Jap

von roland (Gast)


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 );
}

von roland (Gast)


Lesenswert?

Hatte ich vergessen zu erwähnen. Bei meiner Anwendung läuft der UART mit 
16 MHz externem Quarz..
Gruß
Roland

von Falk B. (falk)


Lesenswert?

@  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

von robotxy (Gast)


Lesenswert?

Ja, die Fuses sind alle gesetzt, der Controller läuft ja auch und 
sendet.
Das gepostet Codebeispiel werde ich nacher mal ausprobieren.
Gruß,
Rasmus

von robotxy (Gast)


Lesenswert?

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

von Dietmar E (Gast)


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"?

von Dietmar E (Gast)


Lesenswert?

> Stell doch mal Deine Hex-Files (32 und 644) zur Verfügung

Und Sourcecodes.

von Dietmar E (Gast)


Lesenswert?

> Und Sourcecodes

Vergiss es, sehe gerade oben, dass Du dich mit BASIC quälst.

von eProfi (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.