www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMEGA 8L UART empfangen LCD ausgeben


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

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich möchte eine Schaltung mit einem µC etwickeln, welche mir den 
Angezeigeten Wert von einer Digitalen Micrometerschraube 
(Mitutoyo)auslesen. Das Adapterkabel (DMX-1) 4Pins auf RS232 9 Pol., 
gibt mir die werte Ddigital aus. Aus dem Datenblatt kann ich entnehmen, 
dass ich 1 Startbit, 8 Datenbits, 1 Stoppbit sowie keine Parität 
erhalte.

Dem Ausgelesenenwert soll nun noch ein Offsetwert subtrahiert und eine 
Steigung multipliziert werden.

Wie würdet ihr dieses Programm erstellen???

Zum experimentieren habe ich mir das myAVR USB Board bestellt. Den 
Quellcode habe ich mit Assembler geschrieben.
Ich dachte ich Empfange ein Zeichen am UART schreibe es in ein Register 
führe die Rechenopperation aus und gebe es am 2 Zeiligen LCD aus.
In der ersten Zeile gebe ich das Wort "Messwert" aus.

Nun zu meiner Problematik...


Eine einfache LCD Ausgabe auf dem Display habe ich zustande gebracht.
Nun habe ich aber Problem mit der UART Register. Ich möchte ein "A" über 
die Tastatur eingben Hex 0x41 und gebe das Higher Bit 4 Hex an Port B 
aus und das Lower Bit 1Hex an Port C aus. Mit dem AVR Studio kann ich es 
simulieren und es klappt auch alles. Wenn ich mich jedoch mit dem 
Hyperterminal zur AVR platine verbinde und wirklich ein reelles "A" 
schicke bekomme ich eine wilde Bitkombination an den Ausgabe Ports B und 
C...

Was mache ich falsch????
Bitte dringend um Hilfe!!!!

Als Anhang mein kleines Testprogramm....

Gruß0

Denis

Autor: Denis Jakel (Firma: FZK) (skywalker1981)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry der anhang ist falsch....

Dies ist mein Programm

;----------------------------------------------------------------------- 
----
; Title         : UART für myAVR-Board
;----------------------------------------------------------------------- 
----
; Funktion      : gibt Zeichenketten auf dem myAVR LCD Modul, 2 Zeilen
; Schaltung     : PORT D2 = RS, PORT D3 = E, PORT D4-7 = D4-7
;----------------------------------------------------------------------- 
----
; Prozessor     : ATmega8
; Takt      : 3,6864 MHz
; Sprache       : Assembler
; Datum         : 03.02.2005
; Version       : 1.6
; Autor         : Dipl. Ing. Päd. Alexander Huwaldt
;----------------------------------------------------------------------- 
----
.include "m8def.inc"

.def temp = R16
.def temp1 = R17

.equ F_CPU = 4000000        ; Systemtakt in Hz
.equ BAUD  = 9600           ; 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

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

        ldi temp, 0xFF                    ; Port D = Ausgang
    out DDRC, temp
        out DDRB, temp              ; Port B = Ausgang

        ; Baudrate einstellen
        ldi temp, HIGH(UBRR_VAL)
        out UBRRH, temp
        ldi temp, LOW(UBRR_VAL)
        out UBRRL, temp

        ; Frame-Format: 8 Bit
        ldi temp, (1<<URSEL)|(3<<UCSZ0)
        out UCSRC, temp

        sbi UCSRB, RXEN                   ; RX (Empfang) aktivieren

receive_loop:
        sbis UCSRA, RXC                   ; warten bis ein Byte 
angekommen ist
        rjmp receive_loop
        in temp, UDR                      ; empfangenes Byte nach temp 
kopieren
        //out PORTB, temp                   ; ... und an Port D 
ausgeben.



        mov temp1, temp             ; "Sicherungskopie" für die 
Übertragung des 2.Nibbles
        swap temp                   ; Vertauschen
        andi temp, 0b00001111       ; oberes Nibble auf Null setzen
        out PORTB, temp             ; ausgeben

    andi temp1, 0b00001111       ; obere Hälfte auf Null setzen
        out PORTC, temp1             ; ausgeben
    rjmp receive_loop            ; zurück zum Hauptprogramm

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

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.