kucaio Inserito: 1 agosto 2010 Segnala Share 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 Link al commento Condividi su altri siti More sharing options...
kappa47 Inserita: 1 agosto 2010 Segnala Share 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. Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 1 agosto 2010 Segnala Share 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? Link al commento Condividi su altri siti More sharing options...
kucaio Inserita: 3 agosto 2010 Autore Segnala Share 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. Link al commento Condividi su altri siti More sharing options...
giacomo56 Inserita: 4 agosto 2010 Segnala Share Inserita: 4 agosto 2010 Se vuoi testare un singolo bit di buffer devi usare l'operatore and bit a bit '&' e non '&&'. Ciao. Link al commento Condividi su altri siti More sharing options...
kucaio Inserita: 4 agosto 2010 Autore Segnala Share 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 Link al commento Condividi su altri siti More sharing options...
giacomo56 Inserita: 4 agosto 2010 Segnala Share 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. Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 4 agosto 2010 Segnala Share 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" Link al commento Condividi su altri siti More sharing options...
kucaio Inserita: 5 agosto 2010 Autore Segnala Share 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. Link al commento Condividi su altri siti More sharing options...
giacomo56 Inserita: 12 agosto 2010 Segnala Share 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. Link al commento Condividi su altri siti More sharing options...
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