Hallo Freunde !
Ich möchte mal die Fachleute hier befragen, was ich falsch mache.
Mit einem PIC16F877A...(er ist nun mal auf meinem Entwicklerboard)
habe ich mich mit der ADC Messung befasst. Da auch einige PORTA I/O
mit dem LCD Anschluss fest verknüpft sind steht mir als ADC AN6 = RE1
zur Verfügung.
Nun habe ich bei der Umrechnung nur die Brotpreise von Chicago
rausbekommen und nicht etwa was ich als Messwert eingebe.
Da ich mit 10-Bit Auflösung bin ich nach folgender Formel gegangen:
1
Vref=5V
2
Umess=(ADC_Wert/1023)*Vref
Liege ich mit meinen Gedanken da falsch ?? Ich dachte das bei 5V Ref und
5V am Messeingang bei 10 Bit dann 1023 ausgegeben werden.
Aber irgendwie bekomme ich es nicht gebacken. Vielleicht spinnt auch
sprintf bei der Umwandlung von float zu char.
Bei 5V am ADC bekomme ich: 119,17 V, am LCD angezeigt. Wer kann BITTE
helfen ?
Hier der Code (in XC8 - C)
Hallo,
Du solltest Dich mal mit dem speziellen Timing für die ADC Erfassung
beschäftigen.
Dann ist es auch guter Stil bei der Umrechnung ZUERST die Multiplikation
und dann erst die Division auszuführen (oder viele Klammern setzen! und
die 1023 auch als float zu definieren => 1023.0).
Vielleicht hilfts ja
Gruß
TK
Gerhard H. schrieb:> Vielleicht spinnt auch> sprintf bei der Umwandlung von float zu char.
Lass das doch erst mal weg, bleib bei Integer und gib den Wert in mV
aus.
(ADRESH<<8) ergibt eventuell auch immer NULL.
Geht das bei Dir überhaupt? So hast Du den ganzen Port A als
Analogeingänge, weil
Gerhard H. schrieb:> Da auch einige PORTA I/O> mit dem LCD Anschluss fest verknüpft sind steht mir als ADC AN6 = RE1> zur Verfügung.
Gruss Chregu
Christian M. schrieb:> Geht das bei Dir überhaupt? So hast Du den ganzen Port A als> Analogeingänge, weil
Hallo Christian!
Wie Du schon vielleicht beim Lesen meines Beitrages am Anfang entnehmen
konntest, nutze ich gar nicht PortA für ADC, sondern PORT-E1.
PortA dient leider bei dem Enwicklerboard("EasyPIC-40") zu Steuerung des
LCD oder 7seg-Anz_Display.
Das Datenblatt sagt wie es geht, darum ist ADCON1 binär 1000000 gesetzt.
Die Normalität ist ja das PortA mit dem ADC zu tun hat aber hier sind
AN6 AN7 PORTE zugeordnet. Datenblatt ab Seite 127.
Ich musste auch erst knobeln, bis ich das herraus hatte. Die
Codebespiele vom Boardhersteller sind alles andere als verwendbar...na
ja zum Umstricken und abgucken... ;)
Aber ich werde nochmals duch Netzt wandern, ich werde ja nicht der
"einzige PIC-ADC-Kunde" sein.
Danke aber, das Du Dir da Gedanken gemacht hast !
Gerhard
Gerhard H. schrieb:> Aber ich werde nochmals duch Netzt wandern, ich werde ja nicht der> "einzige PIC-ADC-Kunde" sein.
Aber vielleicht einer der wenigen, die so einen alten PIC verwenden.
Wenn die Gelegenheit mal günstig ist, dann kannst du den aber problemlos
gegen einen aktuellen austauschen. Bei den PIC16 und PIC18 ist fast
alles pinkompatibel!
Christian M. schrieb:> Geht das bei Dir überhaupt? So hast Du den ganzen Port A als> Analogeingänge, weil
Macht ja nichts, wenn die dann als Ausgänge verwendet werden...
So das Rätsel ist gelöst und zwar lag es am Auslesen der Register
ADRESH und ADRESL.
Hier nun richtig:
1
unsignedintADC_Read(unsignedcharchannel)
2
{
3
if(channel>7)
4
return0;
5
unsignedintadc_ret;
6
adc_on();
7
8
ADCON0|=channel<<3;// Eingang RE1 = AN6.. = 0x30
9
__delay_ms(2);
10
GO_nDONE=1;
11
while(GO_nDONE==1);
12
adc_ret=ADRESH&0x03;// !!!!!!!
13
adc_ret=((adc_ret<<8)+(ADRESL));// !!!!!!!
14
adc_off();
15
returnadc_ret;
16
}
Es musste ja auch mit nem alten Pic16f877a gehen, denn zu irgendwas hat
man die ja mal gefertigt. ;)
Muss mich nochmals mit dem Datenblatt und dem dicken PIC Buch befassen.
Irgendwo muss ja was stehen, warum die beiden 8Bit-Register anders
interpretiert werden müssen beim Auslesen.
Komisch das dabei normale MSB-LSB Konvertierung versagt..
Allen nochmals herzlichen Dank !!!!
Gerhard
Gerhard H. schrieb:> Es musste ja auch mit nem alten Pic16f877a gehen, denn zu irgendwas hat> man die ja mal gefertigt. ;)
Wenn Du noch an Lager hast, ok. Hab auch noch ein paar. Der Ersatz ist
der 16F193x, absolut pinkombatibel. Läuft intern mit PLL bis 32MHz,
kostet nur die Hälfte, ist aber ein bisschen schwieriger zu
konfigurieren...
Gruss Chregu
Gerhard H. schrieb:> Liege ich mit meinen Gedanken da falsch ?? Ich dachte das bei 5V Ref und> 5V am Messeingang bei 10 Bit dann 1023 ausgegeben werden.>> Aber irgendwie bekomme ich es nicht gebacken. Vielleicht spinnt auch> sprintf...
Da dreht sich mir der Magen um.
wenn du die PIC16F.. nicht in Assembler prigrammieren kannst, solltest
du sie überhaupt nicht programmieren und stattdessen dir ein Raspberry
zulegen.
So und nun zu den Details:
Für 5.0 Volt Referenz kriegst du einen Überlauf, falls du ebenso 5.0
Volt anlegst. Der höchste ausgebbare Wert des ADC ist 1023 und das ist
4.995117etc, also 1 LSB unter der Referenz. Sowas sollte ein Benutzer
eines ADC mittlerweile gelernt haben.
Und wer auf einem PIC16F.. mit printf herumfuchtelt, über den kann ich
nur verständnislos den Kopf schütteln - oder selbigen mit einem nicht
stubenreinen Wort versehen.
Also: Weißt du nicht, wie man eine Zahl mit 5 multipliziert? Kopie
machen, 2x nach links verschieben, dann Zahl nochmal draufaddieren. Wenn
du den ADC linksbündig arbeiten läßt, hättest du damit bereits die erste
Dezimalstelle. Für weitere Dezimalstellen wäre dann das Multiplizieren
mit 10 angesagt.
Also stell dich nicht so an!
W.S.
Gerhard H. schrieb:> Komisch das dabei normale MSB-LSB Konvertierung versagt..
Das Detail, was du da vermutlich meinst, ist dass du jetzt einen 16Bit
Wert 8 mal shiftest (adc_ret<<8).
Vorher war es ja nur das 8Bit Register (ARESH<<8). Wenn man ein 8Bit
Register um 8 nach links schiftet, dann werden ja 8 Nullen von rechts
nachgeschoben. Also stehen am Ende immer 8 Nullen in diesem Register
drin. Das ist wie löschen ;-)
Volker S. schrieb:> (ADRESH<<8) ergibt eventuell auch immer NULL.
Hallo Christian !
Ich kaufe nichts neues, ich habe "riesengrosse Vorratskisten" voll und
in der Winterzeit , wenn keine Gartenarbeit draussen ist , will man sich
als Rentner die Zeit vertreiben.
Darum versuche ich mal so einige Beispiele mit PIC,AVR, STM usw..aus
lange Weile und gespannt auf das Ergebnis mal durchzuprobieren...
Nu,r das das Progamm mir "Anodenspannung" anzeigte, anstatt was im
bereich um die 4..5 Volt war mir jetzt doch ein wenig zu dumm....
In meinem Hobby-Alter kümmert es mich nicht mehr, ob da einige µV oder
mV zu viel oder zu wenig sind, es geht ums Prinzip.
Es ist nur noch Hobby und so solls bleiben.
PICs habe ich verschiedene vom 20 bis 40 Pinner na da will und möchte
man doch mal mit probieren....
Zumal noch Sortierkästen mit diversen Sensoren, SD-Modulen, GSM-Modem
und GPS-Rx da sind , sowas möchte ich doch mal austesten.....
Somit vielen Dank für alle Hinweise, auch den anderen Usern
Gerhard
Danke Volker, ist ja auch logisch !!
....ich hatte das nicht gelesen weil ich noch beim Schreiben war....aber
solche "Unfälle" machen schlauer...und man denkt nach.
Nun ja ich betrete diese Bühne ja erst seit kurzem etwas intensiever,
das die programme anbelangt...sonst nur Led leuchten lassen am I/O Port
Gerhard