ATmega88 - AVR Studio

OP #266672
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
Angehängte Dateien:
#266675
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.

...
OP #266676
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
#266677
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.

...
Gast #266678
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
Gast #266683
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?
#266684
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.

...
Gast #266688
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ß.

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