Göra ADC beräkningar med PIC 12F675

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
labmaster
Inlägg: 2919
Blev medlem: 5 april 2011, 01:10:25

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av labmaster »

Hej Newbadboy, kul alias förresten.

Bara en lite reflektion så från mig på nattkröken. Jag har inte pysslat med PIC och den där programmeraren och programutvecklingsmiljön du använder men ett bra tips är att köra programmet man skriver genom debuggern. Det blir enklare att hitta fel och förstå vad programmet gör när man single steppar genom programkoden.

Sodjan eller någon annan kan säkert berätta om du har någon debugger ifall du inte hittar den själv.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av sodjan »

Jag har inte nämnt något om det eftersom jag är osäker kring hur
det är med simulering av MikroC.
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av newbadboy »

sodjan skrev:Lite mer kommenterar hade varit bra så att man förstår
lite enklare varför du läser ADC'n dubbelt. Verkar ha något
med "false trig" att göra (?).

Sen så är det lite oklart vad det var du frågade om egentligen.
Det finns baa en version av koden och inget att jämföra med.

"Spännande" formattering också, som dessutom verkar ändra
på sig lite då och då... :-)

Har lagt till kommentarer på förra sidan.

Problemet var att koden aldrig gick in i den första if(adc_rd > 0x39A) trots att adc värdet var satt till fem volt. Dock hade jag vid detta läget inte en if else sats som nu utan if(adc_rd < trig_val).Dock fungerade if(adc_rd < trig_val) satsen som den skulle.

Efter ett tag ändrade jag if(adc_rd < trig_val) till else if(adc_rd < trig_val) och då fungerade hela koden.

Så min fråga var eg varför är jag tvungen att skriva..

if(-------)


else if(------)

else

och varför det inte bara funkar med

if(-------)

if(-------)

else

hoppas det går att förstå vad jag menar :oops:
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av newbadboy »

labmaster skrev:Hej Newbadboy, kul alias förresten.

Bara en lite reflektion så från mig på nattkröken. Jag har inte pysslat med PIC och den där programmeraren och programutvecklingsmiljön du använder men ett bra tips är att köra programmet man skriver genom debuggern. Det blir enklare att hitta fel och förstå vad programmet gör när man single steppar genom programkoden.

Sodjan eller någon annan kan säkert berätta om du har någon debugger ifall du inte hittar den själv.
Ett gammalt välprövat alias :)

programmeraren stödjer inte debug vad jag vet, är rätt säker på det. Utvecklingsmiljön har jag faktiskt inte kollat upp om den har ngn form av debug
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av jesse »

EDIT: tar bort mitt inlägg: jag läste fel i koden.

Den är lite svårläst med tanke på indenteringarna.

Men sånt här med if-satser och sånt är ju ren logik, så ställ upp det och gå igenom vad som händer.
Om du är 100% säker på att logiken var rätt även innan så måste det vara något fel med de inlästa värdena.
Vis uppstart t.ex. är det första du gör att läsa in ADC. Kanske du skulle ha en fördröjning där också, först av allt?
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av bearing »

På en del MCU måste man "kasta" första ADC-värdet efter initiering. Vet ej hur det är med den här.
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av newbadboy »

jesse skrev:EDIT: tar bort mitt inlägg: jag läste fel i koden.

Den är lite svårläst med tanke på indenteringarna.

Men sånt här med if-satser och sånt är ju ren logik, så ställ upp det och gå igenom vad som händer.
Om du är 100% säker på att logiken var rätt även innan så måste det vara något fel med de inlästa värdena.
Vis uppstart t.ex. är det första du gör att läsa in ADC. Kanske du skulle ha en fördröjning där också, först av allt?

Vad jag kan se så blir det fel om man skriver två if satser efter varandra. Direkt jag satte else if då funka det
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av jesse »

Det är inget som blir fel. Syntaxen är bara på ett sätt. Skriver du efter den så blir det så.

Två if-satser efter varandra kan bara göras på ett sätt, och det fungerar alltid:

Kod: Markera allt

if (A) { ... }
if (B) { ... }
Först kollar du A,
sedan kollar du B.

Det är ju skillnad mot:

Kod: Markera allt

if (A) { ... }
else if (B) {  ... }
där du då struntar i att kolla B om A är sann.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av jesse »

Kod: Markera allt

Så min fråga var eg varför är jag tvungen att skriva..

if(-------)


else if(------)

else

och varför det inte bara funkar med

if(-------)

if(-------)

else

hoppas det går att förstå vad jag menar  
Här har du ju glömt det viktigaste: hakparenteserna. Utan dem har vi ju ingen aning om vad du gör / vill göra.
Antagligen beror ditt problem på att du nästlat några if-satser felaktigt. (If-sats inne i en annan if-sats).
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av newbadboy »

Detta var bara ett ex för att tydliggöra vad jag menar.i min riktiga kod som jag visat tidigare i tråden har jag hak paranteser. Hmmm jag ser varför det funkar med Else if.

