www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik USART Mega162 weitere Unterschiede zu Mega8?


Autor: Thomas Wyschkony (thomas-w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin neu hier und moechte mich erstmal kurz vorstellen:

Ich heisse Thomas und habe zuletzt vor ueber 15 Jahren 8085er in der 
Lehre programmiert. Nun beschaeftige ich mich wieder mit der 
Programmierung und arbeite an einem Gemeinschaftsprojekt mit.

Hier geht es prinzipiell darum, Daten von einer Schnittstelle 
einzulesen, diese aufarbeiten und auf der anderen Schnittstelle 
auszugeben. Leider scheitere ich da heftig, vielleicht kann mir jemand 
einen goldenen Tipp geben.

Zum Testen habe ich mal ein Programm aus dem AVR-Tutorial genommen. Auf 
dem Mega8 funktioniert dies einwandfrei. Dann habe ich es fuer den 
Mega162 umgeschrieben und heraus kommt Schrott.

Hier der Code, wie ich ihn umgeschrieben habe:

.include "m162def.inc"

.def temp    = r16                              ; Register für kleinere 
Arbeiten
.def zeichen = r17                              ; in diesem Register 
wird das Zeichen an die
                                                ; Ausgabefunktion 
übergeben

.equ F_CPU = 8000000                            ; Systemtakt in Hz
.equ BAUD  = 4800                               ; Baudrate

; Berechnungen
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))      ; Reale Baudrate
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille

.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ; max. +/-10 Promille 
Fehler
  .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit 
zu hoch!"
.endif

    ; Stackpointer initialisieren

    ldi     temp, LOW(RAMEND)
    out     SPL, temp
    ldi     temp, HIGH(RAMEND)
    out     SPH, temp
  ;ldi   temp, 0xAA
  ;out    OSCCAL, temp

    ; Baudrate einstellen

    ldi     temp, HIGH(UBRR_VAL)
    out     UBRR0H, temp
    ldi     temp, LOW(UBRR_VAL)
    out     UBRR0L, temp

    ; Frame-Format: 8 Bit

    ldi     temp, (1<<URSEL0)|(3<<UCSZ00)
    out     UCSR0C, temp

    sbi     UCSR0B,TXEN                  ; TX aktivieren

  ldi r16, 0x00
  out DDRD, r16

loop:
    ldi zeichen, 0xFF
    rcall   serout

    ldi     zeichen, 13
    rcall   serout
    rcall   sync
    rjmp    loop

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

; kleine Pause zum Synchronisieren des Empfängers, falls 
zwischenzeitlich
; das Kabel getrennt wurde

sync:
    ldi     r16,0
sync_1:
    ldi     r17,0
sync_loop:
    dec     r17
    brne    sync_loop
    dec     r16
    brne    sync_1
    ret

Es soll eigentlich nur der Wert FF mit einem anschliessenden CR 
ausgegeben werden. Dies funktioniert jedoch nur, wenn ich an HTerm eine 
Baudrate von 600 einstelle.

OSCCAL kann ich nicht beschreiben (da mault der Assembler) und Quarz ist 
keiner vorhanden (bei der Mega8-Schaltung funktioniert das einwandfrei 
so)

Vielleicht habe ich ein Register oder eine Einstellung, speziell fuer 
den Mega162 uebersehen, fuer sachdienliche Hinweise bedanke ich mich im 
Voraus.

Viele Gruesse,

Thomas

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

CKDIV8 Fuse löschen.

MfG Spess

Autor: Thomas Wyschkony (thomas-w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Hi
>
> CKDIV8 Fuse löschen.
>
> MfG Spess

WOW!!! Das scheint es gewesen zu sein, zumindest fruchtet schonmal mein 
Testcode :o))

Schonmal herzlichen Dank dafuer.

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.