Enkel A/D omvandling strular

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Icecap
Inlägg: 26651
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Enkel ad omvandling strular

Inlägg av Icecap »

Jag använder MikroC också (ibland) och där hör det till att initiera ganska som vanligt!
Ska man använda portarna ska de initieras som vanligt.
Ska man använda AD-omvandlaren ska den initieras som vanligt.
Ska man använda UART'en ska den initieras som vanligt.
Ska man använda AD-omvandlaren ska den initieras som vanligt.

MikroC är INTE magisk i den hänseende!

Att det sedan kan finnas färdiga initieringsrutiner är bara kul men de ska ju användas också och dom får man som användare/programmör faktisk lägga in i programmet!
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 »

Ska försöka hinna kolla ikväll på databladet.

Men jag tycker ändå att det är jäkligt skumt att jag har ett fullt fungerande program/krets om jag inte ens initialiserat adcn
Användarvisningsbild
Icecap
Inlägg: 26651
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Enkel ad omvandling strular

Inlägg av Icecap »

Jag ser INGENSTANS att du rent faktisk har verifierat att de värden du får från read_adc() stämmer med ingångsvärdet. Du antar att det borde fungera men du vet inte om det verkligen gör det.

"Assumption is the mother of fuck-up's!"
Användarvisningsbild
Klas-Kenny
Inlägg: 11843
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Enkel ad omvandling strular

Inlägg av Klas-Kenny »

Något jag funderar på är om du verifierat att programmet över huvud taget exekveras?

Kan ju mycket väl vara något strul med MCLR eller liknande.
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 »

Programmet körs. Jag har provat innan att bara toggla out med 1hz och det funkar.

Har även på ren måfå vänt tecknet i if satsen adc > .....

Då blev out=0 sedan kom fördröjning och sedan blev den ett och förblev ett
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 »

@icecap.

Vet inte riktigt hur jag ska verifiera det i nya programmet.

I det gamla är det väl verifierat med en komplett krets, men du kanske menar på ngt annat sätt?
Användarvisningsbild
SeniorLemuren
Inlägg: 8432
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Enkel ad omvandling strular

Inlägg av SeniorLemuren »

Har du kollat om du får något värde överhuvudtaget i ADRESH, ADRESL som ändras med pålagd spänning.

Jag brukar kolla med att sätta flera olika större/ mindre än för att ringa in värden och se om det händer något. Det kan ju vara som Icecap är inne på att du får värden men att de inte är vad du tror.
Användarvisningsbild
Icecap
Inlägg: 26651
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Enkel ad omvandling strular

Inlägg av Icecap »

Detta är just en av anledningarna till att antingen aktivera en serieport eller ha en ICD eller PICKit!

Med serieporten kan man skriva ut det uppmätta värde och se att det ändrar sig med potentiometern man lekar med.
Samma sak med ICD/PICKit: kör ett varv och se att AD-värdet är "konstant". Sedan vrider man på pot'en så att ingångsspänningen ändras och man kör ett par varv mer och ser att värdet är stabilt på det nya värde.

Senast fick jag fixa en paniklösning då jag inte fick UART'en att fungera: bit-bang!
Tog byten som skulle sändas, lade in i en 16-bit variabel, shiftade den ett steg åt vänster och lade sedan till 0x0600.

Sedan körde jag:

Kod: Markera allt

