Atmega8 + STK500 - USART funktioniert nicht

Gast #2221593
Lesenswert?

Hi.
Habe mal wieder ein kleines Problem.
Seit gut 2 Tagen versuche ich jetzt mit meinem Atmega8 einen Char an den 
PC zu senden. Aber irgendwie passiert überhaupt nichts.
1
#include <avr/io.h>
2

3
#define F_CPU 3680000
4
#define USART_BAUD_RATE 9600
5
#define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16l)-1)
6

7

8
void initUsart(void) {
9
    UCSRB =  (1<<RXEN) | (1<<TXEN);
10
    UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
11
    UBRRL = (unsigned char) USART_BAUD_SELECT;
12
}
13

14
void sendChar (unsigned char c) {
15
  while (!(UCSRA & (1<<UDRE))) {}
16
  UDR = c;
17
}
18

19
int main(void)
20
{
21
  initUsart();
22
  for(;;){
23
      sendChar('x');
24
  }              
25
}

Eigentlich sollte es doch schon funktionieren oder?
Das STK ist auf standard gestellt. In der Anleitung steht, dass es 
standardmäßig 3,68mhz sei.
Woran könnte es liegen?
Hab schon 3 Terminalprogramme ausprobiert, aber es kommt wirklich gar 
nichts an.

Evtl. habt ihr ein paar Tipps für mich!

MfG

Conehead
Gast #2221658
Lesenswert?

Hi

>Das STK ist auf standard gestellt. In der Anleitung steht, dass es
>standardmäßig 3,68mhz sei.

Hast du bei den HW-Settings nachgesehen? Abgesehen davon ist der interne 
Takt des STK500 nicht sonderlich genau.

>Hab schon 3 Terminalprogramme ausprobiert, aber es kommt wirklich gar
>nichts an.

Die Verbindung vom Port zu RXD/TXD ist in Ordnung?

MfG Spess
#2221802
Lesenswert?

1) Der Hauptfehler ist die falsche Berechnung des UBRR-Wertes. Nach 
Datenblatt wäre richtig:

#define USART_BAUD_SELECT (F_CPU/16/USART_BAUD_RATE-1)

Wenn das Ergebnis nicht ganzzahlig ist, wird allerdings nicht gerundet, 
sondern abgeschnitten. Hier gibt es eine "cleverere" Berechnung: 
AVR-Tutorial: UART

2) Oszillator-Takte sind nicht "irgendwie", sondern genau:

#define F_CPU 3686400UL

Mit dem "UL" teilt man dem Präprozessor das Format (Unsigned Long) mit, 
damit er bei späteren Berechnungen nicht "aus Versehen" eine negative 
Zahl annimmt.

Welchen Oszillator-Takt das STK500 ausgibt, kannst Du im STK500-Plugin 
von AVR-Studio 4 abfragen: Im STK500-Fenster den Reiter "HW Settings" 
wählen und dort bei "Clock Generator" auf "Read" klicken.

3) (1<<USBS) bedeutet 2 (zwei) Stopp-Bits. Willst Du das wirklich? Lass 
es einfach weg, dann bleibt es bei 1 (einem) Stopp-Bit.

Bei wirren Ausgaben, drück mal für 2 Sekunden den RESET-Knopf auf dem 
STK500-Board.

viele grüße
ralph
#2221877
Lesenswert?

spess53 schrieb:
>>3) (1<<USBS) bedeutet 2 (zwei) Stopp-Bits. Willst Du das wirklich? Lass
>>es einfach weg, dann bleibt es bei 1 (einem) Stopp-Bit.
>
> Schon mal überlegt, wen das stören könnte?

Na mich zum Bleistift. Ich hab mich ja schon bei der 
Schnarchgeschwindigkeit von 9600 Baud und bei der fehlenden 
Initialisierung von UBRRH zurückgehalten.

viele grüße
ralph
Gast #2221893
Lesenswert?

Hi

>Na mich zum Bleistift. Ich hab mich ja schon bei der
>Schnarchgeschwindigkeit von 9600 Baud und bei der fehlenden
>Initialisierung von UBRRH zurückgehalten.

UBRRH ist nach Reset mit $00 initialisiert. Was sollte man daran ändern? 
Und 9600Bd haben mir meistens ausgereicht.

MfG Spess
Gast #2221932
Lesenswert?

Doh...das man umstecken muss auf dem Board muss man auch erst mal wissen 
:D
Jetzt empfange ich etwas...jedoch nicht das richtige, sondern wilde 
Zeichen.

Die Baud-Rate habe ich so bestimmt:
#define F_CPU 3686400UL
#define USART_BAUD_RATE 9600
#define USART_BAUD_SELECT 
((F_CPU+(USART_BAUD_RATE*8))/(USART_BAUD_RATE*16))-1

So steht es ja zumindest oben in dem Link.

Avr Studio gibt auch 3,686 Mhz an.
Sicher dass es dann auch 3686400UL sein sollte oder 3686000?
Gast #2221958
Lesenswert?

Hmm doch noch ein Problem.
Jetzt wollte ich Zeichen empfangen, aber irgendwie kommt immer etwas 
anderes an :/

data = receiveChar();
sendChar(data);

unsigned char receiveChar (void) {
    while(!(UCSRA & (1<<RXC))) {}
    return UDR;
}


