2015-12-25 11 views
6

Sono nuovo alla programmazione C e desidero inviare un codice esadecimale (38) a 8 pin (su un micro-controller dell'elica di parallasse) in modo che il primo pin ottenga uno 0 e il pin successivo ottiene uno 0 e il prossimo pin ottiene un 1, ecc. Sarebbe più semplice quindi inviando un codice binario a ciascun pin.Invio codice esadecimale

Questo è il codice C. Il codice che sto utilizzando finora, che funziona utilizzando binario è:

//int port[] = {27,26,25,24,23,22,21,20};  
int i = 8; 

while(i >0) 
{  //while start 
    --i; 
    low(27); 
    low(26); 
    high(25); 
    high(24); 
    high(23); 
    low(22); 
    low(21); 
    low(20); 
} 

Quello che voglio fare è inviare un codice esadecimale singolo (38) ai pin 20 e 27.

+0

Normalmente, tali pin sono in una porta a 8 bit e si esegue 'write_port (port_no, 0x38)'. Come è diversa la tua situazione? –

risposta

3

il ciclo deve essere un po 'diverso

int port = 0x20; // starting port 
int val = 0x38; // value 
int i; 

for(i=0 ; i<8 ; i++) { 
    if (val & 1) high(port); 
    else   low (port); 
    val >>= 1; // shift val one bit right 
    port++; // increment port 
} 

L'inizio ciclo da porta 0x20 e il bit 0 di val. Se quel bit è 1, fa un massimo altrimenti fa basso su quella porta.

Quindi val viene spostato di un bit a destra, per utilizzare il bit 1 e la porta viene incrementata.

Ecc ... questo viene eseguito 8 volte per gli otto bit di val (0x38).

Si noti che se si deve partenza dal porto superiore, questa versione diversa dovrebbe adattarsi

int val = 0x38; // value 
int port; 

for(port=0x27 ; port >= 0x20 ; port--) { // goes from port 0x27~20 
    if (val & 0x80) high(port); 
    else   low (port); 
    val <<= 1; // shift val one bit left 
} 
2

In primo luogo, quando si lavora con micro-controllore, di solito c'è un modo per specificare il valore degli 8 pin appartengono alla stessa porta in una sola volta.

Si dovrebbe cercare di capirlo dal manuale/scheda tecnica del microcontroller (uC) cercando la sua parola chiave !! Altrimenti troverete un tempo infernale (davvero, non sto scherzando!) Almeno lo ho fatto!) Per cercarlo sparpagliato in ma alcune delle centinaia/mille pagine del manuale/scheda tecnica.

Provate prima questo e dovrebbe essere molto più semplice.

In secondo luogo, in uC, l'assegnazione di pin alto e basso su pin tipicamente non è necessario eseguire funzioni diverse poiché assegnano semplicemente un valore (alto o basso) allo stesso pin.Quindi, quando possibile, dovresti combinare le alte funzioni & in una funzione singola (poiché non so cosa sia all'interno alto & basso, non posso davvero aiutarti ulteriormente, ma dovresti notare questa possibilità per facilitare il tuo compito)

Infine, tuttavia, nel caso in cui non può essere fatto per un motivo o un altro, è possibile semplificare il codice C come questo,

void assignPort(char val, char portBase){ 
    int i = 0; 
    for (i = 0; i < 8; ++i) 
     if (val & (1 << i)) //masked your val with shifting 1 to get the current bit 
      high(portBase + i); //increase your port address by i 
     else 
      low(portBase + i); 
} 

e per chiamare la funzione, è sufficiente fare

assignPort(0x38, 20); //notice the 38 using 0x for hex indicator while 20 is written as it is (assuming 20 is not hex) 

Nota che se i tuoi high e low funzioni possono essere combinate

void highLowCombined(char pinAddress, char highOrLow) { //highOrLow is simply non-zero (high) or zero (low) 
    //do something based on pinAddress and highOrLow 
} 

il vostro compito è molto più facile nel chiamare alte funzioni/bassa e variabile val nel assignPort sopra in quanto è sufficiente fare in questo modo

void assignPort(char val, char portBase){ 
    int i = 0; 
    for (i = 0; i < 8; ++i) 
     highLowCombined(portBase + i, val & (1 << i)); //only one line is needed here! 
} 

Ora è necessaria solo una riga nel numero for-loop! Provalo!

+0

Mille grazie, ho anche trovato un metodo semplice: set_outputs \t (23, 16, h); \t \t \t // imposta il pin tramite codice esadecimale – Gregfox

+0

Ok bene. Da dove l'hai trovato? Il manuale? – Ian

+0

Ho trovato il comando in simpletools.h – Gregfox