www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART mit STK500 und internem Quarz


Autor: Christian S. (kruemel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

bin noch bei meinen Anfängen mit uC Programmierung und habe mich unter 
anderem auch mit UART beschäftigt. Habe dazu einen C Code, mit dem ich 
versuchen möchte auf dem PC ein Zeichen zu empfangen. Dazu habe ich PD0 
an RX und PD1 an TX vom STK500 angeschlossen.

Da ich leider keinen externen Quarz habe, benutze ich den internen 
Oscillator mit 8Mhz 64ms.
Benutze einen Atmega8.

Ich habe gelesen, das ein externer Quarz besser ist, aber auch, das es 
mit dem internen funktionieren müsste. Ich habe noch einen 4MHZ externen 
Quarz hier liegen.

Frage dazu: Wieso funktioniert die Übertragung nicht? Habe das Kabel 
natürlich auch auf Spare gewechselt und im Hyperterminal 9600 Baud 
eingestellt, keine parität und mit sowohl 1 als auch 2 Stopbits 
ausprobiert. Empfange keine Zeichen.

Müssen noch andere Fuses gesetzt werden ?

#include <avr/io.h>
#include <avr/delay.h>

#define F_CPU 8000000L
#define BAUD 9600L

#define UBRR_VAL ((F_CPU+BAUD * 8)/(BAUD*16)-1)      //clever runde
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))         //reale Baudrate

#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000)      //Fehler in Promille

#if ((BAUD_ERROR>10)||(BAUD_ERROR<-10))
#error Systematischer Fehler in der Baudrate größer 1% und damit zu hoch!
#endif
 

int main(void)
{
   
   UBRRH = UBRR_VAL >> 8;
   UBRRL = UBRR_VAL & 0xFF;
   
   
   UCSRB = (1<<RXEN)|(1<<TXEN);            //UART TX einschalten
   UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);     //Asynchron 8N1
   
   

   while (!(UCSRA & (1<<UDRE)))            //warten bis Senden möglich
   {
   }   


   UDR = 'x';                             //schreibt das Zeichen x auf die Schnittstelle
   _delay_ms(100);


   return 0;                     
} 


Vielen Dank im vorraus
Viele Grüße

Christian

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian S. schrieb:

> Ich habe gelesen, das ein externer Quarz besser ist,

Besser ist er auf jeden Fall.
Allerdings ist das nicht dein Problem.
Du empfängst gar nichts. Wenn die Taktfrequenz etwas zuviel daneben 
liegt (wie es beim internen Oszillator schon sein kann), dann empfängst 
du was. Nur sind die Zeichen falsch. Aber kommen wird was.


> Frage dazu: Wieso funktioniert die Übertragung nicht? Habe das Kabel
> natürlich auch auf Spare gewechselt und im Hyperterminal 9600 Baud
> eingestellt, keine parität und mit sowohl 1 als auch 2 Stopbits
> ausprobiert. Empfange keine Zeichen.

http://www.mikrocontroller.net/articles/AVR_Checkl...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach mal eine Schleife um deine Ausgabe
int main()
{
   ....

  while( 1 ) {
    while (!(UCSRA & (1<<UDRE)))            //warten bis Senden möglich
    {
    }   

    UDR = 'x';                             //schreibt das Zeichen x auf die Schnittstelle
    _delay_ms(100);
  }
}


dann bewaffnest du dich mit einem Voltmeter oder einer Led und verfolgst 
das Sendesignal vom Prozessor bis zum Kabel.

