Sida 1 av 1

Switch sats fungerar inte

Postat: 23 januari 2010, 00:03:48
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

Re: Switch sats fungerar inte

Postat: 23 januari 2010, 00:04:53
av eqlazer
Börja med att lägga till code-taggar i ditt inlägg så att det går att läsa.

Re: Switch sats fungerar inte

Postat: 23 januari 2010, 00:27:49
av karlstedt
Sätt en "default:" -tag i switchen och se om du hamnar där.

Re: Switch sats fungerar inte

Postat: 23 januari 2010, 00:36:24
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:

Re: Switch sats fungerar inte

Postat: 23 januari 2010, 00:40:12
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".

Re: Switch sats fungerar inte

Postat: 23 januari 2010, 01:03:44
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:

Re: Switch sats fungerar inte

Postat: 23 januari 2010, 02:06:36
av danielr112
Lycka till i bingen då 8) :mrgreen:

Re: Switch sats fungerar inte

Postat: 23 januari 2010, 08:23:13
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:

Re: Switch sats fungerar inte

Postat: 26 januari 2010, 15:10:54
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.