Arduino programmeringshjälp

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Arduino programmeringshjälp

Inlägg av sodjan »

> Att skriva if(xxx == 1) betyder att om xxx är 2 är den inte uppfyllt, alltså är det mycket dålig praxis!

Om det nu inte är just det man vill !
Man kan inte säga att det (alltid) är en dålig praxis.

> Vart är det fel i koden nedan?

Inget alls, men vad vill du att den *ska* göra ?
lillmange
Inlägg: 129
Blev medlem: 30 januari 2007, 14:51:37
Ort: Upplands Väsby
Kontakt:

Re: Arduino programmeringshjälp

Inlägg av lillmange »

Det var inget fel där, upptäckte det precis, var "fel" på counter som inte går från -255 till 255 som jag trodde.
Jag som mindes fel altså så jag får väl ersätta koden med

Kod: Markera allt

    if (counter <  200){
      counter = -1;
    }

och

    if (counter > 0){
      counter = 1;
    }
eftersom jag just här bara vill få ut +1 , 0 eller minus 1.

/Magnus
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Arduino programmeringshjälp

Inlägg av sodjan »

> counter som inte går från -255 till 255 som jag trodde.

Vilka gränser har "counter" då ??

> jag som mindes fel altså så jag får väl ersätta koden med...

"Väl"?
Fungerar det eller fungerar det inte ?
Beroende på svaret på första frågan så kanske koden inte fungerar...
ToPNoTCH
Inlägg: 5152
Blev medlem: 21 december 2009, 17:59:48

Re: Arduino programmeringshjälp

Inlägg av ToPNoTCH »

Tycker fortfarande koden ser skum ut i förhållande till det du beskriver.

Du lär ju inte få noll exempelvis i med den koden.

Utan att förstå vad du försöker göra så tror jag du skall titta på kommandona "map" och "constraint".
Användarvisningsbild
Krille Krokodil
Inlägg: 4062
Blev medlem: 9 december 2005, 22:33:11
Ort: Helsingborg

Re: Arduino programmeringshjälp

Inlägg av Krille Krokodil »

Bosen skrev:För att if(ButtonState) skall funka så måste ButonState vara satt till datatypen boolean.
I detta fallet, när man skall läsa av sant eller falskt så är boolean helt rätt.
Läs mera här: http://arduino.cc/en/Reference/BooleanVariables

EDIT:
Icecap kan faktiskt ha rätt i att 0 alltid är falskt, jag har aldrig tänkt så långt....
Nä, det är precis så som Icecap säger, C-standarden definierar false som 0 och det logiska testen på om något är true som != 0, så man kan testa boolean, byte, int m.m.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Arduino programmeringshjälp

Inlägg av sodjan »

> > counter som inte går från -255 till 255 som jag trodde.

Alltså, det logiska är att den antingen har intervallet -127 till +127 *eller* 0 till +255
beroende på om den är "signed" eller "unsigned". Förutsatt alltså att den är en
8-bitars variabel och att det är någotlunda normal hantering i Arduino.

Eftersom du sedan vill göra "counter = -1;" så *måste* den vara "signed" och
alltså ha intervallet -127 till +127, men då blir testen "if (counter < 200)"
helt meningslös eftersom counter *alltid* kommer att vara mindre än 200...

Du får nog tänka till en gång till...
lillmange
Inlägg: 129
Blev medlem: 30 januari 2007, 14:51:37
Ort: Upplands Väsby
Kontakt:

Re: Arduino programmeringshjälp

Inlägg av lillmange »

ToPNoTCH skrev:Tycker fortfarande koden ser skum ut i förhållande till det du beskriver.

Du lär ju inte få noll exempelvis i med den koden.

Utan att förstå vad du försöker göra så tror jag du skall titta på kommandona "map" och "constraint".

OK, men det beror säkert på att det längre ned i koden finns en rad som säger "counter = 0;

map och constraint ser riktigt trevligt ut och om jag orkar ska jag skriva om stora delar av min kod så jag slipper kod som denna:

Kod: Markera allt

