Blir galen på mikroC [LÖST!]
Blir galen på mikroC [LÖST!]
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
}
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.
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;
Ahaaa.... 
Gotya' !!!!
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...

Gotya' !!!!

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.
Varför använder du inte switch()?
Jag tycker att det är enklare och enklare överskådligt.
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;
}
- EagleSpirit
- Inlägg: 1288
- Blev medlem: 27 maj 2003, 23:15:48
- Ort: Västerås
- Kontakt:
O/T, men: Varför switch?
Fast jag är nog mer inne på kodstorlek än överblicklighet...
(sry, kunde inte låta bli)
Mvh
speakman

Kod: Markera allt
int tid,tbl[] = {1,3,6,120,180,300,480,720};
tid = tbl[GPIO & 0x07];

(sry, kunde inte låta bli)
Mvh
speakman
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.