Autor Tema: Ayuda con pot. digital mcp4131  (Leído 1870 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado edothebest

  • PIC10
  • *
  • Mensajes: 4
Ayuda con pot. digital mcp4131
« en: 12 de Noviembre de 2010, 16:33:05 »
 Hola a todos, les comento: tengo un potenciometro digital de microchip, es el mcp 4131 :5] y la verdad es que no se como ocuparlo, nunca e utilizado comunicacion spi asi que improvise una comunicacion pero no funciona bien, el codiigo que tengo es:


Código: [Seleccionar]
#include <16f628a.h>            //pic a utilizar         
#FUSES NOWDT                    //No Watch Dog Timer
//#FUSES HS                  //oscilador de tipo High Speed
#fuses INTRC_IO
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOMCLR                   //Master Clear pin disabled
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16)
#FUSES NOCPD                    //No EE protection
//#use delay(clock=20000000) 
#use delay(INTERNAL=4M)
#use standard_io(a) 
#use standard_io(b)
#use rs232(baud=9600, xmit=PIN_B2,rcv=PIN_B1)
char received;
void clock(void);
void v_arriba(void);
void v_abajo(void);
/////pin B4 clock
//////pin B5 sdo
#int_rda
void rda_isr()
{
disable_interrupts(int_rda);
received=getc();
putc(received);
enable_interrupts(int_rda);
}
void main(void)
{
enable_interrupts(global);
enable_interrupts(int_rda);
while(true)
{
if(received=='w')
{
v_arriba();
received=' ';
}
if(received=='s')
{
v_abajo();
received=' ';
}
}
}
void clock(void)
{
output_high(PIN_B4);
#asm
nop
nop
#endasm
output_low(PIN_B4);
#asm
nop
nop
#endasm
}
void v_abajo(void) //envia a mano un 0000 0100 funcionaa
{
output_low(PIN_B5);
clock();
clock();
clock();
clock();
clock();
output_high(PIN_B5);
clock();
output_low(PIN_B5);
clock();
clock();
}

uso un 16f648 sin cristal por ahora. la idea de este codigo es que con una w aumente el valor del pot. y con una s lo disminuya esto enviado desde el puerto serie, lo hice asi solo porque quiero saber usar este potenciometro.

segun el datasheet tengo que enviar un dato para incrementar el pot. y otro para decrementarlo.

el cto tengo las lineas de clock y sdo conectadas directas al pic.
aveces funciona la funcion de bajar pero lo hace de manera demaciado brusca.

en resumen si alguen a usado este potenciometro o al menos a usado comunicacion spi, agradeceria su ayuda.

Desconectado jonathanPIC888

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Re: Ayuda con pot. digital mcp4131
« Respuesta #1 en: 12 de Noviembre de 2010, 17:36:26 »
Hola como estás mirá te dejo mi código para un ATtiny2313, si le cambias lo referente al hardware SPI tiene que andar. Lo hice para un MCP41010
Código: C
  1. /*****************************************************************
  2.    Fecha: Setiembre del 2010.
  3.    Programa: Setea un valor en un potenciómetro digital MCP41010.
  4.    Cristal:  4Mhz.
  5.    Programador: PK2-ISP.
  6.  *****************************************************************/
  7. #include <avr/io.h>     // Definiciones de hardware.
  8. #include <util/delay.h>
  9.  
  10. // Declaramos funciones utilizadas.
  11. void    spi_init(uint8_t velocidad);  // Inicia el bus SPI y setea velocidad de trabajo.
  12. uint8_t spi_write(uint8_t dato);      // Escribe un dato en el bus SPI.
  13.  
  14. // Definimos los pines para la comunicación SPI.
  15. #define SDI PINB6  // Pin B5 como MOSI.
  16. #define SDO PINB5  // Pin B4 como MISO.
  17. #define SCK PINB7  // Pin B7 como SCK.
  18.  
  19. void spi_init(uint8_t velocidad) {
  20.  
  21.  if (velocidad==1) { // Si velocidad = 1, la velocidad del bus es máxima.
  22.         PORTB |= (1<<SDO)|(1<<PINB4);      
  23.         DDRB = (1<<SCK)|(1<<SDI)|(1<<PINB4);
  24.         USICR = (1<<USIWM0)|(1<<USICS1)|(1<<USICLK);
  25.         PORTB &= ~(1<<PINB4);    // Habilitamos esclavo.
  26.     } else { // Si velocidad es 0....
  27.         PORTB |= (1<<PINB4);     // Deshabilitamos esclavo.
  28.         DDRB &= ~((1<<SCK)|(1<<SDO)|(1<<SDI)|(1<<PINB4));
  29.         USICR = 0;
  30.     }
  31. }
  32.  
  33. uint8_t spi_write(uint8_t dato) {
  34.  
  35.  USIDR = dato; // Carga el dato a enviar.
  36.     USISR = (1<<USIOIF);
  37.     do {
  38.         USICR = (1<<USIWM0)|(1<<USICS1)|(1<<USICLK)|(1<<USITC); // Configuramos la USI.
  39.     } while ((USISR & (1<<USIOIF)) == 0); // En caso de que termine de enviar el dato, retorna el valor
  40.                                            // De USIDR.
  41.     return USIDR;    
  42. }
  43.  
  44.  
  45. int main(void) {
  46.  
  47.  DDRB = 0x07; // PB0--PB3 como salidas.
  48.  PORTB = 0x00; // Limpiamos el puerto B.
  49.        
  50.         for(uint8_t i=0; i<=0xFF; i++){
  51.        
  52.         spi_init(1);     // Iniciamos las comunicaciones con el esclavo MCP41010.
  53.        
  54.     spi_write(0x11); // Cargamos byte de comando.
  55.      
  56.      spi_write(i); // Seteamos valor del potenciómetro digital.
  57.      
  58.         _delay_ms(300);
  59.        
  60.          spi_init(0); // Apagamos el potenciometro.
  61.         }
  62.        
  63.    
  64.    
  65.    }

Fijate como podés configurar el SPI del microcontrolador que vas a usar, me parece que el PIC16F628 no tenías hardware SPI pero podés usar SPI por soft
« Última modificación: 13 de Noviembre de 2010, 11:30:15 por jonathanPIC888 »

Desconectado edothebest

  • PIC10
  • *
  • Mensajes: 4
Re: Ayuda con pot. digital mcp4131
« Respuesta #2 en: 13 de Noviembre de 2010, 11:14:51 »
Gracias por la ayuda,  :oops: pero no veo el codigo., otra cosa es para atmel? no se si sera demaciada la diferencia, ademas que nunca e usado comunicacion spi, estoy intentando con lo que he leido en este foro. pero no se que estare  haciendo mal.