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
intmain(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
die richtigen Pins verbunden?
Ansonsten das Signal mal mit dem Oszi anschauen, die übliche Fehlersuche
halt
Ach ja: dazwischen ist doch noch ein Wandler??
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
Hmm,
hilft dir jetzt nicht weiter, aber:
Dein Programm mit Copy/Paste kopiert, lediglich UBRRL angepasst, rennt
bei mir auf einem mega32 so wie gewollt.
Hast du mal getestet, ob dein Prozessor überhaupt losrennt? Dh. mal eine
LED blinken lassen oder irgendein Portbit klappern lassen und mit Oszi
angeguckt?
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.
Konrad S. schrieb:> Bibub schrieb:>> TXD bleibt auf 0V>> Das ist als Ruhepotenzial falsch! Such mal nach Kurzschluss.
Richtig aber das könnte auch darauf hindeuten, dass der Atmega nicht
anläuft. 0V ist nämlich als Initialisierungspotential korrekt ;)
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;
}
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.
Ich hab jetzt mal ein Blinklicht gebaut und die Fuses neu geschrieben.
Die LED flakert ohne Probleme. Das Programm wird also auch richtig
übertragen und ausgeführt
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
Bibub schrieb:> aber es kommt nur unfung an. Anstallt 0x04 bekomme ich z.B. 0xDF
Typische Fehler an dieser Stelle:
Falscher Takt eingestellt (falscher wert oder falsche Quelle)
Div8 Fuse gesetzt.
Baudrate falsch gesetzt...
Bibub schrieb:> Ich kann jetzt Daten senden aber es kommt nur unfung an. Anstallt> 0x04 bekomme ich z.B. 0xDF
Baudrate und/oder Übertragungsart (6, 7, 8, 9 bit Mode, 1/2 Stoppbits
usw.) falsch eingestellt.
Michael K. schrieb:> Baudrate und/oder Übertragungsart (6, 7, 8, 9 bit Mode, 1/2 Stoppbits> usw.) falsch eingestellt.
Die Stoppbits sind unschuldig, beim Empfangen reicht unabhängig von der
Einstellung ein Stoppbit.
Ich hab das Problem gefunden. Testweise hab ich einfach mal alles mit
nem MAX232 und einer echten RS232 Schnittstelle an einem alten PC
getestet. Alles hat perfekt geklappt. Ich vermute, dass der FTDI
irgendwie schrott ist
Bibub schrieb:> Ich hab das Problem gefunden. Testweise hab ich einfach mal alles mit> nem MAX232 und einer echten RS232 Schnittstelle an einem alten PC> getestet. Alles hat perfekt geklappt. Ich vermute, dass der FTDI> irgendwie schrott ist
Hm, da hätten wir lange raten können.