Forum: Mikrocontroller und Digitale Elektronik ATmega88 - AVR Studio


von Guillermo B. (benites)


Angehängte Dateien:

Lesenswert?

Hallo,

kann jemand mir erklären, wieso folgender code bei ATmega88 nicht
klappt?
zB: Um den Sendekanal des UART des Atmega8 zu aktivieren, muss das Bit
TXEN im UART Control Register UCSRB auf 1 gesetzt werden. d.h

   sbi UCSRB,TXEN       ; TX aktivieren

Aber das gleiche muss für den ATmega88 gelten, oder? und so habe ich
geschriben.

   sbi UCSR0B,TXEN0     ; TX aktivieren

aber geht nicht.


Gruß
Benites

PS: anbei mein asm Code

von Hannes L. (hannes)


Lesenswert?


von Guillermo B. (benites)


Angehängte Dateien:

Lesenswert?

Hallo Hannes,

Anbei schicke ich Dir mein Programm. Dies ist schon kompiliert und
einwandfrei. Aber ich bekomme nichts mit Hyperterminal. Woran kann das
liegen???

Gruss
Benites

von Hannes L. (hannes)


Lesenswert?

- Stimmt die Taktfrequenz des AVRs mit der im Quelltext angegebenen
überein? Mal zum Test einen Portpin klappern lassen und nachmessen.
- Stimmen die Übertragungsparameter auf beiden Seiten überein?


Also ich habe jetzt nicht den gesamten Code anhand des Datenblattes
überprüft, aber ich kann nicht nachvollziehen, was (und warum das) du
in serout machst. Wenn du schon so (ohne Int) programmierst, dann
solltest du darauf achten, dass du erst Daten ins UDR (UDR0) schreibst,
wenn dies auch leer ist. Du musst der UART schon Zeit zum Senden
lassen.

Hier als Beispiel die Zeichensenderoutine eines Programms auf
ATMEGA8535, die Register liegen noch im I/O-Bereich und sind mit
IN/OUT, SBI/CBI erreichbar, müsstest du auf Extended-I/O umstellen
(LDS/STS):

pc_data:                ;sendet das Byte in wl über RS232
 sbis UCSRA,UDRE            ;TX-UDR leer? ja...
 rjmp pc-1                  ;nein, nochmal prüfen...
 out udr,wl                 ;Byte an PC senden
 ret

Diese Variante (Busy-Warteschleife) geht natürlich nur, wenn der AVR
während der Übertragung nix Anderes zu tun hat. Liegen noch andere
Tasks gleichzeitig an, so sollte man die Ausgabe über Ringbuffer und
Interrupt organisieren.

...

von Guillermo B. (benites)


Lesenswert?

Hallo Hannes,
Danke für den Tipps. Taktfrequenz des AVRs sowie Übertragungsparameter
stimmen überein.

Anderseits habe ich auch so ausprobiert, aber nichts :-(

serout:
    =>  sbis UCSR0A,UDRE0
        rjmp pc-1
        sts UDR0, temp
        ret


bekomme folgende Fehlermeldung, wo markiert mit "=>" ist:

error: Operand 1 out of range: 0xc0
Assembly failed, 1 errors, 0 warnings

Danke im Voraus
Benites

von Hannes L. (hannes)


Lesenswert?

Dann schau mal, an welcher Adresse USCR0A liegt und welchen
Adressbereich man sbis/sbic testen kann bzw. mit sbi/cbi manipulieren
kann...

Vielleicht verstehst du nun, warum ich die 8er Serie nicht besonders
mag und wie ich zu der Vermutung komme, die Entwickler seien besoffen
gewesen.

Tip: Mit der F1-Taste gibts im AVR-Studio Hilfe zu dem Befehl unter dem
Cursor... Damit kann man auch erfahren welche Befehle welche
Einschränkungen haben.

...

von Hartmut Gröger (Gast)


Lesenswert?

Hi

UDSR0A liegt nicht im I/O Bereich und kann nicht mit SBIS angesprochen
werden. Der Wert muss erst in ein Register geladen werden.


aaa:    lds r16,UDSR0A
        sbrs r16,UDRE0
        rjmp aaa
        sts UDR0,temp

MfG HG

von Hannes L. (hannes)


Lesenswert?

Hätt' ich zwar auch schreiben können, aber ich wollte Hilfe zur
Selbsthilfe geben... - Sorry...

...

von Guillermo B. (benites)


Angehängte Dateien:

Lesenswert?

hallo ihr zwei,
vielen Dank für die Unterstützung.

nur eine kleine korrektur: mit UDSR0A habe ich folgende Fehlermeldung:

error: Undefined symbol: UDSR0A
Assembly failed, 1 errors, 0 warnings

musste sein: UCSR0A

Anbei mein Code (einwandfrei)

Gruss
Benites

von Hartmut Gröger (Gast)


Lesenswert?

Hi

Ich hatte nicht im Datasheett nachgesehen, sondern deine Registernamen
benutzt.

MfG HG

von Cosmic (Gast)


Lesenswert?

Hab im Moment das gleiche Problem wie Benites oben. Der Code läuft, aber
ich bekomme nichts mit Hyperterminal. Ich benutze den ATMega88 mit dem
STK500. Hat jemand ne Idee?

von Cosmic (Gast)


Lesenswert?

Jetzt kommt ein bisschen was bei HT an, aber nur mist (z.B.:
8Àýþøøøø8ÀÀ88ÀÀ8888þøøø8þøøø8ÀÀ88þøøø8ÀÀ88øø8ÀÀ8888þøøø8ÀÀ88øø8ÀÀ888 
88þÀ)
Ich tippe mal auf irgend ein Timingproblem, aber wie bekomme ich das
weg?

von Hannes L. (hannes)


Lesenswert?

> Ich tippe mal auf irgend ein Timingproblem, aber wie bekomme ich
> das
> weg?

Indem du auf beiden Seiten die exakt gleiche Baudrate einstellst.

Dazu gehört auch, dass der AVR mit einem baudratentauglichen Quarz
betrieben wird. Der Anschluss des Quarzes alleine reicht noch nicht,
man muss dem AVR auch sagen, dass er ihn auch benutzen soll (Fusebits),
sonst werkelt er mit dem ungenauen internen Taktgeber weiter.

...

von Cosmic (Gast)


Lesenswert?

Welches Fusebit muss ich denn da setzen? Es gibt da über 50
Möglichkeiten. Und es werden damit ja auch immer die Einstellungen für
CKSEL und SUT verändert.

von Hannes L. (hannes)


Lesenswert?


von Cosmic (Gast)


Lesenswert?

Problem hat sich gelöst. Es waren nicht die Fusebits. Bei einer Bautrate
von 4800 klappts, darüber nicht mehr.

von TravelRec. (Gast)


Lesenswert?

Dann passen die Taktraten (und somit die Baudraten) beim Atmel nicht zu
denen des PC. Nimme ´nen externen Baudratenquarz und guck mal in die
Baudratentabelle des AtMegas (Datenblatt), was bei den UBRR-Registern
eingestellt werden muß.

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.