Ciao come potrei emulare un uart via softwere per collegare al mio pic12f765 il SRF02
su qualche application note posso trovar gia il codice fatto in c??? ciaoo
Ciao come potrei emulare un uart via softwere per collegare al mio pic12f765 il SRF02
su qualche application note posso trovar gia il codice fatto in c??? ciaoo
softwAre :)
Sicuro? O forse 12F675?
Che C usi? Il CCS se non trova la UART hardware ci pensa lui a emularla via software.
Sul sito Microchip trovi l'AN555 però è in asm, magari può comunque esserti utile.
Ciao Marco / iw2nzm
cioe cosa significa il css ???
Boh, qui ultimamente c'è la sagra dei troll oppure di chi storpia le parole di proposito...
Ma nel dubbio stavolta ti rispondo:
Marco / iw2nzm
Il codice che ho fatto è il seguente
in ingresso in uart ha Srf02 su 8 bit ed in uscita DAC su 16bit
#define init 1
#int_RDA
char dato,uscita,outH,Outl;
int flag=0;
***setup timer****setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_4); / ogni 260 ms
setup_timer_2(T2_INTERNAL|T2_DIV_BY_4); /ogni 260 ms
enable_interrupts(INT_RB);
enable_interrupts(INT_COMP);
enable_interrupts(GLOBAL);
****setup porte***TRISA=000100b; i pin 0,1,2,4 vengono impostati come uscite, il 3 come ingreso
***setup UART***SYNC=0; configura l'UART per operazioni asicrone
SPEN=1; abilità l'UART
BRG16=0; set freq di trasmissione
BRGH=0;
TXEN=1; abilita UART
RDA_isr()/interrupt RS232
{arrivato=1; *nuovo dato in arrivo
}#int_TIMER1timer spedisce il dato sull uscita DAC ogni 260 ms
TIMER1_isr()
{If (flag=1)
{TXREG=outH invio sull'UART il 1 byte del dato
While(TRMT=0); aspetto che il registro si svuoti
TXREG=outL invio sull'UART il 2 byte del dato
While(TRMT=0); finito la trasmissione
flag=0; spedizione fatta, pronto per la prossima
} }void main ()
arrivato=0;
while(1)
{enable_interrupts(INT_TIMER1);
enable_interrupts(INT_TIMER2);
enable_interrupts(INT_RTCC);
enable_interrupts(INT_COMP);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
if (arrivato) nuovo dato in arrivo flag settato int RS232
{disable_interrupts(INT_RDA); disabilita int rs232
ID=getc();legge dato da rs232 bit start
dato=getc(); aspetta e legge dato da rs232
Uscita=dato;
outH=uscita
e difficilmente funzionera' , visto che non riusciresti neanche a compilarlo tanto e' pieno di errori di sintassi.
quello che si nota di piu' e' il seguente il C e' case sensitive: Uscita e' diverso da uscita.
oppure: i commenti iniziano per // o sono racchiusi da /* */
nota a lato il 12f765 citato ad inizio thread neanche esiste ne esiste il 16f765 , la sigla piu' vicina e' 12f675 ed usero' quello come riferimento
il 12f675 non ha la seriale hardware, registri come
SYNC SPEN BRG16 BRGH TXEN
sono un po' fuori luogo ( sembra un esempio di codice per un micro con UART interna ) nel senso che in una implementazione software di una uart difficilmente ci sarebbero
che DAC hai usato ? e che protocollo usa ? buttato cosi il codice nella routine d'interrupt del timer sembrerebbe un qualcosa tipo 'SPI' ma il '675 non ha una interfaccia SPI hardware, e quel pezzo di codice andrebbe fatto a manina, cio'e non basta scrivere il valore in un fantomatico registro per trasmettere il dato usando una SPI software.
nota a lato: un DAC a 16 bit piu' la necessaria circuiteria analogica che ti garantisce una accuratezza a 16 bit costa un bel po' di soldi
non ha senso aggiornare periodicamente il dac, basta aggiornarlo ogni volta che arriva un nuovo dato dalla seriale dell' Srf02 in macro codice:
main() { int dato; inizializza_DAC(); inizializza_seriale(); while(1) { dato = leggi_dato_da_seriale(); manda_dato_al_DAC(dato); } }
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.