Newsgroup: it.hobby.elettronica.digitale
Titolo: bug di MikroC ????

salve
provo questo piccolo esempio scritto con mikroC 6.0
che dovrebbe farmi lampeggiare 2 led posti sulla
porta A(A0 e A1)di un PIC a circa 0.5Hz :
//PIC16F684 + EasyPIC4
//++++++++++++INIZIO MAIN++++++++++++++++++++
void main (){
      TRISA=0;
      PORTA=0;
      TRISC=0;
      PORTC=0;
//--------------lamp led---------------------
while (1){
         PORTA.F0=1;
         PORTA.F1=1;
         delay_ms(250);
         PORTA.F0=0;
         PORTA.F1=0;
         delay_ms(250);
         }
}
invece mi lampeggia solo il led posto su A1. quello
posto su A0 sta sempre spento. ho provato diversi PIC
dei 12F e dei 16F ,ma è sempre euguale.
sbaglio qualcosa io ,oppure (mi sembrerebbe molto strano)
è un bug del compilatore mikroC?
grazie a tutti
emilio

 //--------------lamp led---------------------
Premetto che non usoi Mikro C ma mi viene il dubbio su come si definiscono 
gli ingressi ed uscite, cioe' come hai scritto tu il compilatore interpreta 
che stai usandola notazione binaria? non sarebbe meglio definire i singoli 
bit della porta? vale a dire scrivere in notazone binaria del tipo 
TRISA=00000000 

 
ciao
in mikroc se non metti nulla davanti lo intende come decimale,
se vuoi def. binaria usi 0b...e se esad. 0x...
nel mio caso usando "0" decimale tutti i bit sono settati a "0"
emilio

 }
Premetto che non conosco il MikroC, ma sei sicuro che per accedere ai 
bit della porta si possa fare PORTA.F0=1 ?
Prova a cambiare il tutto con:
while (1)
{
         PORTA = 0x03;  // 00000011 in binario
         delay_ms(250);
         PORTA = 0;
         delay_ms(250);
}
Ciao

 Ciao
ciao
in mikroc per accedere al settaggio dei singoli bit delle porte
si puo usare PORT(lettera della porta).F(numero del bit).
in corso di programma č molto comodo...... come ai suggerito
tu funziona, ma non mi va questo particolare uso del C di
mikroc; e non capisco perchč.
ho provato con un 16f877 e funziona normalmente con PORTx.Fy
sembra che il problema ci sia solo con questi micro (12f675 e
16f684) che sono di piccola taglia 8 e 14 pin rispettivamente.
emilio

salve
a chi puo interessare, penso che sia una cosa comune a +
uC pic ,sopratutto quelli + piccoli, il tutto era dovuto
al fatto che questi tipo di uC hanno un registro per dire
se un input e I/O digitale o analogico,detto ANSEL, e che di
default è settato come analogico; quindi bisogna scrivere
0 nel relativo bit dell'ANSEL per poter usare quel bit
come I/O digitale.
emilio

 mikroc; e non capisco perchè.
Se posso darti un consiglio, se pensi poi di utilizzare il compilatore e 
il codice per lavoro, usare funzionalità specifiche e non ANSI standard 
è controproducente. Ti lega al prodotto (se cambi compilatore devi 
cambiare il codice) e rende il codice non portabile e riusabile.
Se vuoi mantenere la comodità ma usare lo standard, ti consiglio di 
farti 2 macro tipo queste:
#define SET_BIT(port, bit)   (port |=  (1 << (bit)))
#define RESET_BIT(port, bit) (port &= ~(1 << (bit)))
E ricorda che queste operazioni, anche se fatte da estensioni apposite 
del compilatore, non sono mai atomiche: richiedono cioè di leggere, 
modificare e riscrivere il registro.
E fra la lettura e la riscrittura, può scattare un interrupt e cambiare 
il contenuto del registro, con conseguenti comportamenti strani e bug 
veramente difficili da risolvere.
Ciao