Blir galen på mikroC [LÖST!]

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
gvs
EF Sponsor
Inlägg: 1688
Blev medlem: 18 oktober 2003, 14:20:34
Ort: Göteborg
Kontakt:

Blir galen på mikroC [LÖST!]

Inlägg av gvs »

Har suttit och pillat med en automagisk växtdusch. den ska dra igång en pump med vissa tidsintervall. Man ska kunna välja tiden som den har mellan varje dusch, det är där problemet börjar...
Den kör ALLTID första raden i if-satsen ( tid = 1) varför?

är en pic 12f629

int tid = 0;
int i = 0;
int foo;
void main() {
CMCON = 0xff; // turn comparators of (digital in/out)
OPTION_REG = 0x7f; // Global weak pullup enableled
WPU = 0xff; // weak pull up
TRISIO = 001111; // 0,1,2 = in 4,5 = ut
foo = (GPIO && 0x07); // masking out some bits needed?
if (foo = 0x7) tid = 1;
else if (foo = 0x6) tid = 3;
else if (foo = 0x5) tid = 6;
else if (foo = 0x4) tid = 120;
else if (foo = 0x3) tid = 180;
else if (foo = 0x2) tid = 300;
else if (foo = 0x1) tid = 480;
else if (foo = 0x0) tid = 720;
else tid = 5;

do { // beginning of a repeat loop
GPIO.F4 = 1; // turn ON pump on gpio
Delay_ms(7000); // wait for 7 second
GPIO.F4 = 0; // turn OFF pump
for(i=0; i<(tid); i++){ // Wait the number of minutes set in "tid"
Delay_ms(30000); // wait for 30 seconds
}
} while(1); // endless loop
}
Senast redigerad av gvs 3 januari 2006, 17:46:32, redigerad totalt 1 gång.
Seven11
Inlägg: 547
Blev medlem: 13 maj 2004, 23:43:33

Inlägg av Seven11 »

i C/C++ så är ju ett lika-med-tecken (=) det samma som tilldela och två lika-med-tecken det samma som testa (==) så prova detta:
if (foo == 0x7) tid = 1;
else if (foo == 0x6) tid = 3;
else if (foo == 0x5) tid = 6;
else if (foo == 0x4) tid = 120;
else if (foo == 0x3) tid = 180;
else if (foo == 0x2) tid = 300;
else if (foo == 0x1) tid = 480;
else if (foo == 0x0) tid = 720;
else tid = 5;
gvs
EF Sponsor
Inlägg: 1688
Blev medlem: 18 oktober 2003, 14:20:34
Ort: Göteborg
Kontakt:

Inlägg av gvs »

Insåg just det... pinsam miss... men det funkar iaf inte.
Seven11
Inlägg: 547
Blev medlem: 13 maj 2004, 23:43:33

Inlägg av Seven11 »

hur vet du förresten att tid alltid blir samma? kör du applikationen i en simulator?
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Ahaaa.... :-P

Gotya' !!!! :badgrin:

foo = (GPIO && 0x07); // masking out some bits needed?

ska vara

foo = (GPIO & 0x07); // masking out some bits needed?

&& = logisk AND (foo=(om GPIO är != 0) OCH (0x07 är != 0), kan ge 1 eller 0 beroende på om GPIO år == 0 eller inte)
& = bitmässig AND, det är DEN du vill åt...
Senast redigerad av Icecap 3 januari 2006, 17:43:33, redigerad totalt 2 gånger.
gvs
EF Sponsor
Inlägg: 1688
Blev medlem: 18 oktober 2003, 14:20:34
Ort: Göteborg
Kontakt:

Inlägg av gvs »

Nu har jag blivit ännu mer förvirrad....

kör med sådana värden på tid att jag kan se vad som händer med utgången på picen med hjälp av en LED.

Men nu har jag lyckats ändra något som gör att den ( enligt simulatorn) alltid rasar igenom mina if-satser och fastnar på slutet ( tid = 720)....
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Varför använder du inte switch()?

Kod: Markera allt

foo = (GPIO & 0x07); // masking out some bits needed?
switch(foo)
  {
  case 0x07: tid =   1; break;
  case 0x06: tid =   3; break;
  case 0x05: tid =   6; break;
  case 0x04: tid = 120; break;
  case 0x03: tid = 180; break;
  case 0x02: tid = 300; break;
  case 0x01: tid = 480; break;
  case 0x00: tid = 720; break;
  default: tid = 5;
  }
Jag tycker att det är enklare och enklare överskådligt.
Användarvisningsbild
EagleSpirit
Inlägg: 1288
Blev medlem: 27 maj 2003, 23:15:48
Ort: Västerås
Kontakt:

Inlägg av EagleSpirit »

eller så är det så att foo är 0?

kan du se vad foo har för värde så att du vet var den ska ta vägen? har du möjlighet att "debugga" värdet precis innan if-satsen?
Seven11
Inlägg: 547
Blev medlem: 13 maj 2004, 23:43:33

Inlägg av Seven11 »

men du får ju sätta dina ingisnaler själv i simulatorn antar jag... och om du nu gjort rätt med bitvis OCH tecknet så kanske du får 0x00 (vilket vore troligt)... testa att ändra lite i simulator så att ingsinalerna är annorlunda och se om det funkar.

EDIT: För seg... :lol:
gvs
EF Sponsor
Inlägg: 1688
Blev medlem: 18 oktober 2003, 14:20:34
Ort: Göteborg
Kontakt:

Inlägg av gvs »

Tackar för hjälpen alla...

icecaps föslag med logiskt AND och en kalllödning löste det :)
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

O/T, men: Varför switch? :D

Kod: Markera allt

int tid,tbl[] = {1,3,6,120,180,300,480,720};

tid = tbl[GPIO & 0x07];
Fast jag är nog mer inne på kodstorlek än överblicklighet... :roll:
(sry, kunde inte låta bli)

Mvh
speakman
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

speakman: jag var inne på samma idé men jag antog att det var mer som skulle göras vid varje punkt.

I övrigt har du vänt tabellen åt fel håll, index 0 ska ge 720....men annars vore det rätt, snabbt och litet = gillas.
gvs
EF Sponsor
Inlägg: 1688
Blev medlem: 18 oktober 2003, 14:20:34
Ort: Göteborg
Kontakt:

Inlägg av gvs »

Speakmans lösning är ju klart snyggast... Men det funkar nu så det får stå. Enda saken som jag är lite missnöjd med (förutom spänningsfallet som låser allt, se annan tråd) är att munstycket som skapar en fin vattendusch är lite för koncentrerad, vill ha större spridning. Men det ska nog gå att lösa med en nål.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

GAH! Ja det gick lite fort i morse (bråttom till jobbet :roll:)! Får skylla på det. :D
Hoppas iaf det löser sig med spänningsfallet! Vad tros om en konding strax innan Vdd på PICen? Du kan ju svara i rätt tråd om du vill. :)

Mvh
speakman
Skriv svar