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


von Thomas W. (thomas-w)


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

von spess53 (Gast)


Lesenswert?

Hi

CKDIV8 Fuse löschen.

MfG Spess

von Thomas W. (thomas-w)


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.

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.