PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ADC und USART über Register?!



BASTIUniversal
27.04.2005, 17:45
Hallole!
Ich hab mir vor kurzem nen MPX4115 (Drucksensor) geleistet, hab ihn auch zum laufen gebracht und hab den Luftdruck berechnen können.
Nun bin ich aber dabei den Code etwas platzsparender zu schreiben (und lass nachher die berechnungen vom PC machen).
Dabei will ich die USART und ADC Register von Hand konfigurieren (sprich UCSRx und UBRR bzw. ADMUX, ADCSRA). Allerdings will mir jetzt mein Mega8 keine Daten mehr schicken (kommt nix im Terminal-Programm an).

Im Anhang hab ich die komplette .bas Datei, hier noch ein paar ausschnitte vom Code:

Register setzen, Variablen deklarieren


$regfile = "m8def.dat"
$crystal = 3686400

Dim Adhi As Byte 'Temp für ADCH
Dim Adlow As Byte 'Temp für ADCL
Dim Adcergebins As Word 'Endergebnis der AD-Wandlung (ADCH+ADCL)
Dim B As Byte '"Merkbit" wenn Adlow und Adhi gelesen sind

Ucsra = &B00000000 'U2X und MPCM aus
Ucsrb = &B00011000 'UART Interrupts aus, TxD/RxD an, Char. Size=8Bit
Ucsrc = &B10000110 'Register UCSRC wählen, Asynchron, Parity aus, 1 Stop Bit, Clock Polarity=0
Ubrr = 23 'Baudrate=9600, Double Speed aus

Ddrc = &B00000000 'Ports PC0...5 auf Eingang
Admux = &B1100000 'Referenz: Intern 2,56V, LeftAdjust aus, ADC-Kanal 0 (Pin C.0)
Adcsra = &B10001101 'ADC an, Free Running aus, ADC-Interrupt an, Prescaler=32

On Adc Onadc 'Interrupt Routine wenn AD-Wandlung komplett

Sreg.7 = 1

-> Der Rest des Programms (ADCL/H lesen und an UDR geben)


Do

Adcsra.adsc = 1 'ADC Wandlung einschalten

If B = 1 Then 'Wenn Adlow und Adhi gelesen wurden...
Udr = Adlow '...erst Adlow schicken...
Do : Loop Until Ucsra.udre = 1 '...auf leeres USART-Datenregister warten... '
Udr = Adhi '...und dann Adhi schicken

B = 0 'Als letztes "Merkbit" B auf 0 setzen
End If

Wait 2 '2 Sekunden bis zur nächsten Wandlung warten

Loop

Onadc: 'Wenn ADC einen neuen Wert hat...

Adlow = Adcl '...erst Adcl lesen...
Adhi = Adch '...dann Adch...

B = 1 '"Merkbit" B auf 1 setzen

Return 'Zur Hauptschleife zurückkehren


End

Das ist mein aktueller Code!
Ich weiß echt nicht ob ich da was vergessen oder falsch gemacht hab...für mich sieht's eigentlich Richtig aus :-s

Ich hoffe ihr könnt mir etwas weiterhelfen!

P.S.: Die Do:Loop Schleife beim übertragen der Daten an UDR ist ein wenig schlecht...wie könnte man die am besten umgehen? Mit dem TX-Interrupt vielleicht?

BASTIUniversal
29.04.2005, 13:28
Nu, schade das mir keiner helfen kann...aber mein Problem hat sich zwischenzeitlich etwas verändert!
Ich bekomme seid gestern Werte an der UART...allerdings sind die alles andere als konstant und etwas seltsam!
An der UART kommen verschiedenste Byte's an...z.B. H=092 L=000 oder H=093 L=192
Hauptsächlich kommt als Hibyte des ADC 093 und als Lowbyte 000 an. Die übertragung ist wie oben (udr=HiByte Waitms 500 udr=Lowbyte) die ADC auslesung auch (erst LowByte = Adcl Waitms 5 HiByte=Adch)

Wenn ich nun aus beiden mittels "Ergebnis=Makeint(LowByte, HighByte)" ein Word mache kommt nurnoch 000 und ab und zu 092 an. Wenn ich das ganze rumdrehe kommt 093 an (ohne dieses komische 192).

Der Wert müsste ~710 sein (ungefähr 1,78V, 10Bit Auflösung und interne 2,56V Referenz).
Wenn ich das ganze etwas anders rechne (AVcc als Referenz und 8Bit) kommt ungefähr 1,77V raus...was eigentlich stimmt!

Hab ich irgendwas bei den Registern übersehen? Zahlendreher? Falsch konfiguriert?
Ich hab keine Ahnung warum das so ist...!

Ich bin echt für jede Hilfe dankbar!