//encoder räknaren omvandlas till menuval när msn är i menu 1-99
if (menustate >= 1 && menustate <= 99) {
    if (counter < 1){
      counter = 20;
    }
    if ((counter >=1) && (counter <=5)){
      menuval = 1;
    }
    if ((counter >=6) && (counter <=10)){
      menuval = 2;
    }
    if ((counter >=11) && (counter <=15)){
      menuval = 3;
    }
	 if ((counter >=16) && (counter <=20)){
      menuval = 4;
    }
    if (counter > 20){
      counter = 1;
    }
Tack!

/Magnus
lillmange
Inlägg: 129
Blev medlem: 30 januari 2007, 14:51:37
Ort: Upplands Väsby
Kontakt:

Re: Arduino programmeringshjälp

Inlägg av lillmange »

sodjan skrev:> > counter som inte går från -255 till 255 som jag trodde.

Alltså, det logiska är att den antingen har intervallet -127 till +127 *eller* 0 till +255
beroende på om den är "signed" eller "unsigned". Förutsatt alltså att den är en
8-bitars variabel och att det är någotlunda normal hantering i Arduino.

Eftersom du sedan vill göra "counter = -1;" så *måste* den vara "signed" och
alltså ha intervallet -127 till +127, men då blir testen "if (counter < 200)"
helt meningslös eftersom counter *alltid* kommer att vara mindre än 200...

Du får nog tänka till en gång till...
hmm, ja då kommer det inte fungera...

måste nog fundera lite på hur jag ska få ihop detta.

Tack för den utförliga informationen.
Användarvisningsbild
Icecap
Inlägg: 26651
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Arduino programmeringshjälp

Inlägg av Icecap »

En lösning är att låta counter vara på 16 bit helt enkelt. Då kan den gå mellan +32767 och -32768.
lillmange
Inlägg: 129
Blev medlem: 30 januari 2007, 14:51:37
Ort: Upplands Väsby
Kontakt:

Re: Arduino programmeringshjälp

Inlägg av lillmange »

Jag löste det genom koden nedan och temp_counter är int

Kod: Markera allt

    if (counter > 200){
      temp_counter = -1;
      counter = 0;
    }
    if (counter > 0){
      temp_counter = 1;
      counter = 0;
    }
Tack för all hjälp med detta, tyvärr har jag nu inte hunnit prova koden för knapptryckningen...
det ska jag försöka få tid till ikväll.

/Magnus
Användarvisningsbild
Krille Krokodil
Inlägg: 4062
Blev medlem: 9 december 2005, 22:33:11
Ort: Helsingborg

Re: Arduino programmeringshjälp

Inlägg av Krille Krokodil »

lillmange skrev:if ((counter >=1) && (counter <=5)){
menuval = 1;
}
if ((counter >=6) && (counter <=10)){
menuval = 2;
}
if ((counter >=11) && (counter <=15)){
menuval = 3;
}
if ((counter >=16) && (counter <=20)){
menuval = 4;
}
Om du delar två heltal i C får du bara tillbaka heltalsdelen, tex 4/5 blir 0, så du kan skriva om ovanstående som

menuval = (counter + 4)/5;
Användarvisningsbild
Icecap
Inlägg: 26651
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Arduino programmeringshjälp

Inlägg av Icecap »

Och lite allmänt: en BOOL variabel är en helt vanlig int som kompilern bara märker under kompileringen som att det bara får tilldelas sant eller falsk till den, inget annat. Det är inget speciellt register eller minnesstorlek, det är bara en int.

Och med int menas den definitionen som anges i C: den variabelstorlek som CPU'n "naturlig" läser/skriver i en operation.
lillmange
Inlägg: 129
Blev medlem: 30 januari 2007, 14:51:37
Ort: Upplands Väsby
Kontakt:

Re: Arduino programmeringshjälp

Inlägg av lillmange »

Krille Krokodil skrev:
lillmange skrev:if ((counter >=1) && (counter <=5)){
menuval = 1;
}
if ((counter >=6) && (counter <=10)){
menuval = 2;
}
if ((counter >=11) && (counter <=15)){
menuval = 3;
}
if ((counter >=16) && (counter <=20)){
menuval = 4;
}
Om du delar två heltal i C får du bara tillbaka heltalsdelen, tex 4/5 blir 0, så du kan skriva om ovanstående som

menuval = (counter + 4)/5;
Vart i koden gör jag detta?

/Magnus
Användarvisningsbild
Krille Krokodil
Inlägg: 4062
Blev medlem: 9 december 2005, 22:33:11
Ort: Helsingborg

Re: Arduino programmeringshjälp

Inlägg av Krille Krokodil »

lillmange skrev:

Kod: Markera allt

//encoder räknaren omvandlas till menuval när msn är i menu 1-99
if (menustate >= 1 && menustate <= 99) {
    if (counter < 1){
      counter = 20;
    }
    if ((counter >=1) && (counter <=5)){
      menuval = 1;
    }
    if ((counter >=6) && (counter <=10)){
      menuval = 2;
    }
    if ((counter >=11) && (counter <=15)){
      menuval = 3;
    }
	 if ((counter >=16) && (counter <=20)){
      menuval = 4;
    }
    if (counter > 20){
      counter = 1;
    }
Hela denna kan du skriva som:

Kod: Markera allt

if (menustate >= 1 && menustate <= 99) {
    if (counter < 1){
      counter = 20;
      menuval = 4;
    }
    else if (counter > 20){
      counter = 1;
    }
    else {
     menuval = (counter + 4)/5;
    }
}
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Arduino programmeringshjälp

Inlägg av sodjan »

> Vart i koden gör jag detta?

Krille sa inte att du gör det i koden, Krille sa att du ska/bör göra det i koden...
Skriv svar