Autor: Christian S. (kruemel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Schleife ist eingebaut,.

Betätige ich nun die Reset Taste, erscheint im Terminal bei jedem Druck 
eins dieser Zeichen:

~~~~~~~~~~~~~~~~~~~~~


Viele Grüße

Autor: Christian S. (kruemel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> http://www.mikrocontroller.net/articles/AVR_Checkl...

Hallo,

ich bin es nochmal.
Bin die Checkliste durchgegangen und es war alles so, wie in der 
Checkliste gefordert.

Jemand eine Idee woran es sonst noch liegen könnte?
Der C-Code ist okay?

Viele Grüße
und sry für den Doppelpost

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian S. schrieb:
> Frage dazu: Wieso funktioniert die Übertragung nicht?
Gegenfrage: was meinst du, was an deinem Problem so viel anders ist als 
an den anderen 10 RS232-Problemen, die allwöchentlich hier auftauchen?
Kurzum: hast du mal die Suche im Forum bemüht und die Beträge und die 
Antworten darauf duchgelesen und verstanden?

> Bin die Checkliste durchgegangen und es war alles so, wie in der
> Checkliste gefordert.
Du hast die gesamte Checkliste, insbesondere den Abschnitt 
Spannungsversorgung, Reset, Fusebits und Takterzeugung durch?

Was kommt bei dem Test mit der Taktfrequenz raus?
Wird das Programm laufen gelassen, muss die LED 1 Sekunde ein/1 Sekunde aus sein.

Es ist einfach so: wenn der uC nicht kaputt ist, dann funktioniert auch 
die serielle Schnittstelle.


> Der C-Code ist okay?
Welcher C-Code?

Autor: Christian S. (kruemel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ersteinmal danke für die Antwort.

Ich schaue hier nochmal im Forum weiter nach Problemen, die mit UART 
aufgetreten sind.

Den Taktfrequenztest habe ich nicht gemacht, da ich ersteinmal mit dem 
internen Oszilator Zeichen empfangen möchte, auch wenn es ungenau ist.

Mit C-Code meinte ich den von mir geposteten C-Code.

Zwei Fragen haben sich noch aufgetan:

Die beiden TX und RX Pins PD0 und PD1 muss ich jeweils als Aus bzw. als 
Eingang definieren, richtig?

Und: Das RS232 Programmierkabel vom STK500, ist das das richtige Kabel 
für die Verwendung am SPARE?

Viele Grüße
Christian

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Christian S. (kruemel)

>Den Taktfrequenztest habe ich nicht gemacht, da ich ersteinmal mit dem
>internen Oszilator Zeichen empfangen möchte, auch wenn es ungenau ist.

MÖÖÖÖÖP! Falsch!!!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian S. schrieb:

> Den Taktfrequenztest habe ich nicht gemacht, da ich ersteinmal mit dem
> internen Oszilator Zeichen empfangen möchte, auch wenn es ungenau ist.

Dann sei versichert, dass >95% aller UART Probleme darauf beruhen, dass 
der µC nicht mit der Taktfrequenz arbeitet, die der Programmierer zum 
Berechnen der Registerwerte herangezogen hat.
Ein paar Prozent entfallen noch auf nicht richtig ausgekreuzte Kabel und 
ein klitzekleiner Prozentsatz entfällt auf sonstiges.

Aber Hauptursache #1 ist die falsch angegebene Taktfrequenz

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian S. schrieb:


> Und: Das RS232 Programmierkabel vom STK500, ist das das richtige Kabel
> für die Verwendung am SPARE?


Ich denke du bist die Checkliste durchgegangen?
Dann hast du sicherlich auch den µC-raus-Brücke-rein Test gemacht und so 
die komplette Hardware der Übertragungsstrecke getestet.


Nochmal zurück auf Anfang:
Und wenn in der Checkliste ein Test vorgeschlagen wird, dann den auch 
machen und nicht einfach nur durchlesen.


(das du den internen Oszi benutzt anstelle eines QUarzes ist natürlich 
fatal. Dadurch kann es sein, dass dein PC ganz was anderes empfängt als 
du wegsendest. Aber grundsätzlich müsste der Empfang damit erst einmal 
klappen. Hie rist zu unterscheiden zwischen: funktioniert erst mal 
überhaupt nicht und funktioniert im Prinzip liefert aber falsche 
Ergebnisse)

> Den Taktfrequenztest habe ich nicht gemacht, da ich ersteinmal mit dem
> internen Oszilator Zeichen empfangen möchte

Auch das ist Quatsch.
Zuerst möchtest du den µC in einer Schleife senden lassen und du siehst 
dir am PC in einem Terminalprogramm an, was der empfängt. Geht es in 
diese Richtung, dann funktioniert auch die andere Richtung prinzipiell. 
Der einzige Unterschied: Mit dem PC hast du ein Anzeigeinstrument an dem 
du sehen kannst, ob die Übertragung klappt, während du in der anderen 
Richtung im Nebel stocherst.

Autor: Christian S. (kruemel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich habe nun das Led Testprogramm laufen lassen.
Ich habe die Taktfrequenz mit

#define F_CPU 8000000

auf 8Mhz eingestellt. Bei diesem Takt leuchtet die LED eine Sekunde und 
ist auch 1 Sekunde aus. Je kleiner die Frequenz desto schneller das 
Blinken.

Dann habe ich auf meinem STK500 einen Jumper bei RX und TX bei RS232 
Spare gesetzt. Bei meinem Terminalprogramm passiert aber nichts, ich 
tippe was, aber die Zeichen kommen nicht zurück.

Einstellungen Terminalprogramm (Hyperterminal):

9600 Bit pro Sekunde
8 Datenbits
Parität keine
Stoppbits 1
Flusssteuerung kein

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian S. schrieb:
> Bei meinem Terminalprogramm passiert aber nichts, ich
> tippe was, aber die Zeichen kommen nicht zurück.
Also: Verdrahtung untersuchen.

Brücke doch mal direkt am PC (zur Not mit einer Büroklammer) die Pins 2 
und 3 der D-SUB Buchse. Dann muss was zurückkommen, sonst passt deine 
Terminaleinstellung noch nicht.

Und dann machst du das selbe mit angeschlossenem Kabel (wieder Pin 2 und 
Pin 3 brücken)...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
GEH DIE GOTTVERDAMMTE LISTE DURCH! DORT STEHT ALLES IDIOTENSICHER!!!

Autor: Christian S. (kruemel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich bin doch dabei...

Autor: Christian S. (kruemel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habs hinbekommen, Fehler lag in der While-Schleife

while( 1 ) {
while (!(UCSRA & (1<<UDRE)))           /* warten bis Senden moeglich */
{
}

UDR = 'X';
_delay_ms(500);

} 
}


Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian S. schrieb:
> Habs hinbekommen, Fehler lag in der While-Schleife

Lothar Miller schrieb:
>> Der C-Code ist okay?
> Welcher C-Code?

Und ich sach noch...
Mannomannomannomann... :-/

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.