mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART-Beispiel am ATmega16


Autor: Helli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe das UART-Beispiel vom AVR-Tutorial ausprobiert, wenn ich
Hyperterminal (mit den richtigen Einstellungen) starte, tut sich aber
überhaupt nichts?!?

Habe auch 4MHz-Takt, Modemkabel (kein Nullmodem) angeschlossen,
HyperTerminal-Einstellungen sind 9600,8,n,1, keine Flussteuerung.

Einziger Unterschied ist, das das Beispiel für einen ATMmega8
geschrieben ist und ich einen ATMega16 verwende...

Idee?

Autor: Helli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hat keiner einen Vorschlag, suche mich schon wund...

Autor: mmerten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch die Fusebits für externen Oszillator gesetzt? Default ist bei
Auslieferung intern 1 MHz.

Autor: Helli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bin noch relativ neu in der materie, wo kann ich die fusebits setzen?

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gib mal in der Suchmaschiene hier auf der seite Fusebits ein, da kriegst
du ne ganze menge antworten.

Autor: Helli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab ich schon gemacht, aber auch gelesen, dass man damit sehr vorsichtig
umgehen sollte.

Meine Einstellungen (verwende den ATMega16 mit 4MHz):

0 CKSEL0
X CKSEL1
X CKSEL2
X CKSEL3
X SUT0
0 SUT1
0 BODEN
0 BODLEVEL(0)
0 BOOTRST
X BOOTSZ0
X BOOTSZ1
0 ESAVE
0 CKOPT
X SPIEN
X JTAGEN
0 OCDEN

Was müßte ich jetzt ändern??

Nochmals vielen Dank
Helli

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://213.203.244.47/mikrocontroller.net/images/a...

Das gilt auch für den mega16 denke ich. JTAGEN würde ich übrigens auch
abstellen. Und Finger weg von SPIEN! ;)

Autor: Helli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funktioniert mit diesen Einstellungen auch nicht :-(
Geh jetzt nach hause, werde am Montag weitersuchen...

Danke jedenfalls...

Autor: Helli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, nach langen weiterem Suchen habe ich es noch immer nicht
zusammengebracht, dass mir der ATMega16 'Test' zum Hyperterminal
schickt, weiß nicht mehr was ich nocht tun könnte, vielleicht hat
jemand den ATMega16 bei dem dieses Beispiel funktioniert?

PS: Habe den ATMega16 alsauch die Entwicklungsplatine von
shop.mikrocontroller.net bezogen...

Danke und Grüße
Helli

Autor: Helli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt habe ich den umgekehrten Weg versucht, d.h, schalte zuerst die Led
an PortB ein, sobald ein Zeichen über die RS232 (HyperTerminal)
empfangen wird, müßte die Led ausgehen...

Tut sie aber nicht???
Hier der Code:


.include "m16def.inc"

.def temp = R16

        ldi temp, RAMEND                 ; Stackpointer initialisieren
        out SPL, temp

        ldi temp, 0xFF                   ; Port B = Ausgang
        out DDRB, temp
        ldi r19, 0x00
        out PORTB, r19                   ; ... Led an Port B ein.

        sbi UCSRB, RXEN                   ; RX (Empfang) aktivieren
        ldi temp, 4000000/(9600*16)-1     ; Baudrate 9600 einstellen
        out UBRR, temp
        ldi temp, LOW(UBRR)
        out UBRRL, temp
        ldi temp, HIGH(UBRR)
        out UBRRH, temp

receive_loop:
        sbis UCSRA, RXC                   ; warten auf Byte
        rjmp receive_loop
        in temp, UDR                      ; empf. Byte > temp kopieren
        ldi r19, 0xFF
  out PORTB, r19                    ; ... Led an Port B aus
        rjmp receive_loop                 ; zurück zum Hauptprogramm


Hat noch jemand Tipps?
Danke Helli

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Stackpointer-Initialisierung ist kaputt! Der mega16 hat > 256 Byte
RAM, also muss auch SPH initialisiert werden:


        ldi temp, LOW(RAMEND)
        out SPL, temp
        ldi temp, HIGH(RAMEND)
        out SPH, temp

Autor: Pete (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um den Empfang zu aktivieren sollte es wohl
sbi UCSRB,(1<< RXEN) heissen.

Autor: Pete (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uups, sorry,da hab ich mich glatt verlesen mit dem SBI , hab nur schnell
drüber gekuckt und dachte es wär ein LDI

Autor: Helli (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Bekomme bei meinem ATMega16 (4MHz) am Terminal-Programm nur wirre
Zeichen bei folgendem Code.
Terminalprogramm ist aber eingestellt auf 9600,8,n,1
LOCK- und FUSE siehe Anhang...


.include "m16def.inc"         ;bzw. 2333def.inc
.def temp = r16
.equ UUU = 4000000/(9600*16)-1
    ldi temp, LOW(RAMEND)
    out SPL, temp
    ldi temp, HIGH(RAMEND)
    out SPH, temp

    sbi UCSRB, TXEN                 ;TX aktivieren
    ldi temp, UUU   ;Baudrate 9600 einstellen
    out UBRR,temp
    ldi temp, LOW(UBRR)
    out UBRRL, temp
    ldi temp, HIGH(UBRR)
    out UBRRH, temp

loop:

    ldi temp, 'T'
    rcall serout       ;Unterprogramm aufrufen
    ldi temp, 'e'
    rcall serout       ;Unterprogramm aufrufen
    ldi temp, 's'
    rcall serout       ;Unterprogramm aufrufen
    ldi temp, 't'
    rcall serout       ;Unterprogramm aufrufen
    ldi temp, '!'
    rcall serout       ;Unterprogramm aufrufen
    ldi temp, 10
    rcall serout       ;Unterprogramm aufrufen
    ldi temp, 13
    rcall serout       ;Unterprogramm aufrufen
    rjmp loop          ;zu loop springen

serout:
    sbis UCSRA,UDRE  ;Warten, bis UDR für das nächste Byte bereit ist
    rjmp serout
    out UDR, temp
    ret               ;zurück zum Hauptprogramm

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ldi temp, UUU   ;Baudrate 9600 einstellen
    out UBRR,temp

UBRR ist ein Synonym für UBRRL (siehe m16def.inc). Der folgende Code
ist also unnötig, da UBRRH normalerweise 0 ist und UUU bei dir < 256
ist.

    ldi temp, LOW(UBRR)
    out UBRRL, temp
    ldi temp, HIGH(UBRR)
    out UBRRH, temp

Das kann man so nicht schreiben. UBRR bezeichnet ein IO-Register, ldi
erwartet aber eine Konstante. Der Assembler kennt keine Unterschiede
zwischen IO-Adressen und Konstanten, und da UBRR in der m16def.inc als
Konstante mit dem Wert 0x09 definiert ist, wird das Register UBRRL also
mit 0x09 geladen.

Autor: Helli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie lautet dann der richtige Code (was muß ich weglassen, welche Werte
muß ich setzen...)?
Tut mir leid, bin aber noch absoluter Neuling...

Autor: Helli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, hab's jetzt doch noch kapiert, jetzt funktionierts...

.equ UUU = 4000000/(9600*16)-1

    ldi temp, LOW(RAMEND)
    out SPL, temp
    ldi temp, HIGH(RAMEND)
    out SPH, temp
    sbi UCSRB, TXEN                 ;TX aktivieren
    ldi temp, UUU   ;Baudrate 9600 einstellen
    out UBRRL, temp
.
.
.
.

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.