PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : i2c und ADC zusammen harmonieren nicht!



CapSob
14.04.2011, 16:57
Hallo Leute!

Habe die Suche verwendet, bloß bei so kurzen Begriffen wie "i2c" und "adc" will sie nicht!
Also... Controller ist ein atmega8 mit 16mhz externen Quarz.

Über i2c wird ein LM75 ausgelesen und über adc0 wird über einen Spannungsteiler eine Spannung gemessen.
Das Programm scheint sich irgendwie aufzuhängen... aber anhand einer blinkenden LED sehe ich, dass es weiter läuft, bzw. LCD hängt sich optisch auf!

Ablauf ist folgender:

Do
Toggle Led

' ----- Screen 1 Ausgabe -----
If Screenx = 1 Then
Gosub Tempmessen
Gosub Spannungmessen

___lcdno = 0
Locate 2 , 13
Lcd Temperatur ; Nachkommastelle ; " " ; Chr(0) ; "C"

___lcdno = 1
Locate 1 , 13
Lcd Ustr ; " V"
End If

' ----- Screen 2 Ausgabe -----
If Screenx = 2 Then
End If

Wait 1
LoopDas komische ist, dass wenn ein "Druchlauf" der Do-Loop-Schleife war, ist meine Screenx-Variable auf einmal mind. 48 (Laut ausgabe auf LCD).

Spannungsmessung über Spannungsteiler:

Spannungmessen:
Start Adc ' Analog/Digital-Wandler starten
Uwert = Getadc(0) ' PortC.0 (ADC0)
Uspannung = Uwert * Adc_multi
Uspannung = Uspannung * 3.4 ' Faktor-Umrechung bedingt Spannungsteiler
Ustr = Fusing(uspannung , "#.##") ' Auf 2 Nachkommastellen runden
Stop Adc
Return...und Temperaturmessung über i2c:

Tempmessen:
'Temperaturregister auswählen
I2cstart
I2cwbyte Lm75slavewrite
I2cwbyte &H00

'LM75 Abfrage
I2cstart
I2cwbyte Lm75slaveread
I2crbyte Lm75high , Ack
I2crbyte Lm75low , Nack
I2cstop

If Lm75high > 127 Then
Temperatur = Lm75high And 127
Temperatur = Not Temperatur
Incr Temperatur
Else
Temperatur = Lm75high
End If

Lm75low = Lm75low And 128
If Lm75low > 0 Then
Nachkommastelle = ",5"
Else
Nachkommastelle = ",0"
End If
Return

Das interessante ist, dass wenn ich in der DoLoop-Schleife die Spannungsmessung auskommentiere, das Programm wunderbar läuft! Aber wenn ich z.B. die Tempmessung auskommentiere läuft auch nichts.
Es scheint fast so, als würde das Problem an der Spannungsmessung liegen!
Aber bedingt einer früheren Programmversion, wo noch keine i2c-Routine integriert war, lief die Spannungsmessung ohne Probleme, seit dem hat sich nichts mehr am Code der Spannungsmessung geändert.

Kann es sein, dass "i2c" + "adc" = inkompatibel?? :confused:

peterfido
14.04.2011, 17:54
Hallo,
starte den ADC am Anfang des Programmes und lass ihn an. Evtl passt Ustr nicht bzw zu klein dimensioniert.

CapSob
15.04.2011, 15:59
Danke, es lag an der Variable "Ustr" -> Jetzt auf 5 geht es!