www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega88 - AVR Studio


Autor: Guillermo Benites (benites)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Guillermo Benites (benites)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Guillermo Benites (benites)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Hartmut Gröger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

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

...

Autor: Guillermo Benites (benites)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Hartmut Gröger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

MfG HG

Autor: Cosmic (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Cosmic (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Cosmic (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Cosmic (Gast)
Datum:

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

Autor: TravelRec. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.