mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Analogen Wert in PIC einlesen


Autor: Patrick E. (f4550tim)
Datum:

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

Autor: heldvomfeld (Gast)
Datum:

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

Autor: Master Snowman (snowman)
Datum:

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

Autor: Jemand (Gast)
Datum:

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

Autor: Patrick E. (f4550tim)
Datum:

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

Autor: Jemand (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja gut, dann sollte ja alles klar sein =)

Autor: Patrick E. (f4550tim)
Datum:

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

Autor: Jemand (Gast)
Datum:

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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Master Snowman (snowman)
Datum:

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

Autor: Jemand (Gast)
Datum:

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

Autor: Master Snowman (snowman)
Datum:

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

Autor: Jemand (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
merci!

Autor: Master Snowman (snowman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber mit dem PDF bist du definitiv besser bedient ;-)

Autor: Jemand (Gast)
Datum:

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

Autor: Patrick E. (f4550tim)
Datum:

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

DANKE

lg Tim

Autor: Master Snowman (snowman)
Datum:

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

Autor: Jemand (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay das ist wahr. Das ist echt interessant, danke !!!!

Autor: skorpionx (Gast)
Datum:

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


 }

}

Autor: Patrick E. (f4550tim)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt es eine Seite, wie Spurt, die Beispiele in C enthällt ?

Ich habe auf Spurt nur LErnbeispiele in Assembler gefunden ;(

lg Tim

Autor: Jemand (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beispiel in C zum ADC auslesen:
http://pic-projekte.de/phpBB3/pastebin.php?mode=vi...

Beispiel in C zum ADC konfigurieren:
http://pic-projekte.de/phpBB3/pastebin.php?mode=vi...

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.