# Duda con SPI y PICBASIC



## syryus (Abr 14, 2012)

Hola a todos. He estado buscando información sobre SPI y PICBASIC y la verdad es que no he encontrado gran cosa, así que recurro a vosotros.

El caso es que no se prácticamente nada y me he propuesto aprender con un ejemplo sencillo. Me gustaría saber como leer un sensor de temperatura (TC77) y en función del dato obtenido hacer algo

¿Alguien sabe como obtener el dato de temperatura del sensor para poder trabajar posteriormente con el?

Un saludo


----------



## MrCarlos (Abr 14, 2012)

Hola syryus

Ciertamente encontrar las 2 cosas (SPI y PICBASIC) juntas no lo vas a lograr.
Primero busca en Google.com indagando por SPI; lo hice y encontré algo que te adjunto.
Luego busca PicBasic PRO en el mismo Google.com de seguro lo encontraras.

Como Dicen los norteamericanos: “By The Way” qué simulador utilizas para el desarrollo de tus circuitos?.

saludos
a sus ordenes


----------



## syryus (Abr 15, 2012)

Hola MrCarlos, muchas gracias por tu ayuda. Sobre protocolo SPI ya busqué algo de información por separado y más o menos lo entiendo, el problema es la sintaxis para trabajar con el en picbasic.

Para simular uso ISIS de Proteus y como compilador PICBASICPRO

Voy a echarle un vistazo a los ejemplos que pones


----------



## lubeck (Abr 15, 2012)

El protocolo SPI con Picbasic, se hace solo por HardWare....

en la parte final de estos ejemplos se ve como hacer el SPIMAster  y el SPI Slave...


----------



## rakata (Abr 15, 2012)

Hola, tambien estoy interesado


----------



## syryus (Abr 15, 2012)

Sigo sin aclararme, es que soy muy torpe jaja.

A ver:

 -Supongamos como digo un TC77 que tiene una entrada de reloj (SCK), una de Chip Select (CS) y una Serial I/O (SI/O)
-Están conectados respectivamente a RC0, RC1 y RC2

¿Cómo obtengo el dato que necesito (temperatura) y lo almaceno en una variable?

A ver si alguien ha hecho algo parecido

Muchas gracias!


----------



## lubeck (Abr 15, 2012)

> ¿Cómo obtengo el dato que necesito (temperatura) y lo almaceno en una variable?



Muuuuuyyy buena pregunta... voy a intentar hacer un ejemplo.. a ver si puedo...


----------



## lubeck (Abr 16, 2012)

A ver Amigos...

Noticia buena y noticia mala.... 

la buena es que logre que se comunique el TC77 con un 16f876A..

la mala es que no tengo idea de que es lo que manda... 

anexo simulacion... a ver que se les ocurre que falte!


----------



## syryus (Abr 16, 2012)

Lubeck eres una máquina ;-)

Le he echado solamente un vistazo por encima pero creo que lo único que habría que hacer es tratar la variable que se obtiene con una simple operación matemática.

Cuando llegue a casa lo analizo con calma


----------



## syryus (Abr 17, 2012)

Una cosa. ¿Por qué defines A como word y no como byte?

¿Qué es Pir.3?

Un saludo


----------



## lubeck (Abr 17, 2012)

> ¿Por qué defines A como word y no como byte?



porque lo que manda el tc77 son 16bits, un byte son 8 bits, y un word son 16bits que es lo que necesitamos...



> ¿Qué es Pir.3?



pir.3 es la bandera de interrupcion del SPI, ese bit del registro PIR el micro lo pone en alto cuando llega algo al buffer de recepcion del SPI(registro  SSPBUF) ... osea un byte..8bits... y se tiene que borrar por software, por eso se pone pir.3=0


----------



## syryus (Abr 18, 2012)

Pues no se que pasa entonces...


----------



## papirrin (Abr 18, 2014)

me permito reflotar este tema porque el codigo de lubeck parece no estar correcto, en todo caso seria asi:


```
DEfine Osc 4

TrisB=0
ADCON1 = 7  

Define LCD_DREG  PORTB
Define LCD_DBIT  4
Define LCD_RSREG PORTB
Define LCD_RSBIT 1
Define LCD_RWREG PORTB
Define LCD_RWBIT 2
Define LCD_EREG  PORTB
Define LCD_EBIT  3
DEFINE LCD_BITS 4 


A VAR word        
 
SSPCOn =%00100001
SSPStat=%01000000
PIR1.3 = 0         
   
TrisC.3=0
LCDOut $FE,1,"LUBECK" 
pause 1000        

PortB.0=0     

 SSPBUF=255 : GoSub letclear
 A.byte0=SSPBUF 
 SSPBUF=255 : GoSub letclear 
 A.byte1=SSPBUF   

 SSPBUF = 0:  GoSub letclear 
 A.byte0=SSPBUF  
 SSPBUF = 0:  GoSub letclear                 		
 A.byte1=SSPBUF

 portb.0=1
 pause 1500
 
main:
 PortB.0=0         
 SSPBUF = 0:  GoSub letclear 
 a.byte0 = SSPBUF 
 SSPBUF = 0:  GoSub letclear                 		                            
 a.byte1 = SSPBUF 
 PortB.0=1                
 lcdout $FE,1, dec a,$FE,$C0,dec pir1.3 
 pause 1000  
GoTo main  

Letclear:
 IF pir1.3 = 0 Then letclear 
 PauseUs 25        
 pir1.3 = 0         
Return

End
```

porque el registro SSPBUF solo es de 8 bits, y como estaba se perderia los 8 bits restantes.


----------



## fsola (Abr 23, 2016)

Yo tampoco encontraba nada así que después de pegarme un buen rato con picbasic lo conseguí.

He dejado un ejemplo en este blog:

http://recretronica.wordpress.com

Espero que sirva de ayuda para alguien.


----------

