Forum: Compiler & IDEs UART mit STK500 Beispiel bitte


von Markus N. (roboscan)


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:
1
#include <avr/io.h>
2
3
int main(void)
4
{
5
while(1)
6
{
7
8
  UCR |= (1<<TXEN);  //Transmitter Enabled
9
10
  UBRR = 3686000 / (9600 * 16L) - 1;
11
12
  while (!(USR & (1<<UDRE)))
13
  {
14
    UDR = 'x';
15
  }
16
}
17
}

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.

von pebisoft (Gast)


Lesenswert?

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

von A.K. (Gast)


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.

von Markus N. (roboscan)


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?

von A.K. (Gast)


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").

von Markus N. (roboscan)


Lesenswert?

So also dann hab ich den Code jetzt so umgeschrieben
1
#include <avr/io.h>
2
3
int main(void)
4
{
5
6
7
  UCR |= (1<<TXEN);  //Transmitter Enabled
8
  UBRR = 3686000 / (9600 * 16L) - 1;
9
10
11
  while(1)
12
  {
13
    while (!(USR & (1<<UDRE)))
14
    UDR = 'x';
15
  }
16
}

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?

von A.K. (Gast)


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...

von A.K. (Gast)


Lesenswert?

Unfug. 0,5Hz, 1sec an, 1sec aus.

von Markus N. (roboscan)


Lesenswert?

Also wenn ich alle 10.000 UART Bytes blinken lasse dann ist das ca
0,5HZ
1
#include <avr/io.h>
2
#include <stdint.h>
3
4
uint16_t z;
5
6
int main(void)
7
{
8
9
10
  UCR |= (1<<TXEN);  //Transmitter Enabled
11
  UBRR = 3686000 / (9600 * 16L) - 1;
12
13
  DDRB = 0xFF;
14
  PORTB = 0xFF;
15
16
  while(1)
17
  {
18
    z++;
19
    if (z >= 10000)
20
    {
21
      z = 0;
22
      if (PORTB == 0xFF)
23
      {  PORTB = 0x00;}
24
      else
25
      {   PORTB = 0xFF;}
26
    }
27
28
    while (!(USR & (1<<UDRE)))
29
    UDR = 'x';
30
  }
31
}

von Markus N. (roboscan)


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.

von A.K. (Gast)


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.

von Markus N. (roboscan)


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.

von Markus N. (roboscan)


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.

von A.K. (Gast)


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 ;-).

von Markus N. (roboscan)


Lesenswert?

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

von A.K. (Gast)


Lesenswert?

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

von castle (Gast)


Lesenswert?

weil deine header-datei vom chip etweder das eine oder nur das andere
kennt.

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.