TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Ala en 29 de Diciembre de 2013, 11:56:54
-
Hola, estimados personajes, mi duda se centra en que he realizado el codigo para comunicacion SPI entre el pic 16f887a y el potenciometro digital mcp41010, pero no se xq no funciona, que alguien me explique ¡¡¡¡.. dice la frase.
Me encuentro utilizando la libreria Spi del programa MikroC_PRO, adjunto el codigo y su simulacion en proteus 8.
utilizando el SPI_debuger del simulador al parecer llega el byte de datos, pero el pot digital no realiza nada.
De antemano Gracias Sad ...
unsigned int value=0; // Dato a ser enviado es de tipo unsigned int
void main() {
TRISC.B0=0; //configurcion de pines como salida y entrada
TRISC.B3=0;
TRISC.B5=0;
TRISC.B4=1;
PORTC.F0=1;
// inicio del modulo SPI
SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH); // Inicializar el módulo SPI
delay_ms(10);
while(1){
PORTC.F0=0; //seleccion de dispositivo
delay_ms(10);
SPI1_Write(value); // Envíar el valor
value++; // invcremento del valorpara enviar al pot dig
if(value==256)value=255;
PORTC.F0=1; //deseleccion del dispositivo
delay_ms(500);
}
}
-
En estas comunicaciones como el SPI, primero tienes que enviar una instrucción de lo que se debe realizar al integrado(leer, escribir, testear, etc).
y después enviar el valor que quieres colocar(en el caso que quieras realizar la instrucción de escribir)
En tu código aparece que solo envias 0,1,2,3...., pero esos datos no son datos que pueda interpretarlo.
En el datasheet, pagina 18:
http://ww1.microchip.com/downloads/en/DeviceDoc/11195c.pdf
te dice los datos que debes enviar para que se comporte como requieres.
primero envia un byte de comando y despues envia la data necesaria.
Otra cosa es que también seria bueno que lo pruebes fisicamente, ya que a veces proteus no te simula bien el comportamiento del SPI cuando hay 2 integrados comunicandose(Me sucedió para 2 dspics).
-
((:-)) puccha muchas gracias PCCM :-/ eso habia sido.... :D.... al parecer la simulación funciona, esperemos en realidad lo haga también,, jeje
-
Buenas estoy intentando programar en hitech el spi del pic16f877a pero no me entra en ningun momento en la interrupcion. Expongo el programa a ver si sabeis cual es el problema.
Un saludo.
#include <htc.h>
__CONFIG(WRT_OFF & WDTE_OFF & PWRTE_OFF & FOSC_HS & LVP_OFF);
#define _XTAL_FREQ 20000000 //Oscilador Interno de 20MHZ
#define PIN_SCE PORTA,0
#define PIN_RESET PORTA,1
#define PIN_DC PORTA,2
#define PIN_SDIN PORTA,3
#define PIN_SCLK PORTA,4
// Configuracion del Lcd
#define LCD_C 0
#define LCD_D 1
#define LCD_CMD 0
// Tamaño del Lcd
#define LCD_X 84
#define LCD_Y 48
signed int scrollPosition=-10,index=1;
const signed espacio[5]={0,0,0,0,0};
const char exclamacion[5]={0,0,0,0,0};
void main ()
{
TRISA=0X00;
PORTA=0X00;
TRISB=0X00;
TRISC=0b00000000;
SMP=1;
SSPM3:SSPM0=0010;
CKP=0;
SMP=1;
CKE=0;
PEIE=1;
GIE=1;
SSPIE=1;
SSPEN=1;
TRISB=0X00;
SSPBUF=0X22;
while(1)
{
}
}
static void interrupt isr(void)
{
if(SSPIF==1)
{
SSPIF=0;
PORTB=0XFF;
if(WCOL==1)
{
WCOL=0;
}
if(SSPOV==1)
{
SSPOV=0;
}
}
}
-
Buenas estoy intentando programar en hitech el spi del pic16f877a pero no me entra en ningun momento en la interrupcion. Expongo el programa a ver si sabeis cual es el problema.
Un saludo.
#include <htc.h>
__CONFIG(WRT_OFF & WDTE_OFF & PWRTE_OFF & FOSC_HS & LVP_OFF);
#define _XTAL_FREQ 20000000 //Oscilador Interno de 20MHZ
#define PIN_SCE PORTA,0
#define PIN_RESET PORTA,1
#define PIN_DC PORTA,2
#define PIN_SDIN PORTA,3
#define PIN_SCLK PORTA,4
// Configuracion del Lcd
#define LCD_C 0
#define LCD_D 1
#define LCD_CMD 0
// Tamaño del Lcd
#define LCD_X 84
#define LCD_Y 48
signed int scrollPosition=-10,index=1;
const signed espacio[5]={0,0,0,0,0};
const char exclamacion[5]={0,0,0,0,0};
void main ()
{
TRISA=0X00;
PORTA=0X00;
TRISB=0X00;
TRISC=0b00000000;
SMP=1;
SSPM3:SSPM0=0010;
CKP=0;
SMP=1;
CKE=0;
PEIE=1;
GIE=1;
SSPIE=1;
SSPEN=1;
TRISB=0X00;
SSPBUF=0X22;
while(1)
{
}
}
static void interrupt isr(void)
{
if(SSPIF==1)
{
SSPIF=0;
PORTB=0XFF;
if(WCOL==1)
{
WCOL=0;
}
if(SSPOV==1)
{
SSPOV=0;
}
}
}
¿Puedes mostrar tu conexionado? ¿Por qué defines SDI como "PORTA,3" si el pin para SDI es RC4?