Hallo,
ich frage einen TLC549 mit einen PIC16F627A ab, 10mal pro Sekunde.
Wenn ich Analog-In an +Vref lege, zeigt der ADC wie gewünscht 255 an,
wenn ich Analog-In auf GND lege, zeigt er 17 an, also 0b00010001. Diese
beiden Bits sind immer gesetzt (lasse mir die Werte auf LCD permament
anzeigen), selbst wenn ich ein Poti an Analog-In setze unt von 0...255
raufdrehe.
Die Abfrage des ADCs sieht so aus:
1
CS=0;
2
for(inti=0;i<=7;i++){
3
CLK=1;
4
CLK=0;
5
adc|=ADC_EINGANGSSIGNAL<<(7-i);// fängt ja mit MSB an
6
}
7
CS=1;
Aber Bit 0 und Bit 4 sind immer 1. Warum?
Gruß
Jens
PS: Eigentlich ist es ja nur ein Offset-Fehler, den ich herausrechnen
kann. Mache ich momentan auch per Software, aber trotzdem ist es ja
irgendwie komisch.
Habe mir im Internet zuhauf Auswertungsprogramme durchlgelesen und habe
den Code mittlerweile auf
1
CS=0;
2
for(inti=0;i<=7;i++){
3
adc|=ADC_EINGANGSSIGNAL<<(7-i);// fängt ja mit MSB an
4
CLK=1;
5
CLK=0;
6
}
7
CS=1;
gebracht, was auch nach dem Logikdiagramm schlüssiger ist, aber die
beiden Bits bleiben konstant gesetzt... Seltsam.
Weiß niemand Rat? Auch Hinweise wie "hab ich noch nie von gehört" sind
hilfreich, um den Fehler einzukreisen. Denn dann könnte es ja an meinem
Layout liegen. Bis jetzt suche ich den Fehler noch in der Software.
Hallo,
> PS: Eigentlich ist es ja nur ein Offset-Fehler, den ich herausrechnen> kann. Mache ich momentan auch per Software, aber trotzdem ist es ja> irgendwie komisch.
also wenn die beiden BITS IMMER gesetzt sind, dann ist das kein
Offsetfehler den man rausrechnen kann.
- liefert der A/D denn sonst schlüssige Werte wenn du ein Poti
anschliesst ?
- hält das Programm auch die Timings ein ?
Sascha
Wie gesagt, das Programm und der ADC funktionieren im Prinzip. Alles ist
hervorragend, wenn da die beiden Einsen bei 0b00010001 nicht wären, die
das Ergebnis "überlagern"...
Offsettfehler geht eigentlich scon, wenn man sich es so ansieht, dass 17
immer gesetzt sind. Ist natürlich dann nicht ganz linear übers komplete
Spektrum, aber ich hab damit jetzt ne einstellbare Helligkeitsregelung
über PWM gemacht, und da sieht man's fast gar nicht...
Der PIC läuft mit 4MHz, aber ich frage deutlich (!) langsamer ab. Werde
es aber trotzdem mal übertrieben langsam angehen lassen und schauen.
Nachtrag: Nein, es ist definitiv KEIN Timingproblem. Habe die CLK-Flanke
auf ca. 200mS runtergebracht, und auch die /CS-High-Zeiten (in denen er
die Conversions macht) auf ca. 2s gesetzt. Und es gab das gleiche
Ergebnis.
Ich habe verschiedene TLC549s ausprobiert, bei allen das selbe Problem.
Hallo,
danke für die Tips und Anregungen.
Die Schleife steht in einer Funktion, und daher ist der Wert der
Variablen "adc", die zu Beginn der Funktion immer neu definiert wird,
immer 0. Sollte es zumindest sein, ich weiß nicht so genau, wie sehr
PICC-Lite die C-Compilervorgaben umsetzt. Ich werde es direkt morgen mal
ausprobieren.
Hat sonst noch jemand vielleicht eine Idee?
Grüße
Jens
Aber wenn man ins Handbuch von PICC-Lite schaut, steht da, dass alle
Variablen bei Initialisierung auf 0 gesetzt werden.
Ich weiß nicht, wie PICC-Lite den Stack bei Funktionsaufrufen
organisiert, wahrscheinlich werden nicht alle Deklarationen nach
Verlassen der Funktion gelöscht und danach neu ausgeführt, sondern
bleiben an der selben Stelle im Speicher und werden dann einfach beim
nächsten Aufruf weiterbenutzt, woraus dann der Fehler resultierte.
Jens schrieb:
> Aber wenn man ins Handbuch von PICC-Lite schaut, steht da, dass alle> Variablen bei Initialisierung auf 0 gesetzt werden.
Ja, richtig - Initialisierung geschieht einmalig beim Start des
Programmes und dort werden alle globalen Variablen mit 0 initialisiert -
hatte ich auch geschrieben.
Die lokalen haben keinen festen Speicherplatz und können nicht
initialisiert werden. Deren Speicherplatz wird auf dem Stack angelegt
nach Einsprung in die jeweilige Routine. Initialisiert werden diese
nicht.