Sida 1 av 1

Testa A/D-värden från en trimpot på ett smart sätt?

Postat: 4 oktober 2007, 22:37:03
av unzuf
Hej!

Jag håller på med ett litet meny-projekt med en PIC och en 16x2 alfanumerisk display. Det jag har gjort är att m.h.a en potentiometer så kan man välja olika alternativ i menyn, 1-15.

Nackdelen för mig nu är att koden blir så onödigt stor! För att testa värdena har jag gjort på följande sätt:

Kod: Markera allt

val := ADC_Read(2) shr 2; // Läs värdet från trimpoten

if val <> lastval then // Är värdet samma som det senaste lästa? Skippa kommande 'begin' isåfall.
begin
    if val <= 17 then valc := 15
    else
    if (val <= 34) and (val > 17) then valc := 14
    else
    if (val <= 51) and (val > 34) then valc := 13;
    else
    OSV ända ner till 1...
end;

[Fortsättning med annan kod]
Som ni ser så blir det väldigt mycket kod av detta, och HEX-filen blir oacceptabelt stor.

Finns det något smidigare matematiskt sätt att lösa detta på? Det behöver inte vara mikroPascal-anpassat, går lika bra med C eller andra språk som går att förstå för en sån som jag (asm-dyslektiker).

Tack för mig!

Postat: 4 oktober 2007, 22:39:52
av sodjan
> if ....and (val > 17)...

Det vet du ju redan så den testen är onödig...

Postat: 4 oktober 2007, 22:43:32
av unzuf
sodjan: Jo, men testar jag bara om värdet är >17 så kan ju menyvalet vara allt mellan 1 och 14. Jag måste ju också se till att värdet är under en viss gräns för att få fram ett specifikt "val" i menyn.

Postat: 4 oktober 2007, 22:46:24
av sodjan
OK, eftersom du inte förstog vad jag skrev :

Kod: Markera allt

if val <> lastval then // Är värdet samma som det senaste lästa? Skippa kommande 'begin' isåfall.
begin
    if val <= 17 then valc := 15
    else
    if (val <= 34) then valc := 14
    else
    if (val <= 51) then valc := 13;
    else
    OSV ända ner till 1...
end;

Postat: 4 oktober 2007, 22:48:18
av speakman
Om du högerskiftar resultatet 4ggr så får du 0-15 istället. Dessutom avrundat.
Då har du redan "valc" klart.
Dividera i 16 borde ge samma resultat.

Kod: Markera allt

valc := val / 16

Postat: 4 oktober 2007, 22:53:07
av unzuf
:oops:

Fan vad allt blev fullständigt kristallklart nu..! Varför i h-e har jag
gjort den kollen (>värde) från början? :?

Haha, vad enkelt saker o ting kan lösas ibland!
Tack så mycket sodjan!

Postat: 4 oktober 2007, 22:55:55
av speakman
Var inte min lösning enklare :?:

Vilken upplösning har du på AD:n?

Postat: 4 oktober 2007, 22:56:54
av sodjan
Jo, tänkte också på det. Det brukar finnas smartare sätt att dela upp
t.ex ett ADC värde i olika intervall. Shiften fungerar ju bra i detta fall.

Sen skulle jag nog inte använda en pot alls till detta (även om det kan fungera skapligt).
Antingen två "upp/ner" knappar eller en roterande pulsgivare (enkoder).

EDIT:
> Var inte min lösning enklare

Jag tror inte att han hade hunnit se den... :-)

Postat: 4 oktober 2007, 22:59:10
av speakman
Känner mig hemskt ignorerad :!: :roll: :lol:

Postat: 4 oktober 2007, 23:03:50
av unzuf
speakman: Din lösning var lysande! :) Tack så mycket! Nu blev det lite roligare att fortsätta igen.
Upplösningen är 10 bit, använder en PIC16F877A.

sodjan: Mjo jag kan hålla med om att poten blir lite jobbig som meny-val-väjare men jag använder även samm pot för att öka/sänka olika inställbara värden i menyn.

Postat: 4 oktober 2007, 23:06:36
av speakman
Då måste du skifta 6 gånger, eller dividera i 64.