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 ;)
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ß~
mit C18: init: OpenADC(ADC_FOSC_RC & ADC_RIGHT_JUST & ADC_1ANA_0REF, ADC_CH0 & ADC_INT_OFF); main: ConvertADC(); while (BusyADC()); i = ReadADC();
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
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
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
Ne da brauch kein Widerstand hin, die µC Eingänge sind extrem hochohmig. Sorry mit OpenADC kann ich gerade nichts anfangen..
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.
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
@MS: Wo kann man die Libaries finden, die in dem PDF beschrieben werden?
Arbeitsplatz -> C: -> Programme -> Microchip und dann [F3] drücken und "ADC" eintippen, dann [Enter]. voilà ;-)
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.. =)
Ok, danke soweit. Nun kann ich mich damit etwas beschäftigen. Ich melde mich brei Fragen ;) DANKE lg Tim
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
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; } }
Gibt es eine Seite, wie Spurt, die Beispiele in C enthällt ? Ich habe auf Spurt nur LErnbeispiele in Assembler gefunden ;( lg Tim
Beispiel in C zum ADC auslesen: http://pic-projekte.de/phpBB3/pastebin.php?mode=view&s=24 Beispiel in C zum ADC konfigurieren: http://pic-projekte.de/phpBB3/pastebin.php?mode=view&s=23
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.