www.mikrocontroller.net

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


Autor: Penie Lydos (peniely)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

 
#include <avr/io.h> 
#define F_CPU       16000000UL     // Systemtakt in Hz
#define USART_BAUD_RATE   9600 
#define USART_BAUD_SELECT   (F_CPU/(USART_BAUD_RATE*16L)-1)


//-----------------------------------------------------
void _writeString (const char *string) 
{ 
     while (*string) 
     {
         while (!(UCSRA & (1<<UDRE)))
         {} 

         UDR = *string++; 
     }
} 

//-----------------------------------------------------
void main()
{
  //char bZeichen;

  UCSRB = (1 << RXEN) | (1<<TXEN); 
  UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0); 
  UBRRL = (unsigned char) USART_BAUD_SELECT; 
  //USART_Init(UBRR_VAL);
 
_writeString ("Hallo, Welt!\n"); 

  } 

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
RTFM

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

Autor: Penie Lydos (peniely)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
andere Zeichen, aber wird nicht besser

Autor: Andreas K. (derandi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Teplotaxl X. (t3plot4x1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum hängst du nen Bild als Word-Datei an?

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: bko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: bko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Penie Lydos (peniely)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Penie Lydos (peniely)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Gast (Gast)
Datum:

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

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Penie Lydos (peniely)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Penie Lydos (peniely)
Datum:

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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Penie Lydos (peniely)
Datum:

Bewertung
0 lesenswert
nicht 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.

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

Bewertung
0 lesenswert
nicht 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.

Autor: Penie Lydos (peniely)
Datum:

Bewertung
0 lesenswert
nicht 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!?!

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

Bewertung
0 lesenswert
nicht 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.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Penie Lydos (peniely)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
include <inttypes.h>
#include <avr/io.h>
#include <stdlib.h>
#include <util/delay.h>

#ifndef F_CPU
#define F_CPU 1000000UL
#endif

#define BAUD 4800UL //Baudrate
#define UBRR_BAUD   ((F_CPU/(16UL*BAUD))-1)

void wait (uint16_t zeit) //zeit: wartezeit in ms (0 bis 65536)
{
   uint16_t i;
   for(i=0;i<zeit;i++) _delay_ms(1); //da für _delay_ms max Takt-abhängige Werte erlaubt
}
void uart_init(void)
{
  OSCCAL = 0xFF;
    UCSRB = (1<<RXEN)|(1<<TXEN);      // UART TX und RX einschalten
    UCSRC |= ( 1 << URSEL )|( 3<<UCSZ0 );  // Asynchron 8N1
  
    UBRRH = (uint8_t) (UBRR_BAUD>>8);
    UBRRL = (uint8_t) (UBRR_BAUD ); //& 0x0ff);
}
void uart_data(unsigned char c)
{
    while (!(UCSRA & (1<<UDRE))) {}  // warten bis Senden möglich
    UDR = c;                         // Zeichen senden
}
int main(void)
{
   wait (100);
   uart_init();
   uart_data('e');
   
   return 0;

}

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sach mal, kannst du selber auf deinem Bildchen etwas erkennen?

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

Bewertung
0 lesenswert
nicht 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.

Autor: Penie Lydos (peniely)
Datum:

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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Penie Lydos (peniely)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Gast
schaltung:

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

Autor: Penie Lydos (peniely)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gast (Gast)
Datum:

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

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

Bewertung
0 lesenswert
nicht 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?

Autor: Penie Lydos (peniely)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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? ...

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

Bewertung
0 lesenswert
nicht 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.

Autor: Norgan (Gast)
Datum:

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

Zumindest liest er die Postings hier nur halb.

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Gruß aus Berlin
Michael

Autor: Penie Lydos (peniely)
Datum:

Bewertung
0 lesenswert
nicht 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ß

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.