Problem: C - Programm von ATmega8 --> ATmega644

OP #2448088
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 );
  }
}
#2448459
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)

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