Forum: Mikrocontroller und Digitale Elektronik Analogen Wert in PIC einlesen


von Patrick E. (f4550tim)


Lesenswert?

Hallo liebe Leute von gestern, morgen und heute,

Ich möchte mich mit dem einlesen von Analogwerten beschäftigen. Ich habe 
den 18F4550. Programmiere in C und habe das PICKIT 2.

Ich habe schon gegoogelt, und die Suche bemöht, doch leider kein 
passendes einfaches Beispiel geunden. Ich würde mich so herantasten. 
Wenn der Wert über 2V ist, dann led 1 an, wenn unter 2V, dann Led 2 an. 
Nur als Beispiel.
Benötige ich eine äußere Beschaltung auser einem Vorwiderstand ? so 1K 
oder nen Spannungsteiler ?

lg Tim

PS: Ich will keine fertige Lösung, ich möchte ja noch was lernen. Aber 
ein Ansatz oder ein Link zu einem guten Tut, wäre nett ;)

von heldvomfeld (Gast)


Lesenswert?

hi,

die meisten infos dafür bekommst du aus dem datenblatt. darüber hinaus 
könntest du in deinem c18 compiler (sofern du mit mplab proggst) auch 
nen paar infos rausziehen.

gruß~

von Master S. (snowman)


Lesenswert?

mit C18:

init:
  OpenADC(ADC_FOSC_RC &
          ADC_RIGHT_JUST &
          ADC_1ANA_0REF,
          ADC_CH0 &
          ADC_INT_OFF);

main:
    ConvertADC();
    while (BusyADC());
    i = ReadADC();

von Jemand (Gast)


Lesenswert?

Hi Tim,
also zunächst wäre erstmal interessant wo dein Analogsignal überhaupt 
her kommt, dann könnte man mehr sagen. Ansonsten schau mal hier: 
http://pic-projekte.de/index.php/pic-tutorial.html

von Patrick E. (f4550tim)


Lesenswert?

Ok, erstmal danke für eure Hilfe.

Mein Signal, würde ich einfach über ein Poti einstallen. Also sagen wa 
mal 10K gegen VCC und Masse. Am Schleifer abgreifen,

lg Tim

von Jemand (Gast)


Lesenswert?

Ja gut, dann sollte ja alles klar sein =)

von Patrick E. (f4550tim)


Lesenswert?

Sollte ich dann noch so nen 1K als Vorwiderstand nehmen ? Also zwischen 
Schleifer und Eingang?


Und gibt es eine Erklärung für OpenADC ?

lg Tim

von Jemand (Gast)


Lesenswert?

Ne da brauch kein Widerstand hin, die µC Eingänge sind extrem hochohmig. 
Sorry mit OpenADC kann ich gerade nichts anfangen..

von holger (Gast)


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

Tim E. schrieb:

> Und gibt es eine Erklärung für OpenADC ?

Ich sags gleich. Ich hab keine Ahnung.

Aber ich geh mal von der Prämisse aus, das derjenige, der die Konstanten 
festgelegt hat, sich etwas dabei gedacht hat

  OpenADC(ADC_FOSC_RC &
          ADC_RIGHT_JUST &
          ADC_1ANA_0REF,
          ADC_CH0 &
          ADC_INT_OFF);

ADC_FOSC_RC     FOSC so wie Frequency Oszillator. RC so wie RC-Glied
                wird wohl etwas mit der Taktung des ADC zu tun haben

ADC_RIGHT_JUST  Right Justification. Die Ergebnisbits rechts ausrichten
                Beim AVR gibt es zb ein ADLAR Bit, welches die Bits
                links im Ergebnisregister ausrichtet. Ist praktisch
                wenn man nur an den 8 höherwertigsten Ergebnis-Bits
                interessiert ist, dann dann muss man nicht langwierig
                erst 2 Stück 8 Bit Register durchs Carry solange
                rumschieben, bis man die 8 Bit hat

ADC_1ANA_0REF   Das wird wohl was mit der Referenzspannung zu tun haben

ADC_CH0         Da springt mir sofort der 'Channel 0' ins Gesicht.
                Wird wohl die Auswahl des Eingangs sein

ADC_INT_OFF     INT wie Interrupt und OFF wie aus.
                Nach dem Wandeln keinen Interrupt auslösen


Die & da drinnen müsste man sich ansehen. Könnten stimmen oder auch 
nicht. Ich hätte an dieser Stelle eher | erwartet.

Was es sonst noch so an Konstanten gibt verrät entweder das Handbuch 
und/oder man sucht sich einfach mal das Header File raus, in dem diese 
Konstanten definiert sind. Mit ein bischen Glück steht dann sogar 
erläuternder Text dabei.

von Master S. (snowman)


Lesenswert?

Mircochip hat für die PIC18 und höher libraries geschrieben, die PIC-typ 
unabhängig gebraucht werden können. das hat den grossen vorteil, dass 
man die software ohne grosse hardwarekenntnisse oder grossem studieren 
von datenblättern schreiben kann und die software kann auch auf einen 
anderen PIC-typ leicht portiert werden. für C18 gibt's sogar eine 
zusammenstellung aller(?) dieser befehle: 
http://ww1.microchip.com/downloads/en/devicedoc/mplab_c18_libraries_51297f.pdf
siehe für ADC speziell kapitel 2.2
ansonsten findest du auch viele beispiele im installationsordner einfach 
mal nach dateien suchen, die "ADC" im namen enhalten

von Jemand (Gast)


Lesenswert?

@MS: Wo kann man die Libaries finden, die in dem PDF beschrieben werden?

von Master S. (snowman)


Lesenswert?

Arbeitsplatz -> C: -> Programme -> Microchip und dann [F3] drücken und 
"ADC" eintippen, dann [Enter]. voilà ;-)

