Forum: Mikrocontroller und Digitale Elektronik ATMega88 USART / Baudrateneinstellung


von Wolfram (Gast)


Lesenswert?

ATMega88 USART / Baudrateneinstellung

Servus an alle, suche Hilfe bei der Einstellung der Baudrate bei einem
ATMega88 mit einer externen Taktfrequenz von 20MHz.

Ich versuche mich gerade in Assembler, mit den anderen
Programmiersprachen habe ich wenig Probleme. Mit Assembler versteht
halt man mehr - denk ich mal.

Folgendes Problem:

ATMega88 auf STK500. Programmierung in Assembler mit AVR-Studio.

Die Baudrate wird beim ATMega88 über die beiden Register UBRR0H ($C5)
und UBRRH0L ($C4) eingestellt. Mein Code dazu sieht wie folgt aus:

.include "m88def.inc"

.equ CLOCK = 20000000
.equ BAUD = 9600
.equ UBRRVAL = CLOCK/(BAUD*16)-1

    ; Baudrate einstellen
    ldi r16, LOW(UBRRVAL)
    out UBRR0L, r16
    ldi r16, HIGH(UBRRVAL)
    out UBRR0H, r16

Bei "out UBRR0L, r16" bekomme ich die Fehlermeldung "illegal
argument type or count".

Die Lösung ist mit Sicherheit einfach, ich habe in der Doku und hier im
Forum bis jetzt leider nichts gefunden.

Danke für Hilfe, Wolfram

Der Fairniss halber weise ich darauf hin, daß ich den gleichen Beitrag
im roboternetz poste.

von Andy (Gast)


Lesenswert?

Hallo,
bei meinem mega8 heissen die register UBRRL und UBRRH.
Damit klappts bei mir einwandfrei.
gruss
Andy

von Wolfram (Gast)


Lesenswert?

ICh habe die Includefiles verglichen, beim mega8 heißen sie UBRRL und
UBRRH, beim mega88 aber leider so wie beschrieben UBRR0L und UBRR0H.

Wäre der Name falsch, müßte der Assembler eine "undefined variable
referenced" bringen. Trotzdem Danke.

von Topsoft (Gast)


Lesenswert?

Hallo,

das Problem ist das der Bereich der normalen Ports nicht mehr für alle
Spezialports gereicht hat. Somit hat man einige Ports in den Rambereich
gemappt. Siehe m88def.inc :

;***** MEMORY MAPPED I/O REGISTER DEFINITIONS (&FF-$60) ************
.equ  UDR0       =$C6
.equ  UBRR0H     =$C5
.equ  UBRR0L     =$C4
.equ  UCSR0C     =$C2
.equ  UCSR0B     =$C1
.equ  UCSR0A     =$C0
.equ  TWAMR      =$BD
.equ  TWCR       =$BC
.equ  TWDR       =$BB
.equ  TWAR       =$BA
.equ  TWSR       =$B9
.equ  TWBR       =$B8
.equ  ASSR       =$B6
.equ  OCR2B      =$B4
.equ  OCR2A      =$B3
.equ  TCNT2      =$B2
.equ  TCCR2B     =$B1
.equ  TCCR2A     =$B0
.equ  OCR1BH     =$8B
.equ  OCR1BL     =$8A
.equ  OCR1AH     =$89
.equ  OCR1AL     =$88
.equ  ICR1H      =$87
.equ  ICR1L      =$86
.equ  TCNT1H     =$85
.equ  TCNT1L     =$84
.equ  TCCR1C     =$82
.equ  TCCR1B     =$81
.equ  TCCR1A     =$80
.equ  DIDR1      =$7F
.equ  DIDR0      =$7E
.equ  ADMUX      =$7C
.equ  ADCSRB     =$7B
.equ  ADCSRA     =$7A
.equ  ADCH       =$79
.equ  ADCL       =$78
.equ  TIMSK2     =$70
.equ  TIMSK1     =$6F
.equ  TIMSK0     =$6E
.equ  PCMSK2     =$6D
.equ  PCMSK1     =$6C
.equ  PCMSK0     =$6B
.equ  EICRA      =$69
.equ  PCICR      =$68
.equ  OSCCAL     =$66
.equ  PRR        =$64
.equ  CLKPR      =$61
.equ  WDTCSR     =$60

Somit sollte dann folgender Code funzen:

.include "m88def.inc"

.equ CLOCK = 20000000
.equ BAUD = 9600
.equ UBRRVAL = CLOCK/(BAUD*16)-1

    ; Baudrate einstellen
    ldi r16, LOW(UBRRVAL)
    sts UBRR0L, r16
    ldi r16, HIGH(UBRRVAL)
    sts UBRR0H, r16

Habe es aber nicht getestet!

Gruß Topsoft

von A.K. (Gast)


Lesenswert?

Beim Mega88 liegt wie bei den Mega64/128-ern ein Teil der I/O-Ports
ausserhalb von 0..63, d.h. ist nur mit LDS/STS nicht aber mit IN/OUT
adressierbar.

von Wolfram (Gast)


Lesenswert?

Danke Topsoft und A.K., das war´s, ich hatte noch im Includefile
gestöbert, da ist mir auch aufgefallen, daß die Register in den Memory
gemappt sind. Die Assemblerbefehle dazu haben mir aber gefehlt.

Ich dank euch für eure Hilfe. Wenn man vor der Kiste sitzt und manchmal
an wirklich einfachen Problemen scheitert, frustriert das schon. Aber
jeder hat mal klein angefangen, man quält sich halt durch.

Ich möcht´s ja auch verstehen. Thank´s bis zum nächsten mal, Wolfram

von Marco Pniok (Gast)


Lesenswert?

Danke Topsoft

nach 2 Tagen suchen war dieser Tip Goldwert

Marco

von Guillermo B. (benites)


Lesenswert?

Hallo zusammen,

Ich komme noch nicht weiter mit dem anbei Frame-Format Code,

include "m88def.inc"

.def temp = r16
.equ CLOCK = 3690000
.equ BAUD = 9600
.equ UBRRVAL = CLOCK/(BAUD*16)-1

; Baudrate einstellen
        ldi temp, LOW(UBRRVAL)
        sts UBRR0L, temp
        ldi temp, HIGH(UBRRVAL)
        sts UBRR0H, temp

; Frame-Format: 8 Bit
        ldi temp, (1<<UMSEL01)|(3<<UCSZ00)
        sts UCSR0C, temp

        sbi UCSR0B,TXEN0                  ; TX aktivieren

wie kann ich also TX aktivieren????

vielen Dank im voraus
Benites

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.