ATmega16 UART sendet keine Daten

Gast #4350275
Lesenswert?

Hallo liebes Forum,
ich versuche gerade eine Verbindung zwischen meinem ATmega16 und meinem 
PC aufzubauen. Das Problem ist, dass mein µC keine Daten an meinen PC 
sendet. HTERM zeigt nichts an. Der µC läuft mit einem 14.7456 MHz 
Quartz. In AVR Studio hab ich EXTHIFXTALRES_16KCK_64MS eingestellt. Die 
Werte für UBRR habe ich dem Datenblatt entnommen. Hat jemand eine Ahnung 
warum der Code nicht funktioniert?
1
int main(void)
2
{
3
  UBRRH = 0;
4
  UBRRL = 95;
5
  UCSRB = (1<<RXEN) | (1<<TXEN); //Schreiben und lesen aktivieren
6
  UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0); //8 bit Übertragung
7
  
8
    while (1) 
9
    {
10
    while (!(UCSRA & (1<<UDRE)));
11
    UDR = 'd';
12
    }
13
  return 0;
14
}

Grüße
Bibub
Gast #4350332
Lesenswert?

Wenn ich RXD und TXD beim FTDI brücke empfängt er immer direkt das 
zeichen, das ich gesendet habe. Beim AVR habe ich auch mal RXD und TXD 
gebrückt und das Ergebnis aus dem Empfangsschritt auf einen PORT legen 
lassen. Das Programm kommt anscheinend gar nicht zu Empfangen bzw. er 
erkennt nicht, dass etwas gesendet wurde
#4351700
Lesenswert?

Der Code oben ist auf jeden Fall in Ordnung, es muss an was anderem 
liegen. Wie ja schon gesagt wurde: Wenn der TX Pin nix macht dann ist 
der Atmega wahrscheinlich erst gar nicht angelaufen. Fuses für den 
Oszilator sind richtig gesetzt? Vor allem auch geschrieben und nicht nur 
im Studio eingestellt? So ein ähnliches Problem hatte letzt ein Freund, 
der hat sich quasi tot gesucht. Er hatte schlicht "vergessen" die Fuses 
auch zu schreiben.
#4351765
Lesenswert?

Ich habe dein Beispiel auf einen ATmega32L gepackt. Der hat einen 
externen 7,3728 MHz Quarz, womit sich dann genau UBRRL = 95 für 4800 
Baud ergibt.

Ergebnis: läuft ohne Abänderung. Überlastet aber wie immer Windows und 
den Eigangspuffer. Das Terminal hängt sich auf (bei 4800 Baud!).

Also sind zwei Zeilen zum Drosseln hinzu gekommen.

[c]
#include <avr/io.h>

int main(void)
{
  uint16_t  i;

  UBRRH = 0;
  UBRRL = 95;
  UCSRB = (1<<RXEN) | (1<<TXEN); //Schreiben und lesen aktivieren
  UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0); //8 bit Übertragung

    while (1)
    {
    while (!(UCSRA & (1<<UDRE)));
    UDR = 'd';

    i = 0;
    while (i < 50000) { i++; }

    }
  return 0;
}
Gast #4352456
Lesenswert?

Felix A. schrieb:

> Ergebnis: läuft ohne Abänderung. Überlastet aber wie immer Windows und
> den Eigangspuffer. Das Terminal hängt sich auf (bei 4800 Baud!).

Also an Windows liegt das garantiert nicht.

Mit 115200 ist jedenfalls völlig problemlos Vollduplex-Kommunikation mit 
(nahezu) konstanter theoretischer Maximal-Nettorate möglich. Man muß 
halt bloß die Sende- und Empfangspuffer groß genug machen, daß auch eine 
20ms-Auszeit des Sende- und/oder Empfangsthreads nicht gleich die 
Datenströme abreißen läßt.

Und früher(tm), als ich noch eine entsprechende UART in meinem Rechner 
hatte, ging das auch mit 921600. Auch unter Windows. Und damals waren 
die CPUs weitaus langsamer...

Fazit: Man muß einfach bloß richtig programmieren können und sein OS 
beherrschen, dann klappt das schon.
Gast #4352990
Lesenswert?

Okay ich habs endlich hin gebracht etwas zu senden. Der Grund war, dass 
der Anschluss des ISPs nicht nach Standard sonder willkürlich belegt 
war. Alles war gleich, außer das PD1 auch noch außen auf GND geführt 
wurde. Ich kann jetzt Daten senden aber es kommt nur unfung an. Anstallt 
0x04 bekomme ich z.B. 0xDF

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