Forum: Mikrocontroller und Digitale Elektronik UART per Atmel Studio und STK500


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von lakiluk (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Obwohl ähnliche Beiträge schon recht viele rumgeistern komme ich mit der 
Programmierung der UART nicht weiter. Ich habe diese früher bereits 
erfolgreich mit AVR Studio 4 verwendet für ein Debug-Log am PC 
(serielles Terminal).

Nun benötige ich das selbe mit Atmel Studio 7. Mein erstes Problem ist, 
dass hier irgendwie der OnBoard Oszillator des STK500 nicht mehr 
konfiguriert werden kann. Ist das korrekt oder irgendwie möglich? Habe 
also mit einem Oszi die derzeitige Frequenz am XT1 Pin gemessen (ca. 
3.84MHZ). Diese auch in meiner Software konfiguriert. Auch mit einem 
separaten Quarz (4MHZ) hatte ich keinen Erfolg. Habe auch das mit Oszi 
kontrolliert. Jumper waren korrekt gesetzt. Takt stimmte.

Das eigentliche Problem ist nun, dass ich per UART am seriellen Terminal 
nur Blödsinn bekomme. Langsam bin ich am verzweifeln. Die 
Terminaleinstellungen scheinen nicht das Problem zu sein. Hab das 
mehrmals gecheckt. Habe auch verschiedenste Baudraten probiert. Hoffe 
jemand hat einen Tipp. Der relevante Code:

#include <avr/io.h>

/*
  UART-Init:
Berechnung des Wertes für das Baudratenregister
aus Taktrate und gewünschter Baudrate
*/

#ifndef F_CPU
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
   F_CPU im Makefile definiert werden, eine nochmalige Definition
   hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
   #ifndef/#endif

   Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio
   verwendet wird und dort eine andere, nicht zur Hardware passende
   Taktrate eingestellt ist: Dann wird die folgende Definition
   nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?)
   von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
   noch nicht definiert: */
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 
4000000"
#define F_CPU 4000000UL  // Systemtakt in Hz - Definition als unsigned 
long beachten
                         // Ohne ergeben sich unten Fehler in der 
Berechnung
#endif

#define BAUD 300UL      // Baudrate

// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = 
kein Fehler.

#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
  #error Systematischer Fehler der Baudrate groesser 1% und damit zu 
hoch!
#endif

void uart_init(void)
{
  UBRRH = UBRR_VAL >> 8;
  UBRRL = UBRR_VAL & 0xFF;

  UCSRB |= (1<<TXEN);  // UART TX einschalten
  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);  // Asynchron 8N1
}

int main(void)
{
    uart_init();

    while(1)
    {
      while (!(UCSRA & (1<<UDRE)))
      {}
      UDR = 'a';
  }

  return 0;
}

Lg Lukas

von Jim M. (turboj)


Bewertung
0 lesenswert
nicht lesenswert
Da ist kein DDRx drin, also: Port Pin nicht auf Ausgang gesetzt.
1
#define BAUD 300UL      // Baudrate

So niedrige Baudrate kann auch zu Überlaufen im Teiler führen, denn der 
hat ja nur eine begrenzte Anzahl Bits. Habe ich aber jetzt nicht 
nachgerechnet ob das hier der Fall ist.

von Lukas F. (Firma: BSc.) (lakiluk)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Habe wie gesagt alle Baudraten durchprobiert. Kein Erfolg. Habe nun als 
Einstellung 1200 und Clock 4Mhz verwendet. Im Anhang das Ergebnis auf 
dem Terminal.
Habe nun wie von dir geschrieben DDRD0 (RXD) auf Eingang und DDRD1 (TXD) 
auf Ausgang gesetzt. Dies bewirkt keine Änderung. Ich denke das muss man 
auch nicht explicit machen.

Danke Lg,
Lukas

von Lukas F. (Firma: BSc.) (lakiluk)


Bewertung
0 lesenswert
nicht lesenswert
Niemand eine Idee? ?

von renezimmermann (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Was für ein AVR? Taktteiler gesetzt? Gruß

von Lukas F. (Firma: BSc.) (lakiluk)


Bewertung
0 lesenswert
nicht lesenswert
Benutze einen ATMega16. Die Eistellung des Sw-Clock des Stk500 über 
Atmel Studio habe ich mittlerweile gefunden. Hat aber nichts geändert. 
Was meinst du mit dem Taktteiler? Baudratenregister habe ich gesetzt. 
Code siehe im ersten Beitrag. Sg

von Lukas F. (Firma: BSc.) (lakiluk)


Bewertung
0 lesenswert
nicht lesenswert
Kann es sein, dass der verwendete USB-RS232 Adapter die Probleme 
verursacht? Das Flashen des Controllers funktioniert aber einwandfrei 
darüber.

von Karl B. (gustav)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
lakiluk schrieb:
> Die
> Terminaleinstellungen scheinen nicht das Problem zu sein.

Hi,
mit Hyperterminal hatte ich Probs.
Mit Teraterm nicht.

Lokales Echo -> Haken setzen.



Vom Prog. her:
Also Polling Schleife für URDE ist drin. (Vergess ich immer. Nicht mit 
Interrupt.)

ciao
gustav

von fop (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ein Oszillogramm des TxD Pins würde evtl. auch weiter helfen die 
effektive Baudrate zu bestimmen.
Und nein, hier wird nicht über den Takt der Datenübertragung vom 
Programmer zum Chip geschrieben, die Du wohl im Atmel-Studio gefunden 
hast.
Es geht um die Frequenz, mit der Dein Mikrocontroller arbeitet. Ist das 
nicht der Wert, den Du als F_CPU vorgibst, kann aus der Berechnung nur 
Quark rauskommen. (BTW : gibt der Compiler die Warnung aus, dass F_CPU 
gesetzt werden musste ?)
Dazu wichtig sind die sogenannten Fuse-Bits und je nach diesen, der 
angeschlossene Quarz bzw. Resonator.

von Karl B. (gustav)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
noch ein ASM-Schnipsel.
War immer der Meinung, dass man URSEL nicht anders ansprechen könnte.
Das ist aber schon im Bit-Code des Registers drin, so dass diese Zeile 
überflüssig wird.

ciao
gustav

von Lukas F. (Firma: BSc.) (lakiluk)


Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antworten!

Ein Oszi kann ich leider nicht bieten vom TxD, da ich nur ein analoges 
mein Eigen nenne ;)

Die Takteinstellung (welche ich mittlerweile gefunden habe) die ich 
meinte, ist die Einstellung des Onboard-Clockgenerators des STK500. Beim 
AVR-Studio 4 war dies noch etwas einfacher zu finden. Das ist aber nicht 
das Problem denke ich. Habe nun den Takt des Boards auf 3,686MHZ 
gestellt. Dieser Takt wird an den uC vom Board weitergegeben.

Im C-Code habe ich natürlich die F_CPU nun auch auf diesen Takt 
definiert. Jedoch ohne Erfolg. Immer noch falsche Zeichen.

Terminalprogramme habe ich auch schon mehrere versucht. Also die 
Einstellung stimmt sicher. Immer selbes Ergebnis.

Was mir nun aufgefallen ist, früher hatte ich die UART am AT90s8515 
verwendet (der hat keine FUSE-Bits). Daher nehme ich an, dass ich diese 
falsch gesetzt habe?! Es soll der externe Takt des STK500 verwendet 
werden. Die Fuse-Bits waren auf int. Oszillator gestellt. Habe sie nun 
auf ext. Clock geändert (siehe Anhang). Leider bekomme ich immer noch 
defekte Zeichen. Diese Einstellung sollte aber korrekt sein oder? Am 
STK500 steckt nicht nur ein Quarz, sondern es wird wirklich der 
komplette Takt generiert.

Sg
Lukas

von Stefan ⛄ F. (stefanus)


Bewertung
1 lesenswert
nicht lesenswert
Lass mal eine LED blinken. 500ms an, 500ms aus (mit einfachen 
_delay_ms(500)). Und dann vergleichst du mit einer Stoppuhr, ob die Zeit 
tatsächlich stimmt.

von Lukas F. (Firma: BSc.) (lakiluk)


Bewertung
0 lesenswert
nicht lesenswert
Danke @stefanus!

Beim Include der avr/delay.h ist mir aufgefallen, dass der Include nach 
Setzen von F_CPU geschehen muss. Gleiches gilt für den Include der 
io.h...

Somit funktioniert nun alles :)

Danke nochmal an alle!

Lg
Lukas

von Stefan ⛄ F. (stefanus)


Bewertung
1 lesenswert
nicht lesenswert
F_CPU gehört nicht in den Quelltext, sondern in die Projektkonfiguration 
als "Definition" bzw. in das Makefile, damit der Compiler so aufgerufen 
wird:

avr-gcc -DF_CPU=16000000 ...

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]
  • [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.