Spørsmål:
Hvordan lager jeg et 9-bits tall basert på verdier fra 9 digitale innganger?
user3216081
2015-11-16 05:05:57 UTC
view on stackexchange narkive permalink

Jeg har 9 pinner som er innganger fra 9 IR-lysdioder. Jeg vil kombinere alle resultatene til ett 9-bits nummer.

eksempel: pin1 = høy, pin2 = høy, pin3 = høy, pin4 = lav, pin5 = høy, pin6 = lav, pin7 = lav, pin8 = høy, pin9 = lav

9 bit nummer = 111010010

https://www.arduino.cc/en/Reference/Bitshift
Så vidt jeg vet er den minste variable størrelsen 1byte = 8 bits, så det er ingen bit-type.
Tre svar:
crowie
2015-11-16 06:42:17 UTC
view on stackexchange narkive permalink

I koden din vil du bruke et 16-biters usignert heltall som din variabel. Siden det ikke er noe som heter en 9-bits type.

Hvis pinnene tilsvarer forskjellige porter på mikroen din, gjør du i utgangspunktet dette:

Les pinneverdien fra portregisteret, og skift bit til riktig bitposisjon og deretter ELLER variabelen.

Si at du hadde 8 lysdioder på PORTB (pin 0 - 7) og den 9. på PORTC (pin 2)

  usignert int ir_inputs = 0ir_inputs = PORTB; // leser bare registeret direkteir_inputs = ir_inputs | ((PORTC & 0x04) <<6); // leser biten på pin 2 og skifter den deretter 6 steder til bit 8 (eller den 9. bit husk at bitene alltid begynner på 0) og påvirker ikke de andre bitene  

noe sånt

faktisk kan du sette den i en funksjon

  usignert int getIRinputs (void) {return (usignert int) PORTB | ((PORTC & 0x04) <<6);}  kode> 

Lett gjort

Selv om du hadde inngangene på 9 separate porter, er prinsippet det samme. Les, Skift ELLER

John Lee
2015-11-16 10:58:32 UTC
view on stackexchange narkive permalink

Noe sånt:

  typedef union NUM_9_BITS_t {usignert int U; struct NUM_9_BITS_FIELD {usignert int BIT0: 1; usignert int BIT1: 1; usignert int BIT2: 1; usignert int BIT3: 1; usignert int BIT4: 1; usignert int BIT5: 1; usignert int BIT6: 1; usignert int BIT7: 1; usignert int BIT8: 1; usignert int BITO: 23; } BITS;} NUM_9_BITS; NUM_9_BITS num; num.BITS.BIT0 = digitalRead (PIN0); num.BITS.BIT1 = digitalRead (PIN1); num.BITS.BIT2 = digitalRead (PIN2); num.BITS.BIT3 = digitalRead ( PIN3); num.BITS.BIT4 = digitalRead (PIN4); num.BITS.BIT5 = digitalRead (PIN5); num.BITS.BIT6 = digitalRead (PIN6); num.BITS.BIT7 = digitalRead (PIN7); num.BITS .BIT8 = digitalRead (PIN8); Serial.print (num.U);  
+1 for strukturen. Kan du forklare hvorfor du bruker '23' og ikke '7'? Som int er bare 16-bits. Er 32-bit minimumsstørrelsen på en fagforening eller noe?
Det er en perfekt gyldig tilnærming, men virker som mange linjer for noe som bare trenger grunnleggende logikk og litt forskyvning.
AMADANON Inc.
2015-11-16 06:26:26 UTC
view on stackexchange narkive permalink

Som @KiraSan sa, trenger du noe større enn en byte på 9 bits. Imidlertid:

  intally; tally = 0; for (char pin = 1; pin< = 9; pin ++) {if (digitalRead (pin) == HIGH) {tally | = 1<< (9 -nål); }}  

Dette gjøres fra minnet og er uprøvd. Hvis noen oppdager noen feil, gi meg beskjed.

Forklaring: summen er summen (du bør gjøre noe med dette på slutten, åpenbart, eller det har ingen effekt). Den er definert og satt til 0. Les deretter pin for hver pin (1-9); hvis pinnen er høy: ta tallet '1', og dobl det (9-pinners) ganger; så hvis pin = 9, blir den doblet 0 ganger; for pin = 2, blir den doblet en gang (totalt 2), og så videre. Sett denne biten på tellingen.

Merk at dette leser digital pin 1 (som tilfeldigvis er den andre pin, den første pin 0) - dette bør merkes som "tx" for å sette i den første bit, ikke den som er referert til som "pin1" (som kan være en konstant eller en variabel, og derfor kan peke på en gitt pin). Denne metoden antar også at pinnene er i orden - du kan enkelt endre den til å starte fra 0 eller 7, men de må være i orden.

Hvis du vil ha vilkårlige pinner, eller variable pinner, kan du prøv dette:

  const PIN_COUNT = 9; char pins [PIN_COUNT] = {13,2,5,4,3,6,7,8,9}; intally; tally = 0 ; for (char pin = 0; pin<PIN_COUNT; pin ++) {if (digitalRead (pins [pin]) == HIGH) {tally | = 1<<pin; }}  

Endringer: legg til PIN_COUNT som en konstant i starten, angi rekkefølgen på pinnene (som kan omfatte alle digitale pinner, inkludert å gjenta en gitt pinne hvis du føler deg så tilbøyelig, til og med etter starten av koden.). Du kan også endre dem ved å gjøre: pins [0] = 1; - merk at de er nummerert fra 0-8 for 9 pins. Siden de nå starter ved 0, blir linjen med << nå justert tilsvarende, og det samme er linjen som starter med for ... .



Denne spørsmålet ble automatisk oversatt fra engelsk.Det opprinnelige innholdet er tilgjengelig på stackexchange, som vi takker for cc by-sa 3.0-lisensen den distribueres under.
Loading...