kucaio Inserito: 1 agosto 2010 Segnala Inserito: 1 agosto 2010 (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: 1 agosto 2010 da kucaio
kappa47 Inserita: 1 agosto 2010 Segnala Inserita: 1 agosto 2010 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.
Livio Orsini Inserita: 1 agosto 2010 Segnala Inserita: 1 agosto 2010 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?
kucaio Inserita: 3 agosto 2010 Autore Segnala Inserita: 3 agosto 2010 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.
giacomo56 Inserita: 4 agosto 2010 Segnala Inserita: 4 agosto 2010 Se vuoi testare un singolo bit di buffer devi usare l'operatore and bit a bit '&' e non '&&'. Ciao.
kucaio Inserita: 4 agosto 2010 Autore Segnala Inserita: 4 agosto 2010 (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: 4 agosto 2010 da kucaio
giacomo56 Inserita: 4 agosto 2010 Segnala Inserita: 4 agosto 2010 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 = 0Ciao.
Livio Orsini Inserita: 4 agosto 2010 Segnala Inserita: 4 agosto 2010 Solitamente i compilatori "C" per PIC hanno built in functio per operazioni sui bit. Ad esempio CSC ha "test bit" e "set bit"
kucaio Inserita: 5 agosto 2010 Autore Segnala Inserita: 5 agosto 2010 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.
giacomo56 Inserita: 12 agosto 2010 Segnala Inserita: 12 agosto 2010 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ò scriverebitset(PORTB,6);oppurebitclr(buffer, 0);Come vedi però bisogna usare sempre gli operatori &, | e << o >>.Un altro modo è quello di usare l'assembler inline.Ciao.
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora