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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.