Forum: Mikrocontroller und Digitale Elektronik uart-atmega8-falsche zeichen


von Penie L. (peniely)


Angehängte Dateien:

Lesenswert?

Hallo

Ein alt bekanntes Problem und ich hab viel nachgeschaut und ich krieg 
das einfach nicht hin.

Ich möchte ein Zeichen über USART senden aber hyperterminal zeigt mir 
nur wirre Zeichen.

->Board: STK500
->Compiler: avr-gcc
->device: atmega8
->Die Fuses sind wie folgt gesetzt:  CKSEL=1111 SUT=01
 Ext. Crystal/Resonator High Freq.; Start-up time: 16K CK + 0ms
 und Ext. an XTAL1 (PB6) 4MhZ (quarz)
-> Beim compilieren: Build succeeded with 0 Warnings...

Ich habe 1 zu 1 Beispiele im Internet kopiert, Die Fuses beim  SUT_CKSEL 
externen XTAL 4.0 MHz auch alles probiert und passiert immer das 
gleiche. Kabel habe ich auch schon gewechselt. ICh behaupte, dass es 
doch etwas mit der Baud zu tun hat. Ich weis einfach nicht was ich 
falsch mache. Habt Ihr noch eine Idee?
Hier ist mein c-code und als Anhang die Fussesbild

Ich danke euch für eure Hilfe!

Grüsse

1
 
2
#include <avr/io.h> 
3
#define F_CPU       16000000UL     // Systemtakt in Hz
4
#define USART_BAUD_RATE   9600 
5
#define USART_BAUD_SELECT   (F_CPU/(USART_BAUD_RATE*16L)-1)
6
7
8
//-----------------------------------------------------
9
void _writeString (const char *string) 
10
{ 
11
     while (*string) 
12
     {
13
         while (!(UCSRA & (1<<UDRE)))
14
         {} 
15
16
         UDR = *string++; 
17
     }
18
} 
19
20
//-----------------------------------------------------
21
void main()
22
{
23
  //char bZeichen;
24
25
  UCSRB = (1 << RXEN) | (1<<TXEN); 
26
  UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0); 
27
  UBRRL = (unsigned char) USART_BAUD_SELECT; 
28
  //USART_Init(UBRR_VAL);
29
 
30
_writeString ("Hallo, Welt!\n"); 
31
32
  }

von ... .. (docean) Benutzerseite


Lesenswert?

RTFM

Wenn du einen 4 Mhz Quarz dran hast solltest du das auch bei F_CPU 
eintragen DAS HILFT!

von Penie L. (peniely)


Lesenswert?

andere Zeichen, aber wird nicht besser

von Andreas K. (derandi)


Lesenswert?

Mit 4 MHz wird er aber rein vom gefühl her zu weit an der nötigen 
Baudratenfrequenz vorbeischrammeln.
http://www.mikrocontroller.net/articles/Baudratenquarz

von Teplotaxl X. (t3plot4x1)


Lesenswert?

Warum hängst du nen Bild als Word-Datei an?

von Michael U. (amiga)


Lesenswert?

Hallo,

Penie Lydos schrieb:

> ->Board: STK500
> ->Compiler: avr-gcc
> ->device: atmega8
> ->Die Fuses sind wie folgt gesetzt:  CKSEL=1111 SUT=01
>  Ext. Crystal/Resonator High Freq.; Start-up time: 16K CK + 0ms
>  und Ext. an XTAL1 (PB6) 4MhZ (quarz)

Wie ist das zu verstehen? Auf dem STK500 ist eine Fassung für einen 
Quarz.
Da steckt Dein Quarz drin?
Jumper dafür ist auch richtig gesetzt?

Das STK500 erzeugt selbst einen Takt, der im Programmer-Menü einstellbar 
ist und normalerweise vom Board an XTAL1 gelegt wird.

Gruß aus Berlin
Michael

von bko (Gast)


Lesenswert?

Hallo,

>UCSRB = (1 << RXEN) | (1<<TXEN);
>UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);

Wie sind >URSEL, UCSZ1, UCSZ0, RXEN und TXEN<
genau definiert bzw. welchen Wert haben sie ?

