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_tubrr=(MCU_XTAL/(16L*baudrate*100L));
Ich übergebe die baudrate in 100bps. also für 9600 übergebe ich 96...
Grüße,
Thomas
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
--
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
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
voidusb_init(uint16_tbaudrate)
2
{
3
uint16_tubrr=(MCU_XTAL/(16L*baudrate*100L));
4
/* Set Baudrate */
5
UBRRH=(unsignedchar)(ubrr>>8);
6
UBRRL=(unsignedchar)(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
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