Switch sats fungerar inte

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
ChristianS
Inlägg: 229
Blev medlem: 7 januari 2009, 11:13:58
Ort: Limhamn

Switch sats fungerar inte

Inlägg av ChristianS »

Ja nu är det ju lite sent på natten men jag känner nu att jag inte kan förstå längre varför det inte fungerar.
Processor MSP430F2274 IAR compiler
Följande kod:

Kod: Markera allt

/* Display voltage (1 bit<=> 10mV, "12,92Vlt"       */
void display_volt(char channel)
{
  unsigned char volt[]="  ,  Vlt";       // Eight blanks
  unsigned char *pekare;
  unsigned int AD_temp16;
  char temp1,temp2,pos,AD_temp8;
  AD_temp16=0;
  ADC10CTL1 &=0x0FFF;
  
  /*switch (channel)
   {
      case 0:
        ADC10CTL1 |=  INCH_0;
      break;
     
      case 1:
        ADC10CTL1 |=  INCH_1;
      break;
    }*/
  
  ADC10CTL1 |= INCH_1;  // test för att endast läsa kanal 1
  
  
  for (AD_temp8=10;AD_temp8>0;AD_temp8--)
    {  
        ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion start
      __bis_SR_register(CPUOFF + GIE);        // LPM0, ADC10_ISR will force exit
      AD_temp16 +=ADC10MEM; 
    }

Rutinen kallas upp i från menyrutinen med en char channel, satt till 0 eller 1 för att välja vilken av kanalerna som skall mätas.
Kanalen sätts i registret ADC10CTL1 Bit 15-12 styr kanalerna, jag anväder 0 och 1. Debuggern säger att char channel kommer både som 0 eller 1 i från menyrutinen,
när jag nu debuggar så ändras inte registret ADC10CTL1 men väl körs rutinencaserutinen, för att kolla att jag har allt rätt inställa kollade jag genopm att ta bort casesatsen och lägger till att alltid läsa kanal1 då fungerar det pch visar således inspnningen från kanal 1 hela tiden. Varför kan jag inte styra kanalregistret från casesatsen?

Jag blir nipprig på sånt här.
Edit:Tack för tipset om taggarna
Senast redigerad av ChristianS 23 januari 2010, 00:13:07, redigerad totalt 1 gång.
eqlazer
Inlägg: 923
Blev medlem: 22 september 2007, 13:53:45
Ort: Göteborg

Re: Switch sats fungerar inte

Inlägg av eqlazer »

Börja med att lägga till code-taggar i ditt inlägg så att det går att läsa.
Användarvisningsbild
karlstedt
EF Sponsor
Inlägg: 966
Blev medlem: 14 oktober 2003, 16:55:23
Ort: Lund
Kontakt:

Re: Switch sats fungerar inte

Inlägg av karlstedt »

Sätt en "default:" -tag i switchen och se om du hamnar där.
Användarvisningsbild
ChristianS
Inlägg: 229
Blev medlem: 7 januari 2009, 11:13:58
Ort: Limhamn

Re: Switch sats fungerar inte

Inlägg av ChristianS »

Jag kan steppa igenom case rutinen med rätt väg enligt variablen, har nu testat att göra om den som en if sats men inte fan fungerade det heller.
Förbaskat märkligt :humm:
Användarvisningsbild
karlstedt
EF Sponsor
Inlägg: 966
Blev medlem: 14 oktober 2003, 16:55:23
Ort: Lund
Kontakt:

Re: Switch sats fungerar inte

Inlägg av karlstedt »

Håller du verkligen reda på '0' och 0 när du gör sådär. Är inkanalen en char i sin "rätta" bemärkelse?

Du menar alltså att
ADC10CTL1 |= INCH_0;
och
ADC10CTL1 |= INCH_1;
körs?

Isf, hur är det med det här registret när du bara OR:ar in värdet? Nollar du nån stans. Annars kör du ju "kanal3".
Användarvisningsbild
ChristianS
Inlägg: 229
Blev medlem: 7 januari 2009, 11:13:58
Ort: Limhamn

Re: Switch sats fungerar inte

Inlägg av ChristianS »

Innan switch satsen "ADC10CTL1 &=0x0FFF;" nollar aktuella bitar. Casesatsen körs rätt i förhållande till innehållet i "char channel"

Nu skall jag gå och lägga mig, min överförfriskade sambo kom precis hem :happy:
danielr112
Inlägg: 8055
Blev medlem: 18 januari 2009, 00:48:24
Ort: Alvesta, Småland

Re: Switch sats fungerar inte

Inlägg av danielr112 »

Lycka till i bingen då 8) :mrgreen:
Användarvisningsbild
ChristianS
Inlägg: 229
Blev medlem: 7 januari 2009, 11:13:58
Ort: Limhamn

Re: Switch sats fungerar inte

Inlägg av ChristianS »

Följande har ändrats:
1. char channel har ändrats till unsigned char för att verkligen säkerställa 1 eller 0.
2. case satsen bytt till följande:

Kod: Markera allt

 ADC10CTL1 &=0x0FFF;  // Nollställ kanalval 
 if (channel==1)
    {
      ADC10CTL1 |= 0x1000;
    }
Debugging, när menyerna steppas igenom och man kommer till 1 channel är då 1 och ADC10CTL1 |= 0x1000; highlightas som nästa instruktion och sedan utförs. Här är det märkliga registret ADC10CTL1 ändras inte :?: men om jag skriver ADC10CTL1 |= 0x1000; utanför en case/if sats så fungerar det givetvis men jag vill ju byta kanal utan att behöva kopiera hela rutinen. Troode att jag skulle lösa det efter att ha sovit en stund men inte.
Säger som Nicke i serien Gaston RRROOONGTUDJUUUU! :evil:
Användarvisningsbild
ChristianS
Inlägg: 229
Blev medlem: 7 januari 2009, 11:13:58
Ort: Limhamn

Re: Switch sats fungerar inte

Inlägg av ChristianS »

Problemet är löst, RTFM! de bitarna kan inte ändras efter att "sampling enable" är satt och givetvis fungerar det första omgången så nu är det löst med att stänga av samplingen efter varje läsning.
Det är ju tyvärr inte första gången man upptäcker att man borde läst databladet lite noggrannare från början.
Skriv svar