Forum: Mikrocontroller und Digitale Elektronik Problem: C - Programm von ATmega8 --> ATmega644


von Sepp H. (vali1991)


Lesenswert?

Hallo, habe hier ein funktionierendes ATmega8 Programm, welches lauter 
'x' ausgibt. Wollte es umschreiben auf den ATmega644, habe die Register 
laut Datenblatt geändert, jedoch funktioniert die Übertragung nicht 
mehr. Woran könnte es liegen?



ATmega644:

#include <avr/io.h>

#define F_CPU 3686400
#define BAUD 9600
#define UBRR_VAL = ((3686400/(9600*16))-1)

void uart_init(void) {
    UBRR0H = 0x00;
  UBRR0L = 0x17;


    UCSR0B |= (1<<TXEN0);  // UART TX einschalten
    UCSR0C = (1<<UMSEL00)|(1<<UCSZ01)|(1<<UCSZ00);  // Synchron 8N1
}

int main(void) {
  uart_init();
  while(1){
  while (!(UCSR0A & (1<<UDRE0))) {  // warten bis Senden moeglich
  }
    UDR0 = 'x';
  //_delay_ms( 10 );
  }
}




ATmega8:

#include <avr/io.h>

#define F_CPU 3686400
#define BAUD 9600
#define UBRR_VAL = ((3686400/(9600*16))-1)

void uart_init(void) {
    UBRRH = 0x00;
  UBRRL = 0x17;


    UCSRB |= (1<<TXEN);  // UART TX einschalten
    UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);  // Asynchron 8N1
}

int main(void) {
  uart_init();
  while(1){
  while (!(UCSRA & (1<<UDRE))) {  // warten bis Senden moeglich
  }
    UDR = 'x';
  //_delay_ms( 10 );
  }
}

von holger (Gast)


Lesenswert?

>    UCSR0C = (1<<UMSEL00)|(1<<UCSZ01)|(1<<UCSZ00);  // Synchron 8N1

Synchron ist was anderes als asynchron.
Lass das UMSELxx einfach weg.

von Thomas F. (igel)


Lesenswert?

Oben schreibst du:

    UCSR0B |= (1<<TXEN0);  // UART TX einschalten

und weiter unten:

   UCSRB |= (1<<TXEN);  // UART TX einschalten


Evtl. mag das der Compiler nicht.

von linuxi (Gast)


Lesenswert?

Probiert mal beim fcpu define nach der zahl noch ul dazu geben... Hat 
bei mir damals das Problem gelöst!

von Sepp H. (vali1991)


Lesenswert?

Danke für die Tipps, bekomme aber noch immer lauter wires zeugs: 
x<\0>x<\0>8<\0>8<\0>8<\0>x<\0>x<\0>8<\0>8<\0>x<\0>x<\0>8<\0>8<\0>x<\0>x< 
\0>x<\0>8<\0>8<\0>8<\0>8<\0>8<\0>

Sollte ja eigentlich nur: xxxxxxxxxxxxxxxxxxxxxxxxxxx ausgeben

von Karl H. (kbuchegg)


Lesenswert?

Wirres Zeug ist ein starkes Indiz dafür, dass die Baudrate nicht stimmt.
Und die wiederrum hängt von der effektiven µC-Taktfrequenz und dem 
UART-Baudratenteiler in UBRRH/UBRRL ab. Wie man die effektive 
Taktfrequenz zumindest genau genug für UART Zwecke bestimmen kann, weißt 
du ja seit gestern.

(Den Fehler, dass du den Empfänger auf eine laufende pausenlose 
Übertragung aufschaltest, wirst du ja kein 2-tes mal gemacht haben)

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.