BASTIUniversal
27.04.2005, 18: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?
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?