Forum: Analoge Elektronik und Schaltungstechnik Pic 18F4525 10Bit Analog wert


von Uwe K. (uwe_k60)


Lesenswert?

Guten Morgen, ich habe ein Problem...

ich muss folgendes erreichen:

AN0 - AN3 einlesen aber je als 10 Bit...

Gut wir haben die Kommunikation zum PC stehen, der PiC soll die AN´s 
einlesen und dann kontinuierlich zum PC schicken( das ist nur ein teil 
des gesamten) so aber wie... nun ich weiss das die 10 Bit im Adresh und 
Adresh low abgelegt werden, je nach einstellung von links oder von 
rechts...

Nun wir arbeiten mit c... Mein frage ist jetzt hat jemand ein Beiospiel 
Programm wie ich es schaffe das er die 4 einliest, ich weiss nur was das 
man schieben muss was die Eingansgbestimmung angeht(CHS1-3 im Adcon 0) 
aber wie weiss ich nicht, und wie ich das dann sende, oder ausgebe...

Vielleicht hat es schon jemand von euch gemacht,m und hat da eine 
idee... zum pc senden ansich haben wir hinbekommen...

:" Zur Aufklärung... der PC senden einen Hexcode mit dem wir in einem 
Hauptprogramm über eine IF schleife in die ANALOG EIngangsvariante 
wechseln, so dann muss ich den wandler einschalten..etc.. aber dann wie 
weiter... danke...

von M. K. (sylaina)


Lesenswert?

Kennst du

http://www.sprut.de/

? Da wird das eigentlich sehr schön erklärt ;)

Uwe K. schrieb:
> so dann muss ich den wandler einschalten..etc.. aber dann wie
> weiter... danke...

Wie dann weiter? Na messen und den Messwert dann an den PC schicken. Ist 
eigentlich kein Problem.

von Uwe K. (uwe_k60)


Lesenswert?

Ja aber ich habe 4 Eingänge die direkt hintereinander eingelesen werden 
und an den pc geschcikt werden, in einer while schleife bis der zustand 
darin sich ändert...

von M. K. (sylaina)


Lesenswert?

Und wo soll da ein Problem sein? Messen und anschließend Messwert senden 
und wieder messen und wieder Messwert senden...ich versteh dich hier 
nicht wo da ein Problem sein soll. Beschreibe deinen Aufbau (Programm, 
Hardware geht ja wenn ich dich recht verstanden habe) genauer, z.b. mit 
einem Flussdiagramm ;).

von Uwe K. (uwe_k60)


Angehängte Dateien:

Lesenswert?

So ich habe mal versucht ein Fluss Diagramm zu erstellen, da ich aber 
kaum Ahnung habe was die Analogen Dinge angeht hoffe ich das es 
Verständlich ist... ich weiss nicth wie ich das Unterprogramm erstellen 
soll...

if (Byte1=0x20)
{
   TRISA0=0;
   TRISA1=0;
   TRISA2=0;
   TRISA3=0;
   ADCON1=0b00001011;
   ADCON2=0b00???001;      // Weiss nicht genau wofür das TAD ist
   ADCON0=0;      //Reset

   while (Byte1=0x20)
   {
       ADCON0=0b00000011 //zum einlesen vom ersten Wert

       ADCON0=0b00000111 //zum einlesen vom zweiten Wert

       ADCON0=0b00001111 //zum einlesen vom dritten Wert

       ADCON0=0b00010011 //zum einlesen vom vierten Wert

   }
}
So aber was dazwischen kommt das weiss ich nicht, und ob das so klappen 
könnte auch nicht... daher meine Fragen... da weiss ich halt kaum was 
drüber... und muss ich den werten eine Variable zuorden um die zu 
schicken... wir hatten mal ein Testprogramm in der Schule da war mal was 
mit channel=channel<<3 in einer messen.c so und in dem hauptprogramm 
sind dann die messen(2) an Port D und die messen(3)an Port B ausgegeben 
worden.. aber das konnte ich nicht erweitern... so und das entsprechende 
ergebnis habe ich dann in das txreg gschickt und zum pc versenden... 
aber ich kann es nciht erweitern... ich suche es mal und lade es mit 
doch.... Aber trotzdem schnmal nen riesen dank...

So das war die messen_ch: //messen_ch.h
//es wird der angegebene Kanal gemessen
#include  "delay.h"
unsigned char messen(unsigned char channel)
{
  ADCON0=(ADCON0&0b11000111)|(channel=channel<<3);
  DelayUs (20);
  ADGO=1;        //wandeln
  while(ADGO);
  return ADRESH;
}

und das die messen.c :
//messen RA23
#include   <htc.h>
__config (0x3F31);
//#include "messen.h"
void messen(void);      //Anmeldung Prototyp
void konfig(void);
void main (void)
{   konfig();
   while(1)
   {
      ADCON0=0b01010001;   //RA2;
      messen();
      PORTD=ADRESH;
      ADCON0=0b01011001;   //RA3
      messen();
      PORTB=ADRESH;
   }
}
void messen(void)
{   unsigned char i;
   for (i=4;i>0;i--);      //20us=4*6us
   //ADCON0=ADCON0 | 0b00000100; //Go-Bit gesetzt
   //while ((ADCON0&0b00000100)==0b00000100);
   //oder alternativ:
   while(ADCON0&0x04);      //false=0, true=1...
}
void konfig(void)
{
   ...
}

So ich glaueb das war es... aber wie gesagt wenn ich diese erweitern 
könnte, dann häött ich was lauffähiges und ich könnte die werte 
messen(x) zum pc schicken...

Danke

von Uwe K. (uwe_k60)


Angehängte Dateien:

Lesenswert?

So ich habe mal versucht ein Fluss Diagramm zu erstellen, da ich aber 
kaum Ahnung habe was die Analogen Dinge angeht hoffe ich das es 
Verständlich ist... ich weiss nicth wie ich das Unterprogramm erstellen 
soll...

if (Byte1=0x20)
{
   TRISA0=0;
   TRISA1=0;
   TRISA2=0;
   TRISA3=0;
   ADCON1=0b00001011;
   ADCON2=0b00???001;      // Weiss nicht genau wofür das TAD ist
   ADCON0=0;      //Reset

   while (Byte1=0x20)
   {
       ADCON0=0b00000011 //zum einlesen vom ersten Wert

       ADCON0=0b00000111 //zum einlesen vom zweiten Wert

       ADCON0=0b00001111 //zum einlesen vom dritten Wert

       ADCON0=0b00010011 //zum einlesen vom vierten Wert

   }
}
So aber was dazwischen kommt das weiss ich nicht, und ob das so klappen 
könnte auch nicht... daher meine Fragen... da weiss ich halt kaum was 
drüber... und muss ich den werten eine Variable zuorden um die zu 
schicken... wir hatten mal ein Testprogramm in der Schule da war mal was 
mit channel=channel<<3 in einer messen.c so und in dem hauptprogramm 
sind dann die messen(2) an Port D und die messen(3)an Port B ausgegeben 
worden.. aber das konnte ich nicht erweitern... so und das entsprechende 
ergebnis habe ich dann in das txreg gschickt und zum pc versenden... 
aber ich kann es nciht erweitern... ich suche es mal und lade es mit 
doch.... Aber trotzdem schnmal nen riesen dank...

So das war die messen_ch: //messen_ch.h
//es wird der angegebene Kanal gemessen
#include  "delay.h"
unsigned char messen(unsigned char channel)
{
  ADCON0=(ADCON0&0b11000111)|(channel=channel<<3);
  DelayUs (20);
  ADGO=1;        //wandeln
  while(ADGO);
  return ADRESH;
}

und das die messen.c :
//messen RA23
#include   <htc.h>
__config (0x3F31);
//#include "messen.h"
void messen(void);      //Anmeldung Prototyp
void konfig(void);
void main (void)
{   konfig();
   while(1)
   {
      ADCON0=0b01010001;   //RA2;
      messen();
      PORTD=ADRESH;
      ADCON0=0b01011001;   //RA3
      messen();
      PORTB=ADRESH;
   }
}
void messen(void)
{   unsigned char i;
   for (i=4;i>0;i--);      //20us=4*6us
   //ADCON0=ADCON0 | 0b00000100; //Go-Bit gesetzt
   //while ((ADCON0&0b00000100)==0b00000100);
   //oder alternativ:
   while(ADCON0&0x04);      //false=0, true=1...
}
void konfig(void)
{
   ...
}

WOBEI DAS IST FÜR DEN 16F877 da stimmen die Adcons nicht überein, udn 
der hatte nur 8Bit und ich brauche die 10Bit...

So ich glaueb das war es... aber wie gesagt wenn ich diese erweitern 
könnte, dann häött ich was lauffähiges und ich könnte die werte 
messen(x) zum pc schicken...

Danke

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.