mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik TLC549 zeigt immer 17 an


Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
CS = 0;
for (int i = 0; i <= 7; i++) {
 CLK = 1;
 CLK = 0;
 adc | = ADC_EINGANGSSIGNAL << (7 - i); // fängt ja mit MSB an
}
CS = 1;

Aber Bit 0 und Bit 4 sind immer 1. Warum?

Gruß
Jens

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
CS = 0;
for (int i = 0; i <= 7; i++) {
 adc | = ADC_EINGANGSSIGNAL << (7 - i); // fängt ja mit MSB an
 CLK = 1;
 CLK = 0;
}
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.

Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie schnell ist dein uC ??

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

Autor: Sascha Weber (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Nullen (Gast)
Datum:

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

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens (Gast)
Datum:

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

Autor: Thomas K. (muetze1)
Datum:

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

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas K. (muetze1)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jens (Gast)
Datum:

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

Danke für die erhellenden Worte :-)

Gruß
Jens

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.