mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMega162 USART0 läuft nur mit halber Geschwindigkeit?


Autor: Verzweifelt... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Ich habe ein Problem mit meinem ATMega162.
Ich will mit USART0 Zeichen zwischen dem PC und dem Atmel austauschen,
aber das kommt nur Müll zurück.
Der Atmel läuft mit 16MHz mit einem externen Quarz.
Hier mein Code:

#define F_CPU   16000000
#include <avr/io.h>

#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN2 (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
#define baud (F_CPU/(9600*16L))-1
// 9600bit/s, 1stop, even parity
UCSR0A=0x00;
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
UCSR0C = (1<<URSEL0)|(1<<UPM10)|(1<<UCSZ10)|(1<<UCSZ00);

UBRR0H=0x00;
UBRR0L=0x67;

char ugetchar(void) {
  char status,data;
  while (((status=UCSR0A) & RX_COMPLETE)==0);
  data = UDR0;
  if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN2))==0) {
    return data;
  }
  return 0;
}

void uputchar(char c) {
  while ((UCSR0A & DATA_REGISTER_EMPTY)==0);
  UDR0 = c;
}

int16_t main(void)
{
while(1) {
    uputchar(ugetchar());
    //uputchar(2);
  }
}



Wenn ich mitm Oszi nachmesse kriege ich aber ca. 4400 bit/s. Wenn ich
im Terminal 4800 bit/s kommen die Zeichen fast richtig zurück.
Was mache ich falsch???

Autor: Michael Wolf (mictronics) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probiers mal hiermit:

#define BAUD_RATE    9600
#define BAUD_RATE    16000000UL

UBRR0H = (((MCU_XTAL / BAUD_RATE) / 16) - 1) >> 8;  // set baud rate
UBRR0L = (((MCU_XTAL / BAUD_RATE) / 16) - 1);

UCSR0B = (1 << RXEN1) | (1 << TXEN1);  // enable Rx & Tx, enable

UCSR0C = (1 << UCSZ11) | (1 << UCSZ10);  // config 8N1

Der Code ist getestet und funktioniert. Must du ändern auf 8E1 wenn
gewünscht.
Die Bitnamen und Registernamen müssen ggf. angepasst werden, der Code
ist für mega128.


Und warum definierst du die ganzen Bitnamen neu?

/Michael

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne mich mit dem Code befasst zu haben:
Schau mal nach, ob du die richtige Fuse für den externen Takt gesetzt
hast.

Gruß,
Jens

Autor: Verzweifelt... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dank euch für die Antworten!
Ich dachte heute morgen, dass ich verrückt bin.
Schalte den Atmel ein und - es geht!!

Was wars?
Wenn ich den Programmieradapter aufstecke kommt Müll raus, sonst
klappts.
Muss man nicht verstehen, oder?
Ich hab nen ISP Adapter und die ISP Pins sind an nem ganz anderen
Port.
Naja, es geht. seufz.

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.