Forum: Mikrocontroller und Digitale Elektronik Atmel Evaluationsboard von Pollin, Probleme mit RS232


von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

bin neu hier und habe mich seit 2 Monaten mit dem Board beschäftigt. 
Jetzt habe ich mir ein Programm geschrieben, das die Eingänge INT0 und 
INT1 benutzt und damit 2 Zähler hochzählt.

Diese Zähler möchte ich gerne mit der RS232 Schnittstelle auslesen.

Das Programm hochladen ging problemlos mit dem STK500-ISP. Die serielle 
Schnittstelle hat aber gleich mal Probleme bereitet. Ich mußte bis auf 
9600 Bps runtergehen, damit das Board ordentliche Signale ausgibt.
Vorgegeben war ein MAX232(N) von Texas Instruments und wurde mit 4 10uF 
Kondensatoren bestückt. Im Datenblatt des Chips standen alle angegebenen 
Werte bezogen auf eine Beschaltung mit 1uF Kondensatoren. Ich könnte mir 
vorstellen, daß deshalb die Flanken zu flach waren (Oszibild 
115200bps_c.PNG)

Bei 9600 Bps, hat mein hyperterm schon mal verstanden, was das Board 
spricht, aber anders herum tut's irgendwie nicht.
Wenn ich ein I\r sende soll er mir die Zählerstände liefern, das tut er 
aber nicht. Irgendwie scheint er mich nicht zu verstehen.

Wie kann ich schauen was er denn empfängt?
Egal wo im Programm ich etwas sende, das Funktioniert, aber es scheint 
daß die Abfrage
1
if (!(UCSRA & (1<<RXC)))  // do if data received
 nicht TRUE wird. Ich habe zum debuggen darin eine LED anmachen wollen, 
die geht aber nicht an...

Hat jemand eine Idee, wie ich das debuggen kann? Geht hier nur noch 
JTAG?

Wenn er tatsächlich nichts bekommt, kann es an der Baudrate liegen?
(CPU-Frequenz: 16MHz Teiler war glaube ich 191)
1
uint16_t ubrr = ( MCU_XTAL / (16L * baudrate * 100L) );

Ich übergebe die baudrate in 100bps. also für 9600 übergebe ich 96...

Grüße,
Thomas

von michael_h45 (Gast)


Lesenswert?

Ganzen Code zeigen...
Warum nimmst du das mistige Pollin-Board, wenn du ein STK500 hast?

von spess53 (Gast)


Lesenswert?

Hi

Bist du b100%-ig sicher, das dein AVR mit den 16MHz läuft?

115200BD ergeben übrigens bei 16MHz schon untolerierbare 3,5% 
Baudratenfehler.

MfG Spess

von Hans M. (Firma: mayer) (oe1smc) Benutzerseite


Lesenswert?

hallo Thomas

ich habe auch das pollin board und hoehere baud-raten als 9600 sind kein 
problem. allerdings habe ich nie die 10 uF bestueckt, sondern gleich 1 
uF genommen, so wie im datenblatt beschrieben.

debuggen mit einer LED ist eine durchaus gaengige methode.

@Spess, wenn der uC noch auf den internen 1 MHz lauft, wuerde wohl gar 
nichts gehen, nicht einmal 9600 bd, oder ?

gruss
hans

--

von Thomas (Gast)


Lesenswert?

Hi Michael, hi Spess

das STK500 Board habe ich nicht, ich habe ein ISP-STK500, also nur das 
In-System-Programming Kabel. Sorry..

Das mit den 16Mhz bin ich mir zu 99% sicher ;-)

zumindest macht mein Timer 1ms
1
ISR(TIMER0_COMP_vect)
2
{
3
  timestamp++;
4
  if (timestamp > 59999)
5
  {
6
        timestamp = 0;
7
  }
8
9
  if (CounterInject & 0x0001)
10
  {
11
    if (PORTD & 0x40)
12
    {
13
      PORTD &= 0xBF;
14
      }
15
    else
16
    {
17
      PORTD |= 0x40;
18
    }
19
  }
20
21
}

die Ausgabe habe ich auf dem Oszi gemessen, sollte also jede 
Millisekunde toggeln. Paßt so weit auf dem Oszi, wie weit es abweicht 
habe ich nicht gemessen, aber weniger als ein 100stel..
CounterInject wird von einem der beiden INTx Anschlüsse gezählt, damit 
kann ich bei ungeraden Timerwerten an der LED (CPU-Frequenz / (2 * 250)) 
messen. Da OCR0 = 250...

@Spess: Was heißt 3,5% Baudratenfehler? 3,5% der Daten sind falsch, die 
ankommen oder 3,5% Abweichung der Bitzeit wird nicht toleriert?

Grüße,
Thomas

von Thomas (Gast)


Lesenswert?

Hallo Hans,

es sieht so aus, als würde ich an meinem Mega32 nichts empfangen, das 
was er sendet kommt am hyperterminal an, inzwischen auch bei 115200 Bps.

Mir ist gerade eingefallen, daß ich wüst an den Baudraten gestern 
rumprobiert habe und die falsche CPU-Frequenz eingestellt habe.

Also tut, aber nur in eine Richtung AVR-Board => PC
PC => AVR-Board tut nur sporadisch... Entweder ist der Atmel hin oder 
mit dem Timing stimmt was nicht...

Mein Init sieht so aus:
1
void usb_init(uint16_t baudrate)
2
{
3
    uint16_t ubrr = ( MCU_XTAL / (16L * baudrate * 100L) );
4
  /* Set Baudrate */
5
  UBRRH = (unsigned char)(ubrr>>8);
6
  UBRRL = (unsigned char)(ubrr);
7
  /* set normal asynchronous mode */
8
  UCSRA = 0;
9
  /* enable receiver and transmitter */
10
  UCSRB = (1<<RXEN)|(1<<TXEN);
11
  /* set frame format */
12
  UCSRC = (1<<URSEL)|(3<<UCSZ0);
13
}

Im Beispiel von Atmel wurden 2 Stopbits konfiguriert, die wollt ich 
nicht, soll ich die wieder reinmachen?

Grüße,
Thomas

von michael_h45 (Gast)


Lesenswert?

michael_h45 schrieb:
> Ganzen Code zeigen...
Denn rat mal, wo dein Fehler liegt...

von M. W. (hobbyloet)


Lesenswert?

michael_h45 schrieb:
> Warum nimmst du das mistige Pollin-Board, wenn du ein STK500 hast?

Lesen musst Du lernen, er hat kein STK500.

von Thomas (Gast)


Lesenswert?

Hallo an alle,

danke für die Hilfe und die Tipps.
Hab meinen Fehler gefunden:
Folgende Zeile war falsch:
1
if (!(UCSRA & (1<<RXC))) // do if data received
es müßte heißen:
1
if ((UCSRA & (1<<RXC))) // do if data received

deshalb hat es nicht funktioniert. Ich habe immer da Byte abgeholt,
wenn RXC nicht gesetzt war, da konnte es natürlich sein, daß das Byte in
dem Moment in den Buffer geschrieben wird, in dem ich es abhole.
Somit hat das sporadisch funktioniert, aber die Wahrscheinlichkeit,
den Zeitpunkt so zu treffen war sehr gering.

Tja kaum macht man es richtig - funktioniert es auch...

Grüße und nochmals Danke sowie frohe Ostern!
Thomas

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.