www.mikrocontroller.net

Forum: Compiler & IDEs UART mit STK500 Beispiel bitte


Autor: Markus Neubauer (roboscan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi.
Ich versuche gerade mit einem AT09S2313 und dem AVR-GCC Tutorial daten
an den Comport meines Rechners zu schicken.
Hat da irgendjemand ein Beispiel in C für mich das einfach nur ein
Zeichen sendet?
Bei mir kommt einfach nix an.
Am STK 500 habe ich die Brücke von PortD0 & 1 auf RS232 Spare gesetzt.

Mein Code schaut so aus:

#include <avr/io.h>

int main(void)
{
while(1)
{

  UCR |= (1<<TXEN);  //Transmitter Enabled

  UBRR = 3686000 / (9600 * 16L) - 1;

  while (!(USR & (1<<UDRE)))
  {
    UDR = 'x';
  }
}
}

Ich bin echt am verzweifeln.
Also der comport funktioniert da ich gerade meinen Laptop zum testen
per 0-Modem Kabel dranngehängt habe und dort kann ich Daten empfangen.

Autor: pebisoft (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kauf dir ein vernünftiges board und nicht so ein scheiss teures stk500.
es gibt nur probleme damit.
geht wesentlich biliger und besser.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Markus: Foren-Trolle gibt's leider überall.

Erst warten:
 while (!(USR & (1<<UDRE))) ;
und dann senden.

In der Wartschleife zur UART auch noch zu senden, ergibt nicht viel
Sinn.

Autor: Markus Neubauer (roboscan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh danke A.K.
hatte dich total übersehen.
Das hab ich jetzt zwar geändert aber es kommmt trotzdem nix an.
Gib es irgendwo ein Beispiel für das "so teure" STK500 in C das schon
getestet wurde?
Hab hier im Forum nix in C finden können und irgendwie schaff ich's
net den Assembler code auf meinen µC richtig aufzuspielen.
Ist die Verkabelung korrekt? Braucht RS-232 normalerweiße nicht noch
PINS die das empfangen z.B. erlauben?

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, dann weiter: Unveränderliche Parameter setzt mal einmal und lässt
sie dann in Ruhe (UCR, UBRR). Auch das gehört nicht eine Schleife.

Vorsichtshalber erwähnt: Die Daten landen auf dem zweiten Sub-D
Anschluss ("SPARE"), nicht auf dem, mit dem das Programm aufgespielt
wird ("CTRL").

Autor: Markus Neubauer (roboscan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So also dann hab ich den Code jetzt so umgeschrieben

#include <avr/io.h>

int main(void)
{


  UCR |= (1<<TXEN);  //Transmitter Enabled
  UBRR = 3686000 / (9600 * 16L) - 1;


  while(1)
  {
    while (!(USR & (1<<UDRE)))
    UDR = 'x';
  }
}

Jup stecke zum testen immer auf den Spare anschluss um.

Kann es sein das irgendwas mit der Taktfrequenz nicht stimmt?
Ich habe aber 3,686MHz im AVR Studio eingestellt.

Mir ist nur gestern als ich etwas mit Timern getestet habe aufgefallen
das ich die LEDs bei 1024tel des CPU Taktest schon blinken gesehen
habe. Das dürfte doch nicht sein oder?

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie sieht es bei den Jumpern aus? Es gibt ja welche, die den Takt an den
Controller ranführen (OSCSEL, XTAL1). Und wurde der Takt auch in den
STK500 geschrieben (bloss im Dialogfeld klicken langt nicht, da muss
auch ein "Write" hinterher)?

Aber den Takt kannst Du ja mal kontrollieren. Wenn Du für jeweils 1000
per UART gesendete Bytes einmal eine LED umschaltest, müsste da
ungefähr ein 0,5sec-Takt rauskommen. Wenn nicht...

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Unfug. 0,5Hz, 1sec an, 1sec aus.

Autor: Markus Neubauer (roboscan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also wenn ich alle 10.000 UART Bytes blinken lasse dann ist das ca
0,5HZ
#include <avr/io.h>
#include <stdint.h>

uint16_t z;

int main(void)
{


  UCR |= (1<<TXEN);  //Transmitter Enabled
  UBRR = 3686000 / (9600 * 16L) - 1;

  DDRB = 0xFF;
  PORTB = 0xFF;

  while(1)
  {
    z++;
    if (z >= 10000)
    {
      z = 0;
      if (PORTB == 0xFF)
      {  PORTB = 0x00;}
      else
      {   PORTB = 0xFF;}
    }

    while (!(USR & (1<<UDRE)))
    UDR = 'x';
  }
}


Autor: Markus Neubauer (roboscan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich UBRR = 3686000 ändere in z.B.
UBRR = 2000000 dann müsste sich doch auch die blinkfrequenz von meinen
LEDs ändern oder?
Das tut sie aber nicht. Die bleibt konstant.
Den Jumper OSCSEL habe ich nach rechts gesetzt also das er das On-Board
Software signal verwendet.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das passt hinten und vorne nicht, dazu müsste der Proz mit 36MHz laufen
;-). 9600 Bits pro Sekunde sind 960 Byte pro Sekunde, nicht 9600.

Freilich: Dein UDR='x' sitzt immer noch in der inneren Schleife drin.
Da fehlt ein klitzekleines Semikolon hinten an der while-Schleife. Guck
nochmal genau in das Tutotial.

Auch an anderer Stelle hast Du beim abtippen aus dem Tutotial zu viel
eingespart. Die obige Baudratenrechnung rundet nämlich ab, d.h. es
kommen 22,99 = 22 dabei raus, nicht die nötigen 23. Diese Abweichung
ist für RS232 zu gross. Im Tutorial steht ja auch 3686400.

Autor: Markus Neubauer (roboscan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LOL
Ich hab jetzt mal
//while (!(USR & (1<<UDRE)));
durch
while ((PIND & 1<<6)); wobei das einfach ein Schalter ist.
Wenn ich den Schalter drücke, werden meine Daten gesedet g

Also ist definitiv ein Fehler in der Zeile
"//while (!(USR & (1<<UDRE)));"

ach und danke für ; den hatte ich trottel vergessen.

Autor: Markus Neubauer (roboscan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OHHHH ICH TROTTTTTTEL

Fehler gefunden

Richtig ist:
while (!(USR & (1<<UDRIE)))

Und ich hatte:
while (!(USR & (1<<UDRE)))


Was so ein i alles bewirken kann.



Aber 1000Dank für deine Hilfe A.K.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nö. Das war vorher besser. UDRIE ist das Interrupt-Enable-Bit und liegt
in UCR, nicht in USR. Allerdings an genau der gleichen Stelle, weshalb
es faktisch egal ist und nur zur Verwirrung des Programmierers
beiträgt. Denn ob Du nun
  while (!(USR & (1<<5)))
schreibst, oder
  while (!(USR & (1<<5)))
macht ja keinen grossen Unterschied ;-).

Autor: Markus Neubauer (roboscan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber warum geht es dann so mit dem I und ohne I nicht?

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil's unweigerlich einen anderen Grund gibt. Sowohl UDRIE also auch
UDRE stehen gleichermassen für die Zahl 5.

Autor: castle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
weil deine header-datei vom chip etweder das eine oder nur das andere
kennt.

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.