Forum: Compiler & IDEs UART ATmega16 von Peter Fleury


von El (Gast)


Lesenswert?

Hallo zusammen!

Ich habe mir die uart libary von Peter Fleury 
http://homepage.hispeed.ch/peterfleury/avr-software.html#libs
runtergeladen und versuche nun eine Verbindung zwischen PC un uC 
aufzubauen.
Dazu benutzte ich das Codebeispiel von Fleury. Aber es will einfach 
nicht klappen!!
Verwende STK500 mit 3.68 Mhz internem clock.
Der PC sendet ein Zeichen und bekommt ein völlig falsches Zeichen 
zurück.
Ab und zu kommen auch fehlerhafte Packete zurück. Ich verwende HTerm auf 
dem PC.
Einstellung: 9600 Baud, Data 8 , Stop 1, Parity none, CTS Flow control 
keine

Die Baudrate sollte stimmen und das UBRR Register habe ich im Simulator 
überprüft : 23

Ich habe schon den Code durchgeforstet und überprüft, was der uC alles 
ausführt.

Das ist der init Abschnitt der er ausführt für den ATmega16:

void uart_init(unsigned int baudrate)
{
    UART_TxHead = 0;
    UART_TxTail = 0;
    UART_RxHead = 0;
    UART_RxTail = 0;

#elif defined (ATMEGA_USART)
    /* Set baud rate */
    if ( baudrate & 0x8000 )
    {
       UART0_STATUS = (1<<U2X);  //Enable 2x speed
       baudrate &= ~0x8000;
    }
    UBRRH = (unsigned char)(baudrate>>8);
    UBRRL = (unsigned char) baudrate;

    /* Enable USART receiver and transmitter and receive complete 
interrupt    */

    UART0_CONTROL = _BV(RXCIE)|(1<<RXEN)|(1<<TXEN);

    /* Set frame format: asynchronous, 8data, no parity, 1stop bit */
   UCSRC = (1<<URSEL)|(3<<UCSZ0);



Weis nicht mehr weiter. Hat das vieleicht scho jemand gemacht? ober 
sieht den Fehler.

Gruss
El

von Ulrich S. (uli)


Lesenswert?

Hi El,


Schau doch einfach mal ins Datenblatt des Mega 16. Die Beispiele zu UART 
sind sehr gut,leicht verständlich und vor allen Dingen sie 
funktionieren.

Gut... Fehler die man sofort erkennt. Du sprichst von einem internen 
Takt.
Beim MEGA16 mit STK 500 kannst du den Takt entweder vom STK 500 erzeugen 
lassen oder vom Mikrokontroller.
Werkseinstellungen beim Mega 16 ist ein selbst erzeugter internen 
Takt(nicht STK 500). Dieser ist aber "relativ" ungenau und für RS232 
Anwendungen solltest du über einen externen Quarz nachdenken.(Fuses 
Einstellungen nicht vergessen... und STK500 Jumper umstecken.)


Gruß

Uli

von Karl H. (kbuchegg)


Lesenswert?

> Verwende STK500 mit 3.68 Mhz internem clock

Das glaub ich nicht!

STK500 glaub ich dir.
Ich glaub dir auch entweder 'interner clock' oder '3.68Mhz'
Aber '3.68Mhz interner Clock' glaub ich dir nicht.

Beachte: die Angabe der Taktfrequenz im Programm hat für
den Compiler informativen Charakter. Es ist nicht so, dass
du ins Programm 3.68 Mhz reinschreibst und dann läuft der
Prozessor auch so schnell. Es ist deine Aufgabe als
Hardware-Techniker einen Quarz mit der entsprechenden Frequenz
anzuschliessen und in Betrieb zu nehmen.

von El (Gast)


Lesenswert?

Vielen Dank für die Anregungen!

in dem Fall seit ihr der meinung mit dem Takt ist nich nicht alles in 
Ordnung.
Dann werde ich mal mein spetzielles Augenmerk darauf richten und alle 
Einstellungen überprüfen!

gruss

El

von Karl H. (kbuchegg)


Lesenswert?

Die Sache ist ganz einfach.

Entweder du hast einen externen Quarz dran oder du hast ihn
nicht dran.

Wenn du keinen externen Quarz hast, dann kannst du den Mega16
mit den Fuse Bits auf entweder 8Mhz oder 1Mhz einstellen. Wenn
du an den Fuse Bits überhaupt nichts gemacht hast, dann läuft
er mit 1Mhz. So wird er ausgeliefert.

Wenn du aber einen externen Quarz dran hast, dann heist das
noch lange nicht, dass der auch benutzt wird. Ein externer
Quarz muss mittels Fuse-Bits auch aktiviert werden.

Nachzutragen wäre noch: Sei extrem vorsichtig, wenn du mit
den Fuse-Bits spielst. Grade mit den CKSEL Fuses kann man sich
ganz schnell aus dem Prozessor aussperren. Alles doppelt
und dreifach kontrollieren bevor die Bits gebrannt werden.

  * Ein Quarz ist kein Quarzoszillator! Also vorsichtig sein,
    welche Einstellung du benutzt

  * Immer, wirklich immer, zuerst die Fuse-Bits aus dem
    Prozessor auslesen und mit dem Datenblatt vergleichen.
    Nur dann wenn du jedes einzelne Bit im Datenblatt gefunden
    hast und das dann auch mit den dokumentierten Ausliefer-
    einstellungen übereinstimmt weitermachen.

von El (Gast)


Lesenswert?

Hallo

Ich habe das Problem inzwischen lösen können. Es lag tatsächlich an den 
Einstellungen der Fuse-Bits die von mir falsch gesetzt wurden. Wie ich 
gesehen habe verursachen sie immer wieder Probleme bei Anfängern, so 
auch bei mir.
Herausgefunden habe ich es mit einem Oszilloskop am Port eines Timerpins 
den ich nach jeden Takt toggeln lies.
Schön wäre eine Funktion, die einem den Systemtakt zum Beispiel über die 
LEDs anzeigen würde.

Vielen Dank für eure Antworten

Gruss El

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Schön wäre eine Funktion, die einem den Systemtakt zum Beispiel über die
> LEDs anzeigen würde.

Neuere AVRs haben eine CKOUT-Fuse, mit der man den internen CPU-Takt
(egal, woher er kommt) an ein Ausgangspin legen kann.  OK, wer diese
Fuse programmieren kann, kann vermutlich auch die für den Takt
programmieren...

von S.T (Gast)


Lesenswert?

El schrieb:
> Hallo
>
> Ich habe das Problem inzwischen lösen können. Es lag tatsächlich an den
> Einstellungen der Fuse-Bits die von mir falsch gesetzt wurden. Wie ich
> gesehen habe verursachen sie immer wieder Probleme bei Anfängern, so
> auch bei mir.
> Herausgefunden habe ich es mit einem Oszilloskop am Port eines Timerpins
> den ich nach jeden Takt toggeln lies.
> Schön wäre eine Funktion, die einem den Systemtakt zum Beispiel über die
> LEDs anzeigen würde.
>
> Vielen Dank für eure Antworten
>
> Gruss El

Bei 1 Mhz wirst du nicht mal ein Flimmern an deiner LED merken. 
Zumindest wenn du sie direkt auf die LED losjagst :D

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.