Vai al contenuto
PLC Forum


Pic 16f877a - Comportamento anomalo


kucaio

Messaggi consigliati

Salve a tutti,

A mio avviso il comportamento anomalo del microprocessore è il valore che assume la variabile buffer quando viene ciclata, infatti alla riga in cui pongo data  = 1 e buffer = data, il valore che la variabile buffer assume è 0x24 e non 1 come mi aspetterei che fosse.

Questa anomalia mi accade solo quando vado in simulazione con il mio PICkit2 sul circuito icd, mentre le cose vanno a posto con il debugger MLAB SIM, infatti andando in simulazione con quest'ultimo la variabile buffer assume il valore corretto ovvero 0x1. Qualcuno di voi sa spiegarmi questo strano e a me incomprensibile fenomeno?, sicuramente ho scritto male qualcosa nel codice...grazie a tutti.

unsigned char data = 0;
unsigned char buffer = 0;
unsigned char bit_buffer = 0;

void
trasferisci_out()

{
	data  = 1;
	buffer = data;


	for (x=0;x<8;x++)
  {
  if  (bit_buffer == 1) //ind_bit0 == 1)
  {
  	IO_DATA = 1; 
  }
  else
  {  	
  	IO_DATA = 0;
  }
  IO_SCLK=1;

  buffer = buffer>>1;
  bit_buffer = (buffer && 0b00000001);
  IO_SCLK=0;
	}
}

Modificato: da kucaio
Link al commento
Condividi su altri siti


Hai provato a fare il refresh della variabile "buffer" dopo la sua scrittura ?

Non capisco l'istruzione "buffer = buffer>>1;" il risultato è sicuramente 0x00.

Fammi sapere ...ciao.

Link al commento
Condividi su altri siti

Oltre a quanto scritto da kappa47, mi sembra che fai giri di pista a vuoto

 IO_SCLK=1;

 buffer = buffer>>1;
 bit_buffer = (buffer && 0b00000001);
 IO_SCLK=0;

A che serve sta roba?

Link al commento
Condividi su altri siti

Ciao a tutti,

la variabile refresha in quanto il valore iniziale dichiarato e 0x0 e mi trovo 0x24.

Per quanto riguarda il programma l'istruzione al quale fate riferimento mi serve per shiftare la variabile buffer verificare il valore del bit 0 mandandolo in and al valore 0b00000001 e inviarlo ad una porta.

L'applicazione consiste nel comunicare con rtc della dallas ds1302.

Grazie per le risposte se avete altre idee fatemi sapere.

Link al commento
Condividi su altri siti

risposta interessante, mi potresti fare un esempio di codice ? l'operatore && non fas l'and di due operandi? o meglio se io faccio 0bxxxxxxxx && 0b00000001 il risultato non è 1 se il bit0 della variabile 1 non è 1 ed è 0 se il bit0 della variabile 1 non è zero? comunque il problema rimane.

grazie.

Modificato: da kucaio
Link al commento
Condividi su altri siti

L'operatore && da come risultato 1 se entrambi gli operandi sono diversi da zero mentre & esegue l'and bit a bit.

Esempio:

0b1110 && 0b0001 = 1 mentre 0b1110 & 0b0001 = 0

Ciao.

Link al commento
Condividi su altri siti

Solitamente i compilatori "C" per PIC hanno built in functio per operazioni sui bit. Ad esempio CSC ha "test bit" e "set bit"

Link al commento
Condividi su altri siti

Uso il compilatore Hi tech C in versione lite quale funzione posso usare per testare o settare una variabile a bit? come vedete sono nuovo dell'argomento ...prima mi dilettavo a programmare in assembler.

comunque. grazie Livio e Giacomo per le risposte.

Link al commento
Condividi su altri siti

Il compilatore HI-TECH mi pare non abbia funzioni predefinite per manipolare i singoli bit.

Per farlo si può fare ricorso a delle macro, come riportato sul manuale a cui consiglio di dare un'occhiata.

Per esempio

#define bitset(var, bitno) ((var) |= 1UL << (bitno))

#define bitclr(var, bitno) ((var) &= ~(1UL << (bitno)))

Nel programma si può scrivere

bitset(PORTB,6);

oppure

bitclr(buffer, 0);

Come vedi però bisogna usare sempre gli operatori &, | e << o >>.

Un altro modo è quello di usare l'assembler inline.

Ciao.

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