Sida 1 av 1

switch-case problem dsPIC

Postat: 21 februari 2011, 22:15:38
av Birger1234
Hej!

Har problem med switch-case. Har case1,2,3,4,5.

Sekvensen av cases skall startas av att en bit på en inport går hög en så kallad kontroll bit.
Om den är hög så kör man case1 när den är färdig körs case2 när den är färdig körs case3
och när den är färdig körs case4 men om kontrollbiten fortfarande är hög så ska man
stanna i case4 så länge som den är hög och det kan vara hur länge som helst.
Om den däremot går låg så går case5 igång och sen är sekvensen av cases färdig.

Nu kan det hända att kontrollbiten går låg före den nått case 4, detta kan
hända i case 1,2 eller 3 om så sker så hoppar man direkt till case5.

Om kontroll biten skulle gå hög igen så upprepas sekvensen igen.

Har all kod uppe för alla cases och kan stega igenom dem via en räknare som
går via switch och på så vis emulerar sekvensen för att kolla att varje case
funkar som de ska.

Frågan är således hur får man denna sekvens att utföras enligt ovan med bara en bit som går hög?
Som jag förstått det så måste man ha en slags återmatning från varje case som signalerar
case byte men hur sammanför man det med en tidsoberoende kontrollbit?

Har försökt hitta info om detta på nätet så mycket jag bara kan men har inte haft turen
att hitta nått som jag kan ta lärdom ifrån för att implementera denna kontrollbit.

Re: switch-case problem dsPIC

Postat: 21 februari 2011, 23:28:23
av stekern
Nåt sånt här skulle väl funka. underförstått är att den körs i en loop, samt att det var lite oklart om case 4 skulle köras om och om igen innan den väntar på att få gå till state 5.

Kod: Markera allt

switch (state) {
case 1:
    if (inport & CONTROL_BIT) {
        do_case1();
        state = 2;
    } else {
        state = 5;
    }
    break;
case 2:
    if (inport & CONTROL_BIT) {
        do_case2();
        state = 3;
    } else {
        state = 5;
    }
   break;
case 3:
    if (inport & CONTROL_BIT) {
        do_case3();
        state = 4;
    } else {
        state = 5;
    }
   break;
case 4:
    if (inport & CONTROL_BIT) {
        do_case4();
    } else {
        state = 5;
    }
    break;
case 5:
    if (inport & CONTROL_BIT) {
        state = 1;
    } else {
        do_case5();
    }
    break;
}

Re: switch-case problem dsPIC

Postat: 24 februari 2011, 01:01:53
av Birger1234
Tack Stekern det var ett bra grund förslag kör den, allt funkar förutom case 5, en nedräknings loop
som känner av kontroll bitens polaritet och en tidigare case nivå. Nivån förs ju över till case 5 när
den evalueras men när nedräkningen når en viss nedre nivå (några steg före 0) så dras beräknings
tiden ut??

Kod: Markera allt

case 5:
if (CONTROL_BIT<1 & var1>0 )  
{
i-=T1;         //i unsigned int,T1 tids varibel unsigned char
var1=i>>8;   //avhyvling till 8bitar 
}
else
{
stage=0;
}
break;
förtydligande: ja case 4 körs bara i en loop som kollar sig själv mot kontroll bit

Re: switch-case problem dsPIC

Postat: 25 februari 2011, 07:29:31
av stekern
Jag förstår inte riktigt vad du menar med "men när nedräkningen når en viss nedre nivå (några steg före 0) så dras beräknings
tiden ut". Men går din nedräkning alltid jämnt upp? D.v.s kommer i-=T1 alltid sluta på exakt 0?
Om den inte gör det kommer det inte fungera som du tänkt det.

Edit: Eller snarare kommer var1 alltid sluta på exakt 0
Edit2: Sen skulle jag skriva if ((CONTROL_BIT<1) && (var1>0)) för att minimera risken för feltänk, men i det har fallet skall det funka som du skrivit (> har högre prioritet än &)

Re: switch-case problem dsPIC

Postat: 27 februari 2011, 01:26:09
av Birger1234
Har två olika varianter som jag testar med för att se hur de beter sig den ena där slutar var1 alltid på 0 och skall sluta på 0 i den andra kan var1 sluta på vad som helst mellan föregående case var1 nivå och 0 om CONTROL_BIT>1, d.v.s hela loopen börjar om med case1.

I båda fallen så dras beräknings tiden ut!!

Det är och så därför jag är förundrad varför den beter sig underligt på de sista stegen av nedräkningen,man kan tycka att det rimligtvis borde vara fel redan från början av nedräkningen. var1 skickas ut på en PWM kanal som debug så man kan sitta och titta på nedräkningen.

Ska testa ditt edit 2 förslag och se om kompilatorn säger nått extra.
Undras skillnaden mellan logisk och bit and i detta fall?

Re: switch-case problem dsPIC

Postat: 27 februari 2011, 11:23:26
av stekern
Jag har fortfarande problem att förstå dina förklaringar utan att se resten av koden.
Vad jag syftade på var hursomhelst att var1>0 är precis samma sak som var1!=0

Angående & vs &&, i detta fall gör det ingen skillnad, förutom att man slipper tänkaom uttrycken kan returnera något annat än 0 och 1 med &&.