Hallo zusammen,
ich habe auf der Atmel Seite unter
http://www.atmel.com/dyn/products/app_notes.asp?family_id=607
eine wie ich finde sehr gute USART Interrupt gesteuerte Routine in C
gefunden. Diese habe ich nun für meinen ATMEGA8 umgeschrieben. Leider
kommt nichts zurück. In HTerm und HTerminal stelle ich folgendes ein:
Baudrate 19,2 k
Databits = 8
Stopbits = 1
Ich habe den CHip auf der STK500 und verbinde ihn mit meinem Laptop über
die 2te Rs-232 Schnittstelle.
// Das ist die Headerfile USART.h ////////////////////////////////
Ok jetzt hab ich meinen Kopf aus dem "A..." gezogen und auf der STK die
Leitungen verbunden. Hatte ich gestern abgesteckt, argh !
So nun kommt was an aber nicht das gewünschte.
Im HTerminal hab ich folgende Einstellungen:
Baudrate 19,2 k
Databits = 8
Stopbits = 2
Und die USART_Init hab ich folgendermassen abgeändert.
Wenn ich (1<<URSEL) nicht auf eins setze bevor ich UCSRC beschreibe
krieg ich kein Signal, ist ja auch so im DB beschrieben. Ich bekomme im
Hterminal eigentlich immer ein "@" Zeichen oder für die meisten ASCII
Zeichen ein "0xC0".
Grüsse
Matthias
> Baudrate 19,2 k> USART_Init( 11 );
bedeutet, dass du mit 3,6864 MHz Prozessortakt arbeiten willst. Hast du
das STK500 auch so eingestellt (XTAL1, OSCSEL Jumper und Einstellung im
AVR Studio)?
Vielleicht kann das noch weiterhelfen.
Der Compiler gibt mir folgende Warnung raus:
"USART_RxBuf defined but not used"
"USART_TxBuf defined but not used"
Versteh das nicht ?
Grüsse
Matthias
Also ich bin ehct ratlos, habe jetzt den Polling Modus gemacht, da geht
auch nichts, versteh das einfach nicht, jetzt kommen immer nur die
Zeichen 0xC0 oder 0xF8 an. Echt frustrierend und hier weiss anscheinend
auch keiner Bescheid.
Grüsse
Matthias
Matthias wrote:
> Der Compiler gibt mir folgende Warnung raus:>> "USART_RxBuf defined but not used"> "USART_TxBuf defined but not used">> Versteh das nicht ?
Was ist daran nicht zu verstehen? Es sind zwei Puffer-Arrays definiert,
die in Deinem Programm aber nicht benutzt werden...
Den ATmega8 hast du auch umgestellt vom 1-MHz-RC-Oszillator auf
externen Takt, ja?
UCSRC brauchst du übrigengs nicht anfassen, wenn du das
Standardframing 8N1 benutzt.
Matthias wrote:
> USART_RxBuf[tmphead] = data;>> in USART.c wird in der ISR verwendet.. und> USART_TxBuf auch.
Sind aber in USART.c "static" deklariert und damit nur innerhalb
dieses Moduls sichtbar. Die ISR liegt offenbar woanders. Aber
solange du uns keinen geschlossen compilierbaren Code zeigst,
kann man hier nur die Kristallkugel befragen.
Matthias wrote:
>>Den ATmega8 hast du auch umgestellt vom 1-MHz-RC-Oszillator auf>>externen Takt, ja?> ? Hab den internen Takt der STK 500 mit 3,86....
Woher weiß das aber dein ATmega8? Den interessiert das einfach
gar nicht, was an seinem XTAL1 passiert, solange du ihm nicht die
low fuse änderst.
>Aber solange du uns keinen geschlossen compilierbaren Code zeigst,>kann man hier nur die Kristallkugel befragen.
Naja also die USART.C mit USART.h und dem MainProgramm ist doch normale
C-Syntax.
Zusammen würde das dann so lauten:
Das heisst ich muss dem ATMEGA8 noch sagen, dass er den Takt von XTAL1
nehmen soll und nicht einen eigenen Takt. Meinst du das so, dass hab ich
nicht gewusst. Dachte Standardeinstellung wäre das ein uC auf XTAL1
hört.
Matthias wrote:
> Das heisst ich muss dem ATMEGA8 noch sagen, dass er den Takt von XTAL1> nehmen soll und nicht einen eigenen Takt. Meinst du das so,
Ja.
> dass hab ich> nicht gewusst.
RTFDatasheet.
> Dachte Standardeinstellung wäre das ein uC auf XTAL1> hört.
Wie hieß der Spruch früher so schön? ,,Überlass das Denken den
Pferden, die haben einen größeren Kopf.'' ;-)
Im Ernst: mit dem Datenblatt solltest du dich schon befassen. In diesem
Falle mit dem Kapitel über die Takterzeugung.
>Wie hieß der Spruch früher so schön? ,,Überlass das Denken den>Pferden, die haben einen größeren Kopf.'' ;-)
Das is aber nett von dir. Da die Pferde ja jetzt für mich denken,
könntest du mir ja sagen in welchen Registern ich was zu setzen habe um
das ganze mit dem internen Takt der STK 500 zu betreiben.
Grüsse
Matthias
Matthias wrote:
> Das is aber nett von dir.
Daher ja auch der Smiley.
> könntest du mir ja sagen in welchen Registern ich was zu setzen habe um> das ganze mit dem internen Takt der STK 500 zu betreiben.
Du musst die low fuse passend einstellen. Sie steht per default auf
0xe1. Eine Möglichkeit, die das gewünschte Ziel errreicht ist, sie
auf 0xe0 zu setzen.
Und woher weißt du nun, wie du das beim nächsten Mal beim nächsten
AVR rausfindest wenn du dir gar nicht die Mühe machst, mal selbst ins
Datenblatt zu gucken?
Ich hab das Datenblatt die ganze Zeit neben mir und werd jetzt nachsehen
wo ich deine Lösung finden kann. Das hat mehr Wert, als ständig im
Dunkel zu tappen. Worte wie "low fuse" sagen mir eben gerade nichts.
Aber jetzt weiss ich wonach ich suchen muss.
Matthias wrote:
> Sind das die CKSEL Fuses
Ja, das sind die entscheidenden dabei, die unteren 4 Bits der low
fuse. Im Prinzip kannst du auch beliebige Varianten von internem
Quarzoszillator einstellen, da diese auch alle ihren Takt an XTAL1
einlesen, aber 0xe0 (also CKSEL = 0) ist die offizielle Variante
für den externen Takt.
Ist das OSCCAL Register dann das richtige.
Wenn ja würde ja ein
[c]
OSCCAL = 0xE0;
[c/]
richtig sein. Allerdings bringt das nicht den gewünschten Effekt.
> Ist das OSCCAL Register dann das richtige.
Das ist nur für den internen RC-Oszillator interessant, aber gerade
den willst du ja nicht nehmen.
Die Fuses sind keine Register. Die stehen im Abschnitt "Memory
programming", weil man sie nur über die Programmierschnittstelle
einstellen kann. Das laufende Programm kann die Fuses nicht
ändern.
Habn nun folgenden Satz in der STK 500 ANleitung gefunden:
"When using the STK500 software-generated clock system as main clock,
the target
AVR microcontroller fuses should be configured for “external clock” as
clock source."
Also als normaler externer Clock einstellen, was für die low-Bits 0000
bedeuten würde. Start-TIme hätte ich auf 10 gesetzt, um Fehler zu
vermeiden.
So nun wieder in der Arbeit, alles an der STK eingestellt und siehe da.
Das Programm funktioniert 1 a. Ich danke dir Jörg für die Geduld und
die Hilfe. Und das mit den Fuses hab ich auch theoretisch und in diesem
Fall jetzt auch praktisch kapiert.
Grüsse
Matthias