Newsgroup: it.hobby.elettronica.digitale
Titolo: un pò di domande sulla programmazione

Buonasera al NG,
mi sono avvicinato ai PIC di recente quindi potrei scrivere qualche
sciocchezza ad ogni modo ecco un paio di dubbi
-premetto che programmo in C con il compilatore PCWH compiler-
1) se ad esempio setto il port B metà come uscita e metà come ingresso
(set_tris_b(0b11110000);) come mai se successivamente metto nel registro
di output una fila di zeri (output_b(0);) gli ingressi che avevo settato
nel tris diventano uscite e vanno a zero?quando uso il port in questo modo
devo agire sui singoli bit?
2) ho una periferica I2C che mi restituisce dei valori in BCD: i primi 4
bit contengono le decine ed i secondi 4 le unità. Per recuperare le
singole componenti fo degli shift. Avevo pensato anche a mascherare i 4
bit piu significativi per recuperare quelli minori ma come faccio ad
effettuare una mascheratura? Si può fare? e soprattutto richiede piu o
meno istruzioni dello shift?
grazie.
-- 
Davide C.
www.ingegnerando.it
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 meno istruzioni dello shift?
Non ho ben capito cosa non riesci a fare. Ad ogni modo ecco una 
possibile soluzione:
unsigned int8 u, d, value;
value = ...
u = value & 0x0F;		// unità
d = (value >> 4) & 0x0F;	// decine
Ciao!
Marco / iw2nzm

 meno istruzioni dello shift?
Una cosa sono le operazioni logiche come OR (detto anche somma logica) e AND 
(detto anche mascheratura o prodotto logico), una cosa gli shift, che 
equivalgono a moltiplicazioni o divisioni per 2.
Per quanto riguarda le istruzioni, un AND (che da solo proprio mi sa che non 
basta) o uno shift sono istruzioni praticamente equivalenti come occupazione 
di processore. Guarda il datasheet del pic che usi (e in questo caso sono 
praticamente tutti uguali, visto che non c'entra il moltiplicatore hardware) 
:  tra le ultime pagine c'è una lista di istruzioni assembler. Confronta un 
AND con un rotate left (o right) in termini di cicli istruzione (che in 
genere per i PIC sono a un quarto della frequenza di clock)
Ciao... e vediamo un po' se qualche volta ci andiamo a bere una birra :)
-- 
____________________
      CG Engineering
 Lab. Ricerca & Sviluppo
********************
Skype : cg_ingegnering
MSN : 
cgaudiola...@interfree.it
ICQ UIN# : 104528066

 Ciao... e vediamo un po' se qualche volta ci andiamo a bere una birra :)
certamente.. :D


 molto lineare.
Se devi controllare giusto un bit o due, probabilmente è più furbo 
utilizzare il test del bit, che in assembler viene tradotto come BTFSC e 
BTFSS (Bit Test Fileregister Skip if   Clear   oppure Set).
Un metodo che usa la mascheratura invece potrebbe essere:
boolean TestBit (unsigned short VarToTest, unsigned short BitToTest) {
    VarToTest &= (0x01 << BitToTest);
    if (VarToTest) return TRUE;
        else return FALSE;
}
L'ho scritto così improvvisando, dovrebbe funzionare. CCS supporta i 
boolean. Con questa funzione puoi testare quello che vuoi, anche se nel caso 
di un GPIO ti conviene usare la direttiva #use_fast_io sulla porta che devi 
testare, e la funzione input(); . Guarda l'help
Ciao
CG 

 }
Dovrebbe funzionare anche direttamente con:
return  VarToTest & (0x01 << BitToTest);
Ciao!
Marco / iw2nzm

 return  VarToTest & (0x01 << BitToTest);
Eventualmente con un cast (int1).

 Eventualmente con un cast (int1).
CCS vuole o BOOLEAN oppure SHORT INT. Sicuro che accetti anche int1?
Ciao


 CCS vuole o BOOLEAN oppure SHORT INT. Sicuro che accetti anche int1?
Si.
Tratto dall'help alla voce Data Definition > Basic and Special Types
Type-Specifier
int1 Defines a 1 bit number
int8 Defines an 8 bit number
int16 Defines a 16 bit number
int32 Defines a 32 bit number
char Defines a 8 bit character
float Defines a 32 bit floating point number
short By default the same as int1
Int By default the same as int8
long By default the same as int16
void Indicates no specific type
La conversione verso dati più piccoli è gestita in automatico, quindi 
non è necessario il cast che avevo suggerito (l'avere lo strict option 
attivo in .NET causa questi dubbi!).
Ciao!
Marco / iw2nzm

 chiedevo se ci fossero soluzioni piu eleganti rispetto ad un pò di shift..
In assembler c'e' lo swap dei nibbles, che in un'unica istruzione prende 
il posto di 4 shift (chiaro che restano poi da mascherare solo quelli 
che interessano, ma uno swap e un and prendono il posto di 4 shift e un 
and), non so se in C esiste l'istruzione equivalente.
...altrimenti e' il momento di cominciare ad inserire microframmenti asm 
dove usare linguaggi ad alto livello rende le cose piu' contorte ;)
Esempio (6 locazioni programma e 24 cicli clock)
che riprende le righe:
unita = value & 0x0F;
decine = (value >> 4) & 0x0F;
movf value,w
andlw 0FH
movwf unita
swapf value,w
andlw 0FH
movwf decine
ciao
Claudio_F