uart sui pic via softwere

Ciao come potrei emulare un uart via softwere per collegare al mio pic12f765 il SRF02

formatting link

su qualche application note posso trovar gia il codice fatto in c??? ciaoo

Reply to
Harmon
Loading thread data ...

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

Reply to
Marco Trapanese

cioe cosa significa il css ???

Reply to
Harmon

Boh, qui ultimamente c'è la sagra dei troll oppure di chi storpia le parole di proposito...

Ma nel dubbio stavolta ti rispondo:

formatting link

Marco / iw2nzm

Reply to
Marco Trapanese

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

Reply to
Harmon

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); } }

Reply to
mmm

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.