Jemand auch da ne Idee, wo das Problem sein könnte?
Gast #2222276
Lesenswert?

Ich meinte damit nur:
Er empfängt das falsche Zeichen.
Also nicht immer etwas unterschiedliches, sondern einfach ein falsches 
Zeichen.

Wenn ein Char empfangen wird, lasse ich ihn sofort wieder zurücksenden.
Und dabei kommt nichts sinnvolles raus.
Gast #2222323
Lesenswert?

So hab nochmal die Hexzahlen geprüft.
Wenn ich eine 1 Sende (31), dann kommt eine 91 heraus.
Bei einer 2 (32) kommt eine 92 heraus usw.

Bei einem kleinen a (61) kommt ein A1 heraus.
Als wäre alles etwas verschoben.
Gast #2222381
Lesenswert?

Hmm das hab ich schon rausgenommen.
Aber wie kann es sein, dass das Senden immer zu 100% funktioniert und er 
beim empfangen solche Probleme macht.
Und das Ergebnis ändert sich ja nicht jedes mal.
Es ist einfach nur falsch
Gast #2222389
Lesenswert?

Hi

>Aber wie kann es sein, dass das Senden immer zu 100% funktioniert und er
>beim empfangen solche Probleme macht.

Weil PC und µC anders ticken.

Ich hatte dir schon weiter oben geschrieben, das der interne Takt des 
STK500 nicht sehr genau ist. Nimm einen Quarz.

MfG Spess
Gast #2222428
Lesenswert?

Hi

>Kurz und knapp:
>Ich habe gerade keinen hier ;)

Ok. Dann setze den Controllertakt erst mal auf 8 MHz. Da hast du für die 
Baudrate eine feinere Abstimmung. Wenn das nicht hilft, dann mit dem 
OSCCAL-Register den Takt in die Reihe bringen. Zum Spielen sollte das 
erst mal reichen.

MfG Spess
#2222447
Lesenswert?

@Conehead:

Der interne Oszillator des STK500 ist schon ziemlich genau. Zumindest 
reicht es, um UBRR (mit Rundung) richtig zu belegen. Andererseits hat 
der interne RC-Oszillator des ATMega8 für eine saubere Übertragung die 
falschen Taktraten. Ich schaffe es mit dem internen Takt noch nicht 
einmal, eine Sendung richtig zu empfangen, geschweige denn irgendetwas 
Nachvollziehbares als Echo zu bekommen- welches Terminalprogramm benutzt 
Du?

Nimm den Oszillator vom STK500:

Im STK500-Fenster unter Fuses wählst Du bei SUT_CKSEL "Ext. 
Crystal/Resonator High Freq.; Start-up time: 16K CK +64 ms" und klickst 
auf "Program". Mit einem Klick auf "Read" prüfst Du nach, ob diese 
Einstellung auch angekommen ist.

Dann verbindest Du auf dem STK500 bei OSCSEL Pin 1 und 2 mit einem 
Jumper. Solltest Du irgendwann einen Quarz in CRYSTAL benutzen wollen, 
dann müssen Pin 2 und 3 gejumpert werden. Die Stifte von XTAL1 müssten 
bereits mit einem Jumper verbunden sein.

Im Programm gibst Du als F_CPU den Wert an, der Dir das STK500-Plugin 
beim Read von "HW Settings" unter "Clock Generator" im weißen Feld 
ausgespuckt hat (Copy&Paste). Kompilieren, Flashen, RESET auf dem STK500 
drücken.

Alles andere ist Gewurschtel.

Folgendes Programm funktioniert bei mir ohne Beanstandung:
1
#include <avr/io.h>
2

3
#define F_CPU 3686400UL
4
#define BAUD 9600UL
5
#define USART_BAUD_SELECT ((F_CPU+BAUD*8)/(BAUD*16)-1)  // clever runden
6
#define BAUD_REAL (F_CPU/(16*(USART_BAUD_SELECT+1)))    // Reale Baudrate
7
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)    // Fehler in Promille, 1000 = kein Fehler.
8

9
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
10
  #error Baudratenabweichung groesser 1% und damit zu hoch!
11
#endif
12

13
void initUsart(void) {
14
  UCSRB = (1<<RXEN) | (1<<TXEN);
15
  UCSRC = (1<<URSEL)|(3<<UCSZ0);
16

17
  UBRRH = (USART_BAUD_SELECT >> 8);
18
  UBRRL = (USART_BAUD_SELECT & 0xFF);
19
}
20

21
void sendChar (char c) {
22
  while (!(UCSRA & (1<<UDRE))) {}
23
  UDR = c;
24
}
25

26
unsigned char receiveChar (void) {
27
  while(!(UCSRA & (1<<RXC))) {}
28
  return UDR;
29
}
30

31

32
int main(void)
33
{
34
  unsigned char data;
35

36
  initUsart();
37

38
  sendChar (13);
39
  sendChar (10);
40
  sendChar('H');
41
  sendChar('a');
42
  sendChar('l');
43
  sendChar('l');
44
  sendChar('o');
45
  sendChar(' ');
46
  sendChar (13);
47
  sendChar (10);
48

49
  for(;;)
50
  {
51
    data = receiveChar();
52
    sendChar(data);
53
  }              
54
}
viele grüße
ralph

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