Göra ADC beräkningar med PIC 12F675
Re: Göra ADC beräkningar med PIC 12F675
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.
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.
Re: Göra ADC beräkningar med PIC 12F675
Jag har inte nämnt något om det eftersom jag är osäker kring hur
det är med simulering av MikroC.
det är med simulering av MikroC.
Re: Göra ADC beräkningar med PIC 12F675
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

Re: Göra ADC beräkningar med PIC 12F675
Ett gammalt välprövat aliaslabmaster 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.

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
Re: Göra ADC beräkningar med PIC 12F675
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?
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?
Re: Göra ADC beräkningar med PIC 12F675
På en del MCU måste man "kasta" första ADC-värdet efter initiering. Vet ej hur det är med den här.
Re: Göra ADC beräkningar med PIC 12F675
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
Re: Göra ADC beräkningar med PIC 12F675
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:
Först kollar du A,
sedan kollar du B.
Det är ju skillnad mot:
där du då struntar i att kolla B om A är sann.
Två if-satser efter varandra kan bara göras på ett sätt, och det fungerar alltid:
Kod: Markera allt
if (A) { ... }
if (B) { ... }
sedan kollar du B.
Det är ju skillnad mot:
Kod: Markera allt
if (A) { ... }
else if (B) { ... }
Re: Göra ADC beräkningar med PIC 12F675
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
Antagligen beror ditt problem på att du nästlat några if-satser felaktigt. (If-sats inne i en annan if-sats).
Re: Göra ADC beräkningar med PIC 12F675
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
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
Re: Göra ADC beräkningar med PIC 12F675
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
eller
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.
Ä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 () {}
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;
Kod: Markera allt
if (A == 1)
c1 = 1;
if (B != 2)
c2 = 2;
Kod: Markera allt
if (A == 1) {
c1 = 1;
}
if (B != 2) {
C2 = 2;
}
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 () {}
Re: Göra ADC beräkningar med PIC 12F675
Nja! Är nog kodaren som inte tänkt igenom riktigt.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


Kod: Markera allt
if(5 > 4) {
RELAY_OUT = 1;
}
if(2 < 1) {
RELAY_OUT = 1;
} else {
RELAY_OUT = 0;
}
Re: Göra ADC beräkningar med PIC 12F675
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.eftersom det värdet var uppfyllt när jag provade
Re: Göra ADC beräkningar med PIC 12F675
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=1Kaggen skrev:Nja! Är nog kodaren som inte tänkt igenom riktigt.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 detEtt 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:
Kuggfråga: Kan du svara på vad RELAY_OUT är efter dessa rader kod?Kod: Markera allt
if(5 > 4) { RELAY_OUT = 1; } if(2 < 1) { RELAY_OUT = 1; } else { RELAY_OUT = 0; }
Re: Göra ADC beräkningar med PIC 12F675
Ok, det köper jag.jesse skrev: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.eftersom det värdet var uppfyllt när jag provade
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??