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


von Denis (Gast)


Angehängte Dateien:

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

von Denis J. (Firma: FZK) (skywalker1981)


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

von Falk B. (falk)


Lesenswert?


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.