von Michael U. (amiga)


Lesenswert?

Hallo,

@ bko (Gast): ich verstehe den Sinn dieser Frage nicht?
Die Bitwerte der Register hat Atmel in den Includes seiner AVR schon 
passend definiert.

Gruß aus Berlin
Michael

von bko (Gast)


Lesenswert?

@Michael,

sorry für die Verwirrung, meine C-Kenntnisse sind nicht so 100%,
ich wollte eigentlich wissen was für ein Wert denn
genau im dem AVR-UART  Register "UCSRC"-Bit7 landet;
denn ich
dachte hier könnte der Fehler liegen, wenn aber
Bit >URSEL< 1 ist, sollte der Code so gehen und
die Baudrate bei einem 4 Mhz Quarz auch genau genug sein

von Penie L. (peniely)


Lesenswert?

Hallo,

@Michael

Ich tendiere auch dass meiner Fehler mit dem Einsteckens vom Quarz.
ich habe einfach wie unten verbindet und im Programm der PortB6 als 
Eingang definiert

PB6------------Quarz (4 Mhz)---------Masse

DDRC = 0x00;  // als Eingagang festslegen
PORTC = 0x40;    //den Eingangs-Pull-Up aktiviert

leider funktioniert immer nicht

von Penie L. (peniely)


Lesenswert?

Hallo,

@Michael

Ich tendiere auch dass meiner Fehler mit dem Einsteckens vom Quarz.
ich habe einfach wie unten verbindet und im Programm der PortB6 als 
Eingang definiert

PB6------------Quarz (4 Mhz)---------Masse

DDRC = 0x00;  // als Eingagang festslegen
PORTC = 0x40;    //den Eingangs-Pull-Up aktiviert

leider funktioniert immer nicht

gruß

von Gast (Gast)


Lesenswert?

Aus welchem Grund schließt man einen Quarz so an?
Weil man es unbedingt anderst machen will als im Datenblatt angegeben?

von Michael U. (amiga)


Lesenswert?

Hallo,

@ Gast (Gast): vermutlich, weil man weder ind das Datenblatt des AVR 
noch in die Beschreibung des STK500 allzu viele Blicke geworfen hat...

Das Datenblatt des AVR hilft ohne die STK-Beschreibung allerdings auch 
nicht viel, ein Blick in den Schaltplan des STK500 könnte noch Klarheit 
bringen.

Durch die internen Verbindungen auf dem STK500 kann man keinen eigenen 
Quarzoszillator beschalten. Die internen Leitungen wären einfach zu 
lang.

Atmel hat deshalb eine eigenen Quarz-Oszillator auf das STK500 gebaut.
Quarz also in diese Fassung, Jumper CKSEL passend setzen (der 
entscheidet, ob der Programmierbare Oszillator oder der Quarz oder 
garnichts benutzt wird) und ok.

PS: sowas ist einer der Gründe, weshalb ich das STK500 nicht so 
uneingeschränkt einen Neueinsteiger empfehlen würde. Ein Steckbrett mit 
dem AVR, Quarz und Kondensatoren, 5V wäre einfach eindeutig.
Selbst wenn man ein STK500 hat und es dann nur als ISP-Programmer für 
das Steckbrett benutzt.
Man sieht aber dann eindeutig, was man wo angeschlossen hat.

Gruß aus Berlin
Michael

von Penie L. (peniely)


Lesenswert?

@ Gast

ich habe es jetzt wie im Datenblatt atmega8 Seite 27 Figure 11, leider 
keiner Änderung, ich habe den Gefühlt dass mein externe Quarz gar keinen 
Einfluss hat.

von Penie L. (peniely)


Lesenswert?

@ Michael
ich stimme zu, weil ich stehe seit eine Woche da und weiss nicht wo 
genau mein Fehler liegt

von Gast (Gast)


Lesenswert?

Das prüfen ob der Quarz keinen Einfluss hat geht einfach, steck ihn aus 
und lass auch sonst keinen Takt auf die Xtal Pins kommen. Wenn der 
Controller danach weiter auf der seriellen Schnittstelle ausgibt, dann 
liegt es nicht am Quarz.

