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.