Gå til innhold
Presidentvalget i USA 2024 ×

[Løst] Pussing oppførsel i Arduino-kode ved avlesing av digitale pinner


Anbefalte innlegg

Litt merkelig "feil" her, og derav litt uklar emnetittel?

 

Uansett. Eg har en Arduino fremfor meg som er koblet til en rotary encoder som gir ut en greycode signal på 6 ledinger(6 bit greycode). For å lese av koden har eg derfor koblet disse signalene rett på pinnene 5-10, og satt pinMode til input.

 

Problemet er når eg skal lese av disse. Først leser eg av hver enkelt inngang og tilegner verdien(HØY = 1, LAV = 0) til en spesifik bit i en byte. Dette fungerer ypperlig, så lenge eg debugget. Mens eg debuget så printet eg ut en del på seriellporten for å se at innverdiene stemte overens med resultatet. I det øyeblikket eg fjernet disse Serial.print-linjene så ble resultatet feil.

 

Etter litt søking fant eg da ut at Serial.print-linjene gav koden en liten pause, som av en eller annen grunn sørget for korrekt resultat. Når disse vart borte ble resultatet feil. Dette kan eg omgå ved å enten legge til ei linje med Serial.print eller delay(1) ETTER at pinnene er lest med digitalRead.

 

Her er litt av koden:

if (digitalRead(PIN_SENSOR_WAVC)) { bitSet(greycode, 5); } else { bitClear(greycode, 5); }
   if (digitalRead(PIN_SENSOR_WAVD)) { bitSet(greycode, 4); } else { bitClear(greycode, 4); }
   if (digitalRead(PIN_SENSOR_WAVE)) { bitSet(greycode, 3); } else { bitClear(greycode, 3); }
   if (digitalRead(PIN_SENSOR_WAVF)) { bitSet(greycode, 2); } else { bitClear(greycode, 2); }
   if (digitalRead(PIN_SENSOR_WAVG)) { bitSet(greycode, 1); } else { bitClear(greycode, 1); }
   if (digitalRead(PIN_SENSOR_WAVH)) { bitSet(greycode, 0); } else { bitClear(greycode, 0); }

 

Eg kan komme med hele koden om nødvendig, men koden fungerer, så eg unngår å overfylle tråden med den atm.

 

Spørsmålet mitt er hvorfor byte variabelen greycode inneholder kun 111111 når eg kjører uten Serial.print eller delay, mens den faktisk inneholder korrekte verdier ellers? Legger eg en av disse linjene(delay eller Serial.print) til før den koden der så har den ingen effekt. Den må komme etter.

 

Forslag mottas :)

Lenke til kommentar
Videoannonse
Annonse

Beklager manglende oppdatering. Fikk løst problemet.

 

Noen linjer under så hadde eg en funksjon som konverterte graycoden om til natural binary. I denne funksjonen så initierte eg en byte variabel uten å gi den en verdi. Når eg ikke brukte delay(1)-koden så viste det seg at bit 7 i resultatet, MSB, alltid var 1. Brukte eg delay(1) så var den 0. Siden graycoden kun var 6 bit så var det kun 6 av 8 bit som ble sjekket og endret, og dermed førte den ene bit'en til feil resultat. Naturligvis.

 

Løsningen var å initiere byte variabelene og samtidig sette alle bits til 0.

 

Nå har eg lært at eg ikke må ta for gitt hvilken verdi en variabel får med mindre eg setter verdien selv :)

Lenke til kommentar

Eg jobber med en værstasjon og har noen sære sensorer som eg må forholde meg til. Sensorene er noen gamle som har blitt byttet ut i fra en platform i nordsjøen(mao, høy kvalitet).

 

Den konkrete koden over skal da lese inn verdiene på 6 digitale innganger(som da tilsvarer en 6-bit greycode) og gjøre denne om til en standard binær verdi(natural binary i stede for reflected binary). Dette kommer da fra en værhane, og angir hvilken retning vinden blåser.

 

Dette er igjen en del av et større prosjekt. Dette blir en sensorkrets, som skal lese av verdiene på alle tilkoblede sensorer og generere en del andre verdier basert på historikk og tid.

 

Veldig spennende synes nå eg da :)

Lenke til kommentar

Kommentaren over virker kanskje noe kort og frekk.

 

Eg vil mer en gjerne dele info, vise hva eg jobber med og svare på spørsmål, men prioriteten min nå er å få en fungerende løsning på plass i forhold til en "deadline" eg har satt.

 

Når eg er ferdig kommer eg nok med mer info og detaljer i en egen tråd :)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...