von Michael U. (amiga)


Lesenswert?

Hallo,

der Reihe nach: Programmierung STK500 öffnen.
DeviceID des AVR lesen. Sollte ja als ok gemeldet werden, wenn Du dort 
den Mega8 eingetragen hast.

Jetzt den CKSEL jumper vom STK500 abziehen ist irgendwo neben der 
Quarzfassung, merken, wie er steckte).

DeviceID des AVR lesen. Sollte die beliebte Fehlermeldung kommen, daß 
wohl was nicht stimmt.

Wenn Fehler, sind die Fuses erstmal richtig.
Wenn er sich ohne Jumper lesen läßt, läuft er noch mit internem Takt...

Deinen Quarz in die besagte Fassung stecken.
CKSEL-Jumper in der anderen Stellung aufstecken.

DeviceID des AVR lesen. Klappt das, läuft er mit Deinem Quarz.
Zum Test nur Quarz rausziehen, Device-ID lesen muß Fehler erzeugen.

Gruß aus Berlin
Michael

von Penie L. (peniely)


Lesenswert?

@michael
>Wenn Fehler, sind die Fuses erstmal richtig.
>Wenn er sich ohne Jumper lesen läßt, läuft er noch mit internem Takt...

ja er läßt sich ohne Jumper lesen

>Deinen Quarz in die besagte Fassung stecken.
>CKSEL-Jumper in der anderen Stellung aufstecken.

Auf meinem Avr ist OSCSEL, entpricht das CKSEL

>DeviceID des AVR lesen. Klappt das, läuft er mit Deinem Quarz.
>Zum Test nur Quarz rausziehen, Device-ID lesen muß Fehler erzeugen.

Quarz rausziehen oder nicht gibt gleichen falsche Zeichen aus.

von Karl H. (kbuchegg)


Lesenswert?

Penie Lydos schrieb:
> @michael
>>Wenn Fehler, sind die Fuses erstmal richtig.
>>Wenn er sich ohne Jumper lesen läßt, läuft er noch mit internem Takt...
>
> ja er läßt sich ohne Jumper lesen
>
>>Deinen Quarz in die besagte Fassung stecken.
>>CKSEL-Jumper in der anderen Stellung aufstecken.
>
> Auf meinem Avr ist OSCSEL, entpricht das CKSEL
>
>>DeviceID des AVR lesen. Klappt das, läuft er mit Deinem Quarz.
>>Zum Test nur Quarz rausziehen, Device-ID lesen muß Fehler erzeugen.
>
> Quarz rausziehen oder nicht gibt gleichen falsche Zeichen aus.

logischer Schluss.
Dein Quarz ist zur Zeit reine Zierde. Der µC benutzt ihn nicht.

von Penie L. (peniely)


Lesenswert?

@Gast

Der Quarz ist ausgesteckt und auch keinen Takt auf die Xtal Pins.
trotzdem gibt Controller weiter auf der seriellen Schnittstelle aus.

Und wenn es nicht an Quarz liegt, woran dann!?!

von Karl H. (kbuchegg)


Lesenswert?

Penie Lydos schrieb:
> @Gast
>
> Der Quarz ist ausgesteckt und auch keinen Takt auf die Xtal Pins.
> trotzdem gibt Controller weiter auf der seriellen Schnittstelle aus.
>
> Und wenn es nicht an Quarz liegt, woran dann!?!

Dass deine Fuses nicht stimmen und der Quarz keinen Einfluss auf die 
Taktfrequenz des µC hat.

von Michael (Gast)


Lesenswert?

Hallo,

1.
Schreib die Baudrate doch mal Vollständig in das UBRR - Register!!!!
Du schreibst nur die unteren 8 bit in UBRRL. Das Register ist 16 Bit 
breit und bei 4Mhz => 9600 Baud ist dein Teilerverhältnis 26.
Das obere Register ist nicht initialisiert.

Deine Version:
UBRRL = (unsigned char) USART_BAUD_SELECT;

