Vai al contenuto
PLC Forum


Funzione Shift_right() - come si usa?


Messaggi consigliati

Giorgio Demurtas
Inserito:

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 :huh:

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:

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:

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 00000010

Ciao :)

Giorgio Demurtas
Inserita:

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.

grazie

ciao :)

ifachsoftware
Inserita:

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:

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);
       }
}

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 account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...