Vai al contenuto
PLC Forum


Funzione Shift_right() - come si usa?


Giorgio Demurtas

Messaggi consigliati

Giorgio Demurtas

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.

Link al commento
Condividi su altri siti


Gianmario Pedrani

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

Link al commento
Condividi su altri siti

ifachsoftware

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

Link al commento
Condividi su altri siti

Giorgio Demurtas

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

Link al commento
Condividi su altri siti

ifachsoftware

Se puoi usa l'operatore poiche' per fare un banale shift la funzione ti richiede minimo minimo 10 volte le risorse dello shift ...

Ciao :)

Link al commento
Condividi su altri siti

Giorgio Demurtas

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

Link al commento
Condividi su altri siti

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...