Richtig:
UBRR = USART_BAUD_SELECT;

2. Du hast das Register ACSRA nicht initialisiert. Hier kannst Du die 
UART im 2X mode laufen lasen.

3. Drehe die Reihenfolge um. Erst alles initialisieren und dann die UART 
aktivieren.

  UCSRA = 0;
  UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);
  UBRR = USART_BAUD_SELECT;
  UCSRB = (1 << RXEN) | (1<<TXEN);

4. Wenn du die Lib WINAVR benutzt, warum dann nicht auch die Makros in 
"util/setbaud.h" dazu?

5. Gibt es nicht ein Example für dein Problem? Du bist bestimmt nicht 
der erste der mit dem STK500, dem gcc und ATMEGA8 versucht die UART zu 
bedienen!

Gruß,

Michael

von Michael U. (amiga)


Lesenswert?

Hallo,

Penie Lydos schrieb:
> @michael
>>Wenn Fehler, sind die Fuses erstmal richtig.
>>Wenn er sich ohne Jumper lesen läßt, läuft er noch mit internem Takt...
>
> ja er läßt sich ohne Jumper lesen

Dann kann das Bild aus dem ersten Posting mit den Fuseeinstellungen 
nicht stimmen...

>
>>Deinen Quarz in die besagte Fassung stecken.
>>CKSEL-Jumper in der anderen Stellung aufstecken.
>
> Auf meinem Avr ist OSCSEL, entpricht das CKSEL

Ja, hatte vorhin keine STK500 Beschreibung zur Hand.

Gruß aus Berlin
Michael

von Penie L. (peniely)


Angehängte Dateien:

Lesenswert?

Hey,
habe viele Beitrag gelesen, und viele geändert leider immer noch nicht 
die lösung gefunden.
Als Anhang ist das Bild vom Hardware.
code:
1
include <inttypes.h>
2
#include <avr/io.h>
3
#include <stdlib.h>
4
#include <util/delay.h>
5
6
#ifndef F_CPU
7
#define F_CPU 1000000UL
8
#endif
9
10
#define BAUD 4800UL //Baudrate
11
#define UBRR_BAUD   ((F_CPU/(16UL*BAUD))-1)
12
13
void wait (uint16_t zeit) //zeit: wartezeit in ms (0 bis 65536)
14
{
15
   uint16_t i;
16
   for(i=0;i<zeit;i++) _delay_ms(1); //da für _delay_ms max Takt-abhängige Werte erlaubt
17
}
18
void uart_init(void)
19
{
20
  OSCCAL = 0xFF;
21
    UCSRB = (1<<RXEN)|(1<<TXEN);      // UART TX und RX einschalten
22
    UCSRC |= ( 1 << URSEL )|( 3<<UCSZ0 );  // Asynchron 8N1
23
  
24
    UBRRH = (uint8_t) (UBRR_BAUD>>8);
25
    UBRRL = (uint8_t) (UBRR_BAUD ); //& 0x0ff);
26
}
27
void uart_data(unsigned char c)
28
{
29
    while (!(UCSRA & (1<<UDRE))) {}  // warten bis Senden möglich
30
    UDR = c;                         // Zeichen senden
31
}
32
int main(void)
33
{
34
   wait (100);
35
   uart_init();
36
   uart_data('e');
37
   
38
   return 0;
39
40
}

von Gast (Gast)


Lesenswert?

Sach mal, kannst du selber auf deinem Bildchen etwas erkennen?

von Karl H. (kbuchegg)


Lesenswert?

Wenn ich die Augen geeignet zusammenkneife, meine ich zu erkennen, dass 
da ein Kabel zu einem Steckbrett führt, auf dem ein Quarz samt 
zugehörigen Kondensatoren sitzt.

Jemand der das STK kennt, möge mein Vertrauen in Atmel wiederherstellen, 
indem er mir sagt, dass sich Atmel den Anschluss eines Quarzes in einem 
Entwicklungsboard ganz und gar nicht so vorgestellt hat.

von Penie L. (peniely)


Lesenswert?

