Läsa av en digital ingång.

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Läsa av en digital ingång.

Inlägg av newbadboy »

Upptäckte en jävligt intressant grej. Driver en lite 0.96" oled display från ebay i detta projekt.

På ett ställe försöker jag skriva ett kolon men hur jag än försökt så blir det ett fråge tecken istället. På andra koordinater blir det kolon men just på ett ställe blir det som sagt frågetecken.

Av ngn anledning gick displayen sönder, kansle mitt fel vet inte. Men var tvungen att köpa en ny hos Kjell. Måste säga att där var rätt mycket skillnad den var mycket skarpare samt hör och häpna den skrev ett kolon och inte frågetecken.

Så hur ska man kunna köpa fler av dessa. De verkar vara utgående hos Kjell men även för dyra eg. Känner till ngt ställe man kan köpa oleds av denna typ av bra kvalitet?
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4689
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: Läsa av en digital ingång.

Inlägg av Swech »

När jag ser denna kod så finns det en massa saker som är lite tokigt gjort.
Fungerar gör det säkert men det är skrivet på ett sätt som gör det onödigt svårt
att programmera vidare på.
Nu är sättet det är skrivet på inget unikt utan ett vanligt sätt
i början på alla programmerares karriär.
Har själv skrivit samma typ innan pengen ramlat ned.

Kod: Markera allt

if(Adc1>3200){
                      EN1=0;
                      SSD1306_TextSize(2);
                      SSD1306_GotoXY(1, 1);
                      SSD1306_Print("CH1 OVERLOAD, press Btn!");
                      while(BTN!=0){
                          //wait
                          }
                      }
                     if(Adc2>3200){
                      EN2=1;
                      SSD1306_TextSize(2);
                      SSD1306_GotoXY(1, 1);
                      SSD1306_Print("CH2 OVERLOAD, press Btn!");
                      while(BTN!=0){
                          //wait
                          }
                      }
                     if(Adc3>3200){
                      EN3=0;
                      SSD1306_TextSize(2);
                      SSD1306_GotoXY(1, 1);
                      SSD1306_Print("CH3 OVERLOAD, press Btn!");
                      while(BTN!=0){
                          //wait
                          }
                      }
                      if(Adc4>3200){
                      EN4=0;
                      SSD1306_TextSize(2);
                      SSD1306_GotoXY(1, 1);
                      SSD1306_Print("CH4 OVERLOAD, press Btn!");
                      while(BTN!=0){
                          //wait
                          }
                      }
                    EN1=1;
                    EN2=1;
                    EN3=1;
                    EN4=1;
                    SSD1306_ClearDisplay();
Man kan jämföra med verktygstavlan i källaren:
Man har normalt en borrmaskin och ett set med 10 borr.
Samma borrmaskin använder man för att borra olika hål, man byter bara borr
Man kan också teoretiskt ha 10 borrmaskiner med varsitt borr.
Det fungerar också men det tar plats, alla 10 borrmaskiner måste vara laddade .o.s.v

I programmet ovan finns det några variabler som skiljer sig (olika borr) men en massa
programsteg som är identiska med varandra. (borrmaskinen)

Försök att skriva en enda rutin som du skickar parametrar till och som
då utför jobbet med de förädringar som krävs.

Nästa tröskel som är svårt att förstå är att separera beslut från resultat.
Program består av

Samla in indata
Ta beslut utifrån dessa indata
Skapa utdata
Presentera indata och utdata.

Det blir mycket enklare om olika delar i programmet tar hand om specifik uppgift.
Varje del skall endast vara ansvarig för sin del och förmedla informationen vidare till
andra rutiner via flaggor / variabler.

Kod: Markera allt

 if(Adc2>3200){   Samla in indata
                      EN2=1;    Ta beslut utifrån dessa indata
                      SSD1306_TextSize(2); Presentera indata och utdata.
                      SSD1306_GotoXY(1, 1);Presentera indata och utdata.
                      SSD1306_Print("CH2 OVERLOAD, press Btn!");Presentera indata och utdata.
                      while(BTN!=0){ Samla in indata  / Ta beslut utifrån dessa indata
                          //wait
                          }
                      }
Ett test av typen if(Adc2>3200) bör endast sätta en variabel eller flagga T.ex. en flagga som heter CH2_OVERLOAD
Om flaggan är satt är det overload på kanal 2
Övriga delar i programmet skall inte behöva bry sig om hur ansvarig rutin kommit fram till detta
Om adc värdet 3200 behöver ändras till 3195 så är det fortfarande CH2_OVERLOAD som förmedlar resultatet
Övriga delar påverkas ej och kommer till 100% att fungera.

Swech
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Läsa av en digital ingång.

Inlägg av newbadboy »

Tack. Tokigt är det garanterat. Vet knappt vad jag pysslar med ofta. Ska kolla på det idagarna. Har lagt tak i 12 timmar idag och ska göra mer imorgon. Så huvet funkar inte för tillfället
Skriv svar