Sida 2 av 3
Re: Arduino programmeringshjälp
Postat: 9 augusti 2012, 10:33:03
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 ?
Re: Arduino programmeringshjälp
Postat: 9 augusti 2012, 10:39:05
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
Re: Arduino programmeringshjälp
Postat: 9 augusti 2012, 10:42:34
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...
Re: Arduino programmeringshjälp
Postat: 9 augusti 2012, 10:47:09
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".
Re: Arduino programmeringshjälp
Postat: 9 augusti 2012, 10:50:24
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.
Re: Arduino programmeringshjälp
Postat: 9 augusti 2012, 11:07:20
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...
Re: Arduino programmeringshjälp
Postat: 9 augusti 2012, 11:07:56
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
Re: Arduino programmeringshjälp
Postat: 9 augusti 2012, 11:18:03
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.
Re: Arduino programmeringshjälp
Postat: 9 augusti 2012, 12:59:54
av Icecap
En lösning är att låta counter vara på 16 bit helt enkelt. Då kan den gå mellan +32767 och -32768.
Re: Arduino programmeringshjälp
Postat: 9 augusti 2012, 21:40:05
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
Re: Arduino programmeringshjälp
Postat: 9 augusti 2012, 22:59:12
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;
Re: Arduino programmeringshjälp
Postat: 9 augusti 2012, 23:04:23
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.
Re: Arduino programmeringshjälp
Postat: 10 augusti 2012, 07:25:03
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
Re: Arduino programmeringshjälp
Postat: 10 augusti 2012, 08:51:34
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;
}
}
Re: Arduino programmeringshjälp
Postat: 10 augusti 2012, 10:30:00
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...