void Send_Byte(unsigned char Byte)
  {
  unsigned short Bits;
  unsigned char Ctr, Dly;
  Bits = (Byte << 1) + 0x0600; // Gives one startbit (0), the datas itself and two stopbits
  for(Ctr = 0; Ctr < 11; Ctr++)
    {
    if(Bits & 0x0001) Output_Pin = 1;
    else output_Pin = 0;
    Bits >>= 1; // Shift and prepare next bit
    for(Dly = 0; Dly < MAGIC_VALUE; Dly++); // Bit delay to get correct baudrate
    }

void Send_Value(unsigned short Value) // Print out value as ASCII
  {
  unsigned short X, Y;
  X = 10000;
  while(Value >= 10)
    {
    Y = 0;
    while(Value >= X)
      {
      Y++;
      Value -= X;
      }
    Send_Byte(Y + '0'); // Send out 10k, 1k, 100's and 10's
    X /= 10;
    }
  Send_Byte(Y + '0'); // Make sure that at least one '0' is send
  }
Med rätt värde på MAGIC_VALUE får man rätt bit-hastighet och med en MAX232-omvandlare av spänningen har man alltså en bit-bang UART sändare.
Då kan man enkelt skriva ut värden till en terminal/ett terminalprogram och då få ut vilket värde som läsas ut.
Kaggen
Inlägg: 432
Blev medlem: 29 januari 2005, 03:06:02

Re: Enkel A/D omvandling strular

Inlägg av Kaggen »

@newbadboy
Har du initialiserat ADCON? Satt rätt acquisition time?

Har inte micro C egen init rutin i biblioteket för A/D konvertering?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Enkel A/D omvandling strular

Inlägg av sodjan »

> Och fortfarande är AD-funktionen inte initialiserat! Att göra en ADC_Read() har inget med AD-initiering att göra helt enkelt!

Det vore ju bättre att RTFM först. Där står om Adc_Read:
Description
Initializes PIC’s internal ADC module to work with RC clock. Clock determines
the time period necessary for performing AD conversion (min 12TAD).
Parameter channel represents the channel from which the analog value is to be
acquired. Refer to the appropriate datasheet for channel-to-pin mapping.
Och deras eget kodexempel:

Kod: Markera allt

unsigned int temp_res;
void main() {
  ANSEL = 0x04; // Configure AN2 pin as analog
  TRISA = 0xFF; // PORTA is input
  ANSELH = 0; // Configure other AN pins as digital I/O
  TRISC = 0x3F; // Pins RC7, RC6 are outputs
  TRISB = 0; // PORTB is output
  do {
    temp_res = ADC_Read(2); // Get 10-bit results of AD conversion
    PORTB = temp_res; // Send lower 8 bits to PORTB
    PORTC = temp_res >> 2; // Send 2 most significant bits to RC7, RC6
  } while(1);
}
Så så längt ser det väl OK ut.

En märklig sak är att i MikroC Pro manulen står det "Requires: Nothing"
men i en äldre MicroC manual står den en hel del under "Requires:" kring
t.ex TRIS and analog/digital konfigurering o.s.v.

En annan sak är att detta ju gäller en PIC 12F modell. De skiljer sig på en del
punkter från "vanliga" PIC 16F. Hurvida detta kan påverka just Adc_Read()
har jag inte en aning om. Om ingenting annan fungerar så kan man kolla
den ASM kom kompilatorn genererar och verifiera att det ser OK ut.

Det bör vara ganska enkelt att hitta koden som just Adc_Read() skapar
och verifiera den mot databladet.

Sen finns ju alltid möjligheten att strunta i Adc_Read() helt och köra direkt
mot rellevanta register, då kan man i princip ta exemplen direkt ur databladet
direkt, bara att skriva om från ASM till C.
Användarvisningsbild
Walle
Moderator
Inlägg: 7701
Blev medlem: 14 december 2004, 10:32:18
Ort: Stockholm

Re: Enkel A/D omvandling strular

Inlägg av Walle »

Tittade du på mitt exempel? I funktionen Init gör jag all nödvändig initiering av ADCn (samt initiering av timer 0 och övriga register som inte har ett definierat state vid påslag). I ISRen händer det bara fyra saker, varav två har med ADCn att göra. Dels är det en utläsning (sätter räknar-registret för timer 0) dels sätts GO/DONE för att starta en ny konvertering.

Jag förstår ärligt inte vad ADC_read ska vara bra för när det är lika enkelt att göra det manuellt om man har databladet öppet (vilket man har när man programmerar en MCU).

Edit: annars känns det som att det vore läge att utnyttja en komparator.
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Enkel A/D omvandling strular

Inlägg av newbadboy »

Hoppas jag kan ta mig lite tid snart att kika på det mer. Min lilla ettåring drar i allt. Det verkar inte vara helt självklart detta...
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Enkel A/D omvandling strular

Inlägg av newbadboy »

Fick igår en kort stund över och hann titta lite på det. Det verkar som om det är HW problem och inte i koden.

Kopplingen jag har är en nedan länk

http://www.ladda-upp.se/bilder/etkxcfshzlheza/

Jag mäter spännings fallet över 0,2ohms motståndet med ad'n i vanliga fall när det inte funkar. Provade istället att mäta över en pott och då funkade det. Skulle nästan tro att DC motorn ger så mycket skit ifrån sig att adc'n ballar ur.
Användarvisningsbild
Icecap
Inlägg: 26651
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Enkel A/D omvandling strular

Inlägg av Icecap »

Men herregud... du måste ju ha något filter mellan mätmotståndet ocn µC-ingången! Ett seriemotstånd på kanske 4,7k (gärna mer!) och en kondensator mellan pinnen och GND, värde på 10nF eller (gärna) mer.
Senast redigerad av Icecap 16 maj 2013, 09:09:30, redigerad totalt 1 gång.
Användarvisningsbild
Walle
Moderator
Inlägg: 7701
Blev medlem: 14 december 2004, 10:32:18
Ort: Stockholm

Re: Enkel A/D omvandling strular

Inlägg av Walle »

newbadboy: du får gärna ladda upp bilder direkt till forumets egna bildserver, istället för till externa bilduppladdningstjänster. Inte nog med att det är mer framtidssäkert (dvs bilderna försvinner inte ur trådar i framtiden när de externa tjänsterna rensar eller läggs ned), dessutom går det i 9 fall av 10 snabbare (både att ladda upp bilden samt att kolla på bilden). Dessutom verkar externa bilduppladdningstjänster inte fungera bra med TapaTalk (app för att läsa forum på smartphones). :)
Skriv svar