TLC549 zeigt immer 17 an

Gast #1342560
Lesenswert?

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 (int i = 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
Gast #1342646
Lesenswert?

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 (int i = 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.
#1342665
Lesenswert?

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
Gast #1342670
Lesenswert?

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.
Gast #1342689
Lesenswert?

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.
Gast #1342945
Lesenswert?

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
Gast #1343544
Lesenswert?

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.
#1343559
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren