Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




Pic 16f877a - Comportamento anomalo


Messaggi consigliati

Inserito: (modificato)

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

Inserita:

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.

Inserita:

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?

Inserita:

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.

Inserita:

Se vuoi testare un singolo bit di buffer devi usare l'operatore and bit a bit '&' e non '&&'.

Ciao.

Inserita: (modificato)

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

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.

Inserita:

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

Inserita:

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.

Inserita:

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.

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