www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega644 UART empfangen funktioniert nicht


Autor: robotxy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: robotxy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keiner eine Idee?
Gruß,
Rasmus

Autor: gast2 (Gast)
Datum:

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

Autor: Dietmar E (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Externes Quarz?

Autor: robotxy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist der Code
$regfile = "m644def.dat"                                    'bzw "m32def.dat"
$crystal = 20000000                                         'bzw $crystal = 16000000
$baud = 9600
Dim A As Byte , S As String * 20
On Urxc Getrs
Enable Urxc
Enable Interrupts
Do
   Print "hallo"
   Waitms 500
Loop





Getrs:                                                      '
   S = Inkey()
   If Len(s) > 0 Then
      Print S
   End If
Return

End
Ich baue jeweils den Quarz um (von 16 Mhz auf 20 Mhz). Er sendet auch 
alle 0,5Sekunden Hallo.
Gruß,
Rasmus

Autor: robotxy (Gast)
Datum:

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

Autor: sechszweifuenf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dietmar E (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 20000000

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

Autor: robotxy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dietmar E (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Hmm, hab mal einen Quarz der Baudratengerecht ist eingesetzt - ohne
Erfolg

Hast Du auch den Sourecode angepasst?

Autor: robotxy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jap

Autor: roland (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 );
}

Autor: roland (Gast)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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_Checkl...

MFG
Falk

Autor: robotxy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: robotxy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dietmar E (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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"?

Autor: Dietmar E (Gast)
Datum:

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

Und Sourcecodes.

Autor: Dietmar E (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Und Sourcecodes

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

Autor: eProfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.