@kbuchegg
und bitte wie soll ich mein ext quarz anschliessen?
Ich habe die schaltung von figure 11 im atmega8 Dadentblatt 
interpretiert.

von Gast (Gast)


Lesenswert?

Auf dem STK ist doch ein Sockel für genau diesen Zweck.

Oder aber du machst einfach alles extern auf deinem Steckbrett.
Der Quarz darf nunmal nicht ewig weit weg sein vom AVR.

von Penie L. (peniely)


Lesenswert?

@Gast
schaltung:

PB6 (XTAL1)-----------------c1(15 pF)-----
                    |                    |
                 quarz (4 Mhz)           |
                    |                    |
PB7 (XTAL2)-----------------c2(15 pF)-----
                                         |
                                       Masse

von Penie L. (peniely)


Lesenswert?

@ gast
>Oder aber du machst einfach alles extern auf deinem Steckbrett.

ja
mit SUT_CKSEL :    Ext. Crystal/Resonator High Freq.; Start-up time: 16K 
CK + 0 ms

von Gast (Gast)


Lesenswert?

Sieht gut aus. Jetzt nur die Verbindung zwischen den XTAL Pins und den 
Quarzanschlüssen "sehr kurz" halten.

von Karl H. (kbuchegg)


Lesenswert?

Ja, das ist die Standardbeschaltung eines Quarzes.
Aber: Diese Anordnung darf höchstens ein paar Zentimeter vom µC entfernt 
sein.
Und damit du diese Forderung erfüllen kannst, hat ATMEL dem STK500 einen 
Sockel für einen Quarz spendiert (und bereitet anscheinend das 
Quarzsignal etwas auf, wenn ich eine Aussage von weiter oben richtig 
interpretiere). Dort sollst du deinen Quarz reinstecken!

Liest den heutzutage keiner mehr Handbücher? Oder hast du keine 
Unterlagen zum STK500?

von Penie L. (peniely)


Lesenswert?

leider geht immer nicht.

Und egal ob die Verbindung zwischen den µC und den
Quarzanschlüssen steht oder nicht kommt immer die gleiche Zeichen raus.

von Gast (Gast)


Lesenswert?

Also dein AVR ist auf Quarz gestellt und er gibt jetzt ohne Quarz 
Zeichen aus. Das bezweifel ich.

Aber wie schon geschrieben -> Lies mal die Anleitung zu deinem STK500.

Und dann solltest du falls du etwas umbaust nicht einfach "leider geht 
immer nicht" schreiben. Was geht nicht? Bei welcher Konfiguration geht 
es nicht? Was hast du versucht um es zu beheben? ...

von Karl H. (kbuchegg)


Lesenswert?

Falls das bisher untergegangen ist:

Solange dein Mega8 Zeichen ausgibt, wenn die Verbdinung zum Quarz 
unterbrochen ist, wird logischerweise der Quarz nicht benutzt (auch wenn 
da ein Kabel zum µC führt).

Solange du das nicht behebst, ist alles andere sinnlos.
Es muss so sein:

 Quarz dran:         -> µC läuft und gibt was aus.
 Quarz nicht dran:   -> µC läuft nicht und gibt daher auch nichts aus.

von Norgan (Gast)


Lesenswert?

> Liest den heutzutage keiner mehr Handbücher? Oder hast du keine
> Unterlagen zum STK500?

Zumindest liest er die Postings hier nur halb.

von Michael U. (amiga)


Lesenswert?

Hallo,

@Norgan (Gast):
scheint leider wirklich so zu sein, siehe mein Posting von
Datum: 06.05.2009 10:00

Gruß aus Berlin
Michael

von Penie L. (peniely)


Lesenswert?

Hallo,

Wouf!!!!!!!
endlich weiss ich wo mein Problem liegt:
Ich arbeite mit einem ext. Quarz,
schaltung siehe oben: Datum: 06.05.2009 16:08
Es komm immer wirre Zeichen raus. weil das den PC aus dem Tackt kommt!

Jetzt habe ich einfach UBRR den wert 25 gegeben und bekomme ich endlich 
was ich wollte.
Troztdem danke an alle die mir geantwortet haben.
gruß

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.