Forum: Mikrocontroller und Digitale Elektronik TLC549 zeigt immer 17 an


von Jens (Gast)


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

von Jens (Gast)


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.

von Mark (Gast)


Lesenswert?

Wie schnell ist dein uC ??

Das CLK Signal ist evtl. etwas kurz. Im Datenblatt sind 1.1 MHz 
vorgeschlagen

von Sascha W. (sascha-w)


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

von Jens (Gast)


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.

von Jens (Gast)


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.

von Nullen (Gast)


Lesenswert?

Was hat dein adc für einen Wert vor Aufruf der Schleife?
Setzt du den auf 0?

von Jens (Gast)


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

von Jens (Gast)


Lesenswert?

Ich fass es nicht, genau daran lag's - unglaublich. Vielen lieben Dank 
an Nullen. ;-)

von Thomas K. (muetze1)


Lesenswert?

C-Compilervorgaben? Die Vorgabe ist immer: lokale Variablen sind 
undefiniert! Nur globale werden entsprechend initialisiert.

von Jens (Gast)


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.

von Thomas K. (muetze1)


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.

von Jens (Gast)


Lesenswert?

Das erklärt einiges - ich hatte gedacht, dass mit Initialisierung so 
etwas gemeint ist:
1
int variable;
Unabhängig davon, wo es steht.

Danke für die erhellenden Worte :-)

Gruß
Jens

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.