mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMega88 USART / Baudrateneinstellung


Autor: Wolfram (Gast)
Datum:

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

Autor: Andy (Gast)
Datum:

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

Autor: Wolfram (Gast)
Datum:

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

Autor: Topsoft (Gast)
Datum:

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

Autor: A.K. (Gast)
Datum:

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

Autor: Wolfram (Gast)
Datum:

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

Autor: Marco Pniok (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Topsoft

nach 2 Tagen suchen war dieser Tip Goldwert

Marco

Autor: Guillermo Benites (benites)
Datum:

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

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.