Giorgio Demurtas Inserito: 5 giugno 2005 Segnala Inserito: 5 giugno 2005 Voglio far scorrere un "1" dento un byte di 8 bit.Concettualmente è facile capire che cosa significa "shiftare" i bit di un byte di una posizione, ma allora perchè questa funzione ha tutti quei parametri?uso PCW della CCS.questo è quanto riportato nella guida:SHIFT_LEFT( ) Syntax: shift_right (address, bytes, value) Parameters: address is a pointer to memory, bytes is a count of the number of bytes to work with, value is a 0 to 1 to be shifted in. Returns: 0 or 1 for the bit shifted out Function: Shifts a bit into an array or structure. The address may be an array identifier or an address to a structure (such as &data). Bit 0 of the lowest byte in RAM is treated as the LSB. Availability: All devices Requires: Nothing Examples: // reads 16 bits from pin A1, each bit is read // on a low to high on pin A2 struct { byte time; byte command : 4; byte source : 4;} msg; for(i=0; i<=16; ++i) { while(!input(PIN_A2)); shift_right(&msg,3,input(PIN_A1)); while (input(PIN_A2));} // This shifts 8 bits out PIN_A0, LSB first. for(i=0;i<8;++i) output_bit(PIN_A0,shift_right(&data,1,0)); non capisco a cosa serva "address", puntatore alla memoria e il numero di bytes... da shiftare?perchè c'è un "&" prima del primo parametro della funzione?Ho provato diverse diciture, ma non funziona.
Gianmario Pedrani Inserita: 5 giugno 2005 Segnala Inserita: 5 giugno 2005 La & commerciale di solito in c significa che passi il valore ad un puntatore.di solito quando si crea una funzione, deve essere molto elastica ed non vincolata a una situazione ben precisa, con quella funzione tu puoi fare scorrere tutti i bit di una locazione di memoria che parte dall'indirizzo addres, pui puoi farne scorrere un oppure 2 o 3 qundi metti il numero di bit che devi far scorrere e poi metti il valore che deve avere....Prova a fare il passaggio inverso visto che sai cosa vuol dire far scorrere i bit prova a fare tu una funzione che faccia la stessa cosa!!!! e vedrai che e che magari sia una cosa molto dinamica non statica su un semplice indirizzo o su un solo bit!!! e vedrai che ti serviranno dei parametri per dire alla tua funzione qual'è la zona di memora da spostare e quanti bit vuoi spostare e cosi via.....non so se mi sono spiegato.ciaooooooooooooo
ifachsoftware Inserita: 6 giugno 2005 Segnala Inserita: 6 giugno 2005 La funzione che hai citato permette di lavorare su piu' bytes.Se ti serve lavorare su una sola word ti conviene usare le istruzioni << e >> del C che ti fanno uno shitft da 1 o piu' bit alla volta.Es :byte Dato = 1;Dato <<= 1; // Ti fa lo shift a sinistra di 1 Bit in pratica passi da 00000001 a 00000010Ciao
Giorgio Demurtas Inserita: 6 giugno 2005 Autore Segnala Inserita: 6 giugno 2005 ok, ci son riuscito.Ieri cercando una soluzione a questo problema prima di "disturbare" sul forum, avevo trovato che in C esiste >> per shiftare, ma siccome per vedere le istruzini che ho a disposizione nel compilatore uso sempre ". > BUILT-IN FUNCTIONS", non trovando >> ho pensato che non si potesse usare. Che tonto :dunce:, >> non è mica una funzione, è un operatore!Son riuscito a fare la stessa cosa anche con la funzione shift_left(&i,1,0);-Il primo parametro è l'indirizzo del byte (o del primo nel caso siano più di uno) da shiftare. se "i" è la variabile, il suo indirizo è "&i". & ricava l'indirizzo di una variabile.-il secondo parametro indica il numero di byte su cui eseguire lo shift del bit. -il terzo parametro è il valore che viene messo nello spazio che si libera durante lo shift. per es. se shifto a sinista di un bit, in bit più a sinista esce dal byte e lo perdo, alla destra del byte devo aggiungere un valore.grazieciao
ifachsoftware Inserita: 6 giugno 2005 Segnala Inserita: 6 giugno 2005 Se puoi usa l'operatore poiche' per fare un banale shift la funzione ti richiede minimo minimo 10 volte le risorse dello shift ...Ciao
Giorgio Demurtas Inserita: 6 giugno 2005 Autore Segnala Inserita: 6 giugno 2005 giusto, non ci avevo pensato.ecco il sw, chissà se potrà essere utile a qualcuno//supercar //girgio demurtas 6 giugno 2005 #include "F:\pic2005\supercar\supercar.h" #use delay(clock=4000000) int1 dir; int8 i; void main() { set_tris_c(0x00); dir=0; i=1; while(1) { output_c(i); if (dir==0) i<<=1; //shift_left(&i,1,0); if (dir==1) i>>=1; //shift_right(&i,1,0); if (i==128) dir=1; if (i==1) dir=0; delay_ms(50); } }
Messaggi consigliati
Crea un account o accedi per commentare
Devi essere un utente per poter lasciare un commento
Crea un account
Registrati per un nuovo account nella nostra comunità. è facile!
Registra un nuovo accountAccedi
Hai già un account? Accedi qui.
Accedi ora