Pic 18F4525 10Bit Analog wert

OP #2442119
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...
#2442194
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 ;).
OP #2442236
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
Angehängte Dateien:
OP #2442237
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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren