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

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
Användarvisningsbild
unzuf
Inlägg: 166
Blev medlem: 1 februari 2005, 18:07:08

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

Inlägg 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!
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> if ....and (val > 17)...

Det vet du ju redan så den testen är onödig...
Användarvisningsbild
unzuf
Inlägg: 166
Blev medlem: 1 februari 2005, 18:07:08

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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;
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg 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
Användarvisningsbild
unzuf
Inlägg: 166
Blev medlem: 1 februari 2005, 18:07:08

Inlägg 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!
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Var inte min lösning enklare :?:

Vilken upplösning har du på AD:n?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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... :-)
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Känner mig hemskt ignorerad :!: :roll: :lol:
Användarvisningsbild
unzuf
Inlägg: 166
Blev medlem: 1 februari 2005, 18:07:08

Inlägg 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.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Då måste du skifta 6 gånger, eller dividera i 64.
Skriv svar