von Jemand (Gast)


Lesenswert?

merci!

von Master S. (snowman)


Lesenswert?

aber mit dem PDF bist du definitiv besser bedient ;-)

von Jemand (Gast)


Lesenswert?

Naja ich meine ja auch bloß, dass wenn man die Befehle aus dem PDF 
benutzen möchte sollte man ja schon wissen wo die .h Dateien liegen um 
sie einbinden zu können.. =)

von Patrick E. (f4550tim)


Lesenswert?

Ok, danke soweit. Nun kann ich mich damit etwas beschäftigen. Ich melde 
mich brei Fragen ;)

DANKE

lg Tim

von Master S. (snowman)


Lesenswert?

nee, du musst nicht wissen, wo die ist: bei jeder beschrieben funktion 
im PDF steht auch, welche datei man includen muss, mehr brauchst du 
nicht zu wissen. z.b. schreibst du zu oberst in deine hauptdatei (dort, 
wo du die main() schreibst) folgendes:
#include <p18F458.h>
#include <adc.h>
du musst also nicht wissen, wo "adc.h" ist ;-) da du anfänger bist, guck 
dir auch mal die delay-funktionen im PDF an, die sind vor allem am 
anfang ganz nützlich.

auch typische anfängerfrage: was bedeutet "can't find file 'c018i.o'"
http://www.microchip.com/forums/tm.aspx?m=148977

von Jemand (Gast)


Lesenswert?

Okay das ist wahr. Das ist echt interessant, danke !!!!

von skorpionx (Gast)


Lesenswert?

Ich mache das so(AnalogSchritt vor der Haupschleife auf 0 setzen!):

unsigned char AnalogKanalNr;
void AnalogEin()
{
    unsigned char *ZwErgebnisChar;
    short ZwErgebnis;

    /*
    ADCON0: ADC CONTROL REGISTER 0 :

        bit 7   bit 6   bit 5   bit 4   bit 3   bit 2   bit 1   bit 0
Name:   ADCS1   ADCS0   CHS2   CHS1   CHS0   GO/DONE   -   ADON

ADCON1: ADC CONTROL REGISTER 1 (ADDRESS 9Fh):

        bit 7   bit 6   bit 5   bit 4   bit 3   bit 2   bit 1   bit 0
Name:   ADFM   ADCS2   -           -   PCFG3   PCFG2   PCFG1   PCFG0

ADFM: A/D Result Format Select bit
1 = Right justified. Six (6) Most Significant bits of ADRESH are read as 
‘0’.
0 = Left justified. Six (6) Least Significant bits of ADRESL are read as 
‘0’.

ADCS2: A/D Conversion Clock Select bit (ADCON1 bits in bold)

Außerdem sind die Register TRISA (& TRISE) für die I/O-Pin-Einstellunf 
sowie INTCON , PIR1 und PIE für die Interrupteinstellung (falls 
Interrupt benutzt werden soll) zu beachten
    */

 switch(AnalogSchritt)
 {
    #define ADCS 0b010      //FOSC/8
    #define  ADFM 1         //0-Ergebnis links justieren
    #define PCFG 0b0000     //alle 5 Kanäle als Analog Ein und Vss-Vdd 
als Referenz
    #define ADCON1_InitWert (ADFM<<7)|((ADCS&0b100)<<4)|PCFG
    #define ADCON0_InitWert (ADCS<<6)+1
    #define MAX_ANAL_KANAL_NR 3
     case 0: //Analog intialisieren
            ADCON1 = ADCON1_InitWert;
            ADCON0 = ADCON0_InitWert;
            AnalogSchritt = 1;
            AnalogKanalNr = 0;
        /*ADCON1bits.PCFG0 = 1;
            ADCON1bits.PCFG1 = 1;
            ADCON1bits.PCFG2 = 1;
            ADCON1bits.PCFG3 = 1;*/
            //CMCON = 0;
            /*TRISAbits.TRISA0 = 1;//0;
            TRISAbits.TRISA1 = 1;//0;
            TRISAbits.TRISA2 = 1;//0;
            TRISAbits.TRISA3 = 1;//0;
            TRISAbits.TRISA4 = 1;//0;  */


     break;

     case 1: // Messung starten
            //ADCON0  = (ADCON0&0b11000000)|(AnalogKanalNr<<3)|0b101;
            ADCON0bits.GO = 1;
            AnalogSchritt = 2;
     break;

     case 2: // Warten auf Messungsende
        if(!ADCON0bits.GO)
           {
               ZwErgebnisChar = (unsigned char*)&ZwErgebnis; //(unsigned 
char*)&TempKanal[AnalogKanalNr];
               *ZwErgebnisChar++ = ADRESL;
               *ZwErgebnisChar = ADRESH;
               /*Wenn Ergebnis 0 dann Temperatur -60.8. Zuwachs auf 1023 
entspricht dem Zuwachs +204.6 Grad*/
               ZwErgebnis<<=1;
               ZwErgebnis-=596;//624;//608;
               TempKanal[AnalogKanalNr]=ZwErgebnis;
                AnalogKanalNr++;
                if(AnalogKanalNr==MAX_ANAL_KANAL_NR)
                   AnalogKanalNr = 0;
                ADCON0  = (ADCON0_InitWert)|(AnalogKanalNr<<3);
                AnalogSchritt = 1;
           }
     break;


 }

}

von Patrick E. (f4550tim)


Lesenswert?

Gibt es eine Seite, wie Spurt, die Beispiele in C enthällt ?

Ich habe auf Spurt nur LErnbeispiele in Assembler gefunden ;(

lg Tim

von Jemand (Gast)


Lesenswert?


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.