UART mit STK500 Beispiel bitte

OP #284500
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.
OP #284503
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?
Gast #284504
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").
OP #284505
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?
Gast #284506
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...
OP #284508
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
}
Gast #284510
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.
OP #284511
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.
Gast #284513
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 ;-).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren