Enkel A/D omvandling strular

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Enkel A/D omvandling strular

Inlägg av newbadboy »

Försöker göra en enkel AD om vandling där jag vill att en utgång OUT skall vara noll sålänge ad ingång 2 är mindre än 1V.
Jag använder 12F675.
Vref är tagen internt via matningen som är på 5V (detta är väll satt som default?)
Har räknat att 1V blir (1x1024)/5 = 205 dec = CD hex

Som det är nu så är OUT hela tiden 0 dvs if satsen är uppfylld oavsett om det är mindre eller mer än 1V på ingången


Kod: Markera allt

#define  OUT GPIO.F4
#define  SWITCH GPIO.F1

unsigned int adc_rd;


void main(){

  TRISIO=0x6;                                                                     // Set GP2/AN2 and GP1 as input, rest as outputs (except GP3/MCLR)
  ANSEL=0x4;                                                                      // Set  AN2 as analog, rest as digital (don't forget CMCON)
  CMCON=0x07;                                                                     // comparator off
  OUT=0;
  delay_ms(100);

while(1){

    adc_rd=ADC_Read(2);  
   
    if(adc_rd < 0xCD){
       OUT=0;
       delay_ms(1000);
       }

       OUT=1;


}
Användarvisningsbild
Walle
Moderator
Inlägg: 7701
Blev medlem: 14 december 2004, 10:32:18
Ort: Stockholm

Re: Enkel ad omvandling strular

Inlägg av Walle »

Vad är ADC_Read(2) för funktion? Vart är den definierad? Vet du att den fungerar som den ska? Jag har använt ADC'n på just 12F675, koden är inte ens lite lik. I det här inlägget kan du se min kod: http://elektronikforumet.com/forum/view ... 11#p894111

Notera att jag har "slarvat" lite i avbrottsrutinen. Eftersom det i min applikation inte fanns något annat som kunde generera avbrott har jag skippat hela if-satsen.

Edit: Jag tycker verkligen att du ska göra dig av med ovanan att använda delayer, lär dig att använda avbrott (interrupt) och timers istället, en delay låser hela µCUn och gör koden synnerligen ineffektiv, d.v.s. µCUn skulle kunna göra något annat istället för att bara sitta och vänta :)
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Enkel ad omvandling strular

Inlägg av Icecap »

Håller med Walle helt och hållit. Grundproblemet är i övrigt ganska säkert att AD-omvandlaren inte är initialiserat alls...
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Enkel ad omvandling strular

Inlägg av newbadboy »

Till att börja med Ang delays. Håller med, har inte lärt mig helt enkelt interrupts bara. Kodar för sällan så jag börjar alltid om.

Adc read funktionen är en färdig funktion i mikroC.

Jag har kopierat delar av koden från ett gammalt projekt som jag gjort. Och då funkade adc läsningen. Det borde vara rakt av bara
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46976
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Enkel ad omvandling strular

Inlägg av TomasL »

Dessutom finns det ju inge processorinitiering, inga includes osv.
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Enkel ad omvandling strular

Inlägg av newbadboy »

Såhär såg det fullständiga fungerande programmet som jag kopierat

Kod: Markera allt

//Bränslevakt med 12f675, intern oscillator.
//extern mclr. Januari 2012  Version 1. Skall ej anslutas paralellt med  
//original sensor. Passande sensor är 0-180ohm ex WEMA s3 sensorer

#define  DIAG_LED GPIO.F5
#define  RELAY_OUT GPIO.F4
#define  IGNITION GPIO.F1

unsigned int adc_rd;
unsigned int trig_val;
unsigned int start_val;
int k=0;
int i=0;
int a=0;

void main(){

  TRISIO=0x6;                                                                     // Set GP2/AN2 and GP1 as input, rest as outputs (except GP3/MCLR)
  ANSEL=0x4;                                                                      // Set  AN2 as analog, rest as digital (don't forget CMCON)
  CMCON=0x07;                                                                     // comparator off
  RELAY_OUT=0;
  delay_ms(100);


while(i<15){                                                                      //System stabilizing delay appx 30 sec. Diag led blinkinkg 1Hz
  RELAY_OUT=0;
  DIAG_LED=1;
  delay_ms(1000);
  DIAG_LED=0;
  delay_ms(1000);
  i++;
  }
  i=0;

while(1){
  RELAY_OUT=0;
  DIAG_LED=0;
  delay_ms(1000);                                                                 //delay to avoid it jumping into next while after IGNITION goes high

  while(IGNITION==0){                                                            //When car ignition is zero the ciruit is active
                                                                                 //Delay is used to stabilize for appc 120sec system before actuall reading is done
                                                                                 //so the true adc value is present when sampling is done
      while(a<500){
        RELAY_OUT=0;
        DIAG_LED=1;
        delay_ms(300);                                                          //System stabilizing delay appx 5min
        DIAG_LED=0;
        delay_ms(300);
        a++;
        }
        a=0;

  
        adc_rd=ADC_Read(2);                                                      // get ADC value from 2nd channel
        start_val=adc_rd;                                                        //start_val i used later to monitor if tanke is filled up after alarm i trigged
        trig_val=((adc_rd*95)/100);                   //XXXXX !!!!!              //trig_val is 90% or 95% of start value
        
        while(IGNITION==0){                                                      //If IGNITION is 0
              adc_rd=ADC_Read(2);                                                //get adc reading continuesly.
              
              DIAG_LED=1;
              delay_ms(50);
              DIAG_LED=0;
              delay_ms(300);
              
              if(adc_rd > 0x39A){                                                 // If sensor wire is cut adc value is above 4,5V, turn on alarm
                   delay_ms(3000);                                                // 3sec delay to avoid spikes
                   adc_rd=ADC_Read(2);
                   if(adc_rd > 0x39A){
                       RELAY_OUT=1;
                       DIAG_LED=1;
                   }
              }
              
              else if(adc_rd < trig_val){                                         //if value is less then 90%/95%/97% of trig value, wait delay below
                   delay_ms(3000);                                                //Delay 3sec to avoid false trig
                   adc_rd=ADC_Read(2);
                   if(adc_rd < trig_val){                                         // If adc value is still less then 90%
                       RELAY_OUT=1;                                               // Turn on gsm alarm with RELAY_OUT
                       DIAG_LED=1;
                       }
              }

              else if((start_val < adc_rd)&&(adc_rd < 0x333)){                    //monitor if fuel is tanked when igniton is off
                   delay_ms(3000);
                   adc_rd=ADC_Read(2);
                   if((start_val < adc_rd)&&(adc_rd < 0x333)){
                        trig_val=((adc_rd*95)/100);               //XXXXXX !!!!   // set new trig value
                        start_val=adc_rd;                                         //set new start value
                        }
              }
              else{
                   RELAY_OUT=0;
                   DIAG_LED=0;
              }


                                   }
                            }
                   }
              }
Användarvisningsbild
SeniorLemuren
Inlägg: 8427
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Enkel ad omvandling strular

Inlägg av SeniorLemuren »

TomasL skrev:Dessutom finns det ju inge processorinitiering, inga includes osv.
Helt normalt när det gäller mikroC. Detta görs separat när man skapar ett projekt och hamnar i en config fil.
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Enkel ad omvandling strular

Inlägg av Icecap »

Och fortfarande är AD-funktionen inte initialiserat! Att göra en ADC_Read() har inget med AD-initiering att göra helt enkelt!
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Enkel ad omvandling strular

Inlägg av newbadboy »

Hmmm men jag har ju ansell=0x4. Det är väl initialiseringen
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46976
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Enkel ad omvandling strular

Inlägg av TomasL »

SeniorLemuren skrev:
TomasL skrev:Dessutom finns det ju inge processorinitiering, inga includes osv.
Helt normalt när det gäller mikroC. Detta görs separat när man skapar ett projekt och hamnar i en config fil.
Det är väl en av orsakerna till att inte använda microC.
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Enkel ad omvandling strular

Inlägg av Icecap »

newbadboy: NEJ! Läs dokumentationen.
Användarvisningsbild
SeniorLemuren
Inlägg: 8427
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Enkel ad omvandling strular

Inlägg av SeniorLemuren »

TomasL skrev:
SeniorLemuren skrev:
TomasL skrev:Dessutom finns det ju inge processorinitiering, inga includes osv.
Helt normalt när det gäller mikroC. Detta görs separat när man skapar ett projekt och hamnar i en config fil.
Det är väl en av orsakerna till att inte använda microC.
Ja, exakt. Det gäller att krångla till det så mycket som möjlig så ingen annan förstår vad man gör. Det är då man blir kallad expert. :)

Edit: Configfilen hanteras som vilken includefil som helst, det är bara det att compilatorn vet att den finns och skall med så den behöver man inte tänka på mer än när man startar ett project eller av någon anledning vill ändra i den.
Senast redigerad av SeniorLemuren 11 maj 2013, 19:23:41, redigerad totalt 1 gång.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46976
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Enkel ad omvandling strular

Inlägg av TomasL »

Inte alls, men att gömma ett antal mycket viktiga delar, så man inte har en aning om vad som händer, är i mitt tycke fullständigt felaktigt.
Man skall använda includes, bibliotek mm skall inte inkluderas per automatik.
Man skall skriva processorkonfigurationen själv.
Först då har man kontroll på vad man egentligen gör, och först då funkar saker och ting som tänkt, samt är portabelt mellan system.

Det är orsaken till att inte använda den här typen av verktyg, eftersom man får sådana här problem.
Senast redigerad av TomasL 11 maj 2013, 19:38:23, redigerad totalt 1 gång.
Användarvisningsbild
SeniorLemuren
Inlägg: 8427
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Enkel ad omvandling strular

Inlägg av SeniorLemuren »

Ska man ta det du skriver bokstavligen då, så borde man gå tillbaka till att programmera med ettor och nollor direkt i µC. först då har man full kontroll. :doh:
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46976
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Enkel ad omvandling strular

Inlägg av TomasL »

Dumma dig inte nu, visst vill du ha 100% kontroll skriver du i ASM, vilket är samma sak som "Ettor och Nollor".
Dock är den typen av kontroll inte nödvändig i de flesta fallen, men ett IDE vilket gömmer konfigurationen och inkluderade bibliotek för dig är inte ett bra val.
Skriv svar