Sida 1 av 1

Blir galen på mikroC [LÖST!]

Postat: 3 januari 2006, 17:07:53
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
}

Postat: 3 januari 2006, 17:24:45
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;

Postat: 3 januari 2006, 17:25:46
av gvs
Insåg just det... pinsam miss... men det funkar iaf inte.

Postat: 3 januari 2006, 17:29:26
av Seven11
hur vet du förresten att tid alltid blir samma? kör du applikationen i en simulator?

Postat: 3 januari 2006, 17:34:34
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...

Postat: 3 januari 2006, 17:34:49
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)....

Postat: 3 januari 2006, 17:39:32
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.

Postat: 3 januari 2006, 17:39:37
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?

Postat: 3 januari 2006, 17:41:34
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:

Postat: 3 januari 2006, 17:46:09
av gvs
Tackar för hjälpen alla...

icecaps föslag med logiskt AND och en kalllödning löste det :)

Postat: 4 januari 2006, 09:07:08
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

Postat: 4 januari 2006, 10:12:55
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.

Postat: 4 januari 2006, 10:53:17
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.

Postat: 4 januari 2006, 11:06:32
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