Men det borde ändå funkat med två if satser efter varandra. Den kollar ju först A satsen och sen B. Då borde den ju exekvera vad som finns i A eftersom det värdet var uppfyllt när jag provade.Jaha skumt är det
labmaster
Inlägg: 2919
Blev medlem: 5 april 2011, 01:10:25

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av labmaster »

Om man inte läser tråden från A till B så missar man ju en hel del. Således kan man nog heller inte riktigt förstå din fråga om varför den inte vill exekvera det som finns i A.

Jag skall försöka ge min syn på det hela utan koppling till ditt program. Det jag skriver skall såldes tolkas som en slags vägledning eller i varje fall min syn på vad jag brukar anse som välstrukturerad programkod omkring if-satser.

Om man bara har en programsats till if går det bra att skriva så här

Kod: Markera allt

if (A == 1) c1 = 1;
if (B != 2)  c2 = 2;
eller

Kod: Markera allt

if (A == 1)
   c1 = 1;
if (B != 2)
   c2 = 2;
I bägge fallen så är det du kallar i if-satsen det som står mellan högerparentesen och semikolonet (;). Det kanske du är helt klar över också. Ett problem med detta som jag ser det är att läsbarheten blir sämre och att det nästan alltid dyker upp ett behov av flera programsatser inom samma if. Därför brukar jag alltid stoppa dit måsvingar även om det inte behövs.

Kod: Markera allt

if (A == 1) {
  c1 = 1;
}

if (B != 2) {
  C2 = 2;
}
Är mycket tydligare, eller hur?

Om ett och samma variabel kan ha olika innehåll så bör man inte först kolla om ett villkor är uppfyllt och sedan direkt efter kola variabeln igen efter ett värde om den första kollen redan är uppfylld. Då skall man helst använda if () { } else if () {}
Kaggen
Inlägg: 432
Blev medlem: 29 januari 2005, 03:06:02

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av Kaggen »

newbadboy skrev:Men det borde ändå funkat med två if satser efter varandra. Den kollar ju först A satsen och sen B. Då borde den ju exekvera vad som finns i A eftersom det värdet var uppfyllt när jag provade.Jaha skumt är det
Nja! Är nog kodaren som inte tänkt igenom riktigt. :) Ett tips är att följa din kod precis som controllern skulle göra. Visst exekverar den A om villkoret är uppfyllt, men har du tänkt på vad som händer om villkoret inte är uppfyllt för B? Nu har du ju inte visat den felaktiga koden, bara den som funkar (antagligen för att inte göra det för lätt att hjälpa dig. :) ), men jag antar att din "ej fungerande" kod såg ut ungefär som nedan:

Kod: Markera allt

if(5 > 4) {
    RELAY_OUT = 1;
}
if(2 < 1) {
    RELAY_OUT = 1;
} else {
    RELAY_OUT = 0;
}
Kuggfråga: Kan du svara på vad RELAY_OUT är efter dessa rader kod?
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av jesse »

eftersom det värdet var uppfyllt när jag provade
Det räcker inte att veta att ett villkor är sant. Du måste följa hela programflödet från börja till slut. Det är absolut inget skumt med det här, programmet gör bara exakt vad du ber det om, inget annat.
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av newbadboy »

Kaggen skrev:
newbadboy skrev:Men det borde ändå funkat med två if satser efter varandra. Den kollar ju först A satsen och sen B. Då borde den ju exekvera vad som finns i A eftersom det värdet var uppfyllt när jag provade.Jaha skumt är det
Nja! Är nog kodaren som inte tänkt igenom riktigt. :) Ett tips är att följa din kod precis som controllern skulle göra. Visst exekverar den A om villkoret är uppfyllt, men har du tänkt på vad som händer om villkoret inte är uppfyllt för B? Nu har du ju inte visat den felaktiga koden, bara den som funkar (antagligen för att inte göra det för lätt att hjälpa dig. :) ), men jag antar att din "ej fungerande" kod såg ut ungefär som nedan:

Kod: Markera allt

if(5 > 4) {
    RELAY_OUT = 1;
}
if(2 < 1) {
    RELAY_OUT = 1;
} else {
    RELAY_OUT = 0;
}
Kuggfråga: Kan du svara på vad RELAY_OUT är efter dessa rader kod?
Precis som i ditt exempel var min felaktiga kod. Dvs två if satser följt av en else. Och som svar på frågan skulle jag säga att relay=1
Användarvisningsbild
newbadboy
Inlägg: 2485
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Göra ADC beräkningar med PIC 12F675

Inlägg av newbadboy »

jesse skrev:
eftersom det värdet var uppfyllt när jag provade
Det räcker inte att veta att ett villkor är sant. Du måste följa hela programflödet från börja till slut. Det är absolut inget skumt med det här, programmet gör bara exakt vad du ber det om, inget annat.
Ok, det köper jag.

Menar du att den gick in i först if satsen, såg att den var uppfylld och sedan satte relay=1

sedan såg den att nästa if sats inte var uppfylld, och till slut hoppade den till else och satte relay=0?

och eftersom det gick så snabbt så hinner inte reläet dra?

Medan else if satsen gör att det räcker med en if sats uppfylld för att den inte hoppar till else satsen, precis som jag vill att den ska göra??
Skriv svar