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


von Christian S. (kruemel)


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 ?

1
#include <avr/io.h>
2
#include <avr/delay.h>
3
4
#define F_CPU 8000000L
5
#define BAUD 9600L
6
7
#define UBRR_VAL ((F_CPU+BAUD * 8)/(BAUD*16)-1)      //clever runde
8
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))         //reale Baudrate
9
10
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000)      //Fehler in Promille
11
12
#if ((BAUD_ERROR>10)||(BAUD_ERROR<-10))
13
#error Systematischer Fehler in der Baudrate größer 1% und damit zu hoch!
14
#endif
15
 
16
17
int main(void)
18
{
19
   
20
   UBRRH = UBRR_VAL >> 8;
21
   UBRRL = UBRR_VAL & 0xFF;
22
   
23
   
24
   UCSRB = (1<<RXEN)|(1<<TXEN);            //UART TX einschalten
25
   UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);     //Asynchron 8N1
26
   
27
   
28
29
   while (!(UCSRA & (1<<UDRE)))            //warten bis Senden möglich
30
   {
31
   }   
32
33
34
   UDR = 'x';                             //schreibt das Zeichen x auf die Schnittstelle
35
   _delay_ms(100);
36
37
38
   return 0;                     
39
}


Vielen Dank im vorraus
Viele Grüße

Christian

von Karl H. (kbuchegg)


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_Checkliste#UART.2FUSART

von Karl H. (kbuchegg)


Lesenswert?

Mach mal eine Schleife um deine Ausgabe
1
int main()
2
{
3
   ....
4
5
  while( 1 ) {
6
    while (!(UCSRA & (1<<UDRE)))            //warten bis Senden möglich
7
    {
8
    }   
9
10
    UDR = 'x';                             //schreibt das Zeichen x auf die Schnittstelle
11
    _delay_ms(100);
12
  }
13
}

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

von Christian S. (kruemel)


Lesenswert?

Hallo,

Schleife ist eingebaut,.

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

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


Viele Grüße

von Christian S. (kruemel)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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?
1
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?

von Christian S. (kruemel)


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

von Falk B. (falk)


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!!!

von Karl H. (kbuchegg)


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

von Karl H. (kbuchegg)


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.

von Christian S. (kruemel)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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)...

von Falk B. (falk)


Lesenswert?

GEH DIE GOTTVERDAMMTE LISTE DURCH! DORT STEHT ALLES IDIOTENSICHER!!!

von Christian S. (kruemel)


Lesenswert?

ich bin doch dabei...

von Christian S. (kruemel)


Lesenswert?

Habs hinbekommen, Fehler lag in der While-Schleife
1
while( 1 ) {
2
while (!(UCSRA & (1<<UDRE)))           /* warten bis Senden moeglich */
3
{
4
}
5
6
UDR = 'X';
7
_delay_ms(500);
8
9
} 
10
}

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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... :-/

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.