LusoRobótica - Robótica em Português
Sistemas específicos => PIC => Tópico iniciado por: beirao em 17 de Março de 2012, 15:47
-
Boas
estou com dificuldade em utilizar um DAC TLV5618A através de um PIC18F4520. Já alguém usou este DAC?
envio os dados e ele não responde...
-
tens um protocol-analyzer p te ajudar ?
-
tens um protocol-analyzer p te ajudar ?
Não... mas se simular no proteus (sem o DAC porque não tem o modelo) parece estar tudo ok. quer dizer, logo no primeiro byte aparece la um primeiro bit não definido...
-
Podes sempre fazer um sanity check ao código usando isto:
http://wiblocks.luciani.org/src/lib/DAC/classDAC__TLV5618.html (http://wiblocks.luciani.org/src/lib/DAC/classDAC__TLV5618.html)
Sempre que queiras usar um chip, seja ele qual for, experimenta sempre meter o nome do mesmo e arduino no google, 99% das vezes apanhas uma biblioteca testada.
-
Usei esse DAC ha uns tempos num projecto pessoal inacabado.
Aqui fica o código (a funcionar):
.c
#include "system.h"
Device TLV5618A;
void TLV5618A_options(void)
{
// Implemented protocols
driver_protocol_SPI(&TLV5618A);
// Set protocol options
SPI_disable();
SPI_set_mode(SPI_MODE2);
SPI_set_speed(SPI_FSCK_125k);
SPI_set_bitmode(SPI_BITMODE16);
SPI_enable();
}
void TLV5618A_setup(void)
{
//SPI_write(TLV5618A_FASTMODE);
}
void TLV5618A_read(void)
{
}
void TLV5618A_write(void)
{
uint16_t buf;
buf = TLV5618A.write_data & 0x0FFF; // 12bit data
switch(driver_get_config_param1(&TLV5618A))
{
case 0: buf |= TLV5618A_FASTMODE; break;
case 1: buf &= ~TLV5618A_FASTMODE; break;
default: buf |= TLV5618A_FASTMODE;
}
buf &= ~TLV5618A_RSELMASK;
switch(driver_get_config_param0(&TLV5618A))
{
case 0:
buf |= TLV5618A_DACB; break;
case 1:
buf |= TLV5618A_DACA; break;
case 2:
case 3:
buf |= TLV5618A_BUFFER; break;
default: buf |= TLV5618A_DACB;
}
if(driver_get_config_param2(&TLV5618A) == 1)
{
buf |= TLV5618A_PWRDOWN;
buf &= 0xF000;
}
else
buf &= ~TLV5618A_PWRDOWN;
SPI_set_CS(0);
Nop();Nop();Nop();Nop();
SPI_send(buf);
Nop();Nop();Nop();Nop();
SPI_set_CS(1);
if(driver_get_config_param0(&TLV5618A) == 2)
{
buf &= ~TLV5618A_RSELMASK;
buf |= TLV5618A_DACA;
Nop();Nop();Nop();Nop();
SPI_set_CS(0);
Nop();Nop();Nop();Nop();
SPI_send(buf);
Nop();Nop();Nop();Nop();
SPI_set_CS(1);
}
}
.h
#ifndef _TLV5618A_H
#define _TLV5618A_H
#include "./drivers/drivers.h"
extern Device TLV5618A;
#define TLV5618A_PWRDOWN 0x2000
#define TLV5618A_FASTMODE 0x4000
#define TLV5618A_SLOWMODE 0x0000
#define TLV5618A_DACA 0x8000
#define TLV5618A_DACB 0x0000
#define TLV5618A_BUFFER 0x1000
#define TLV5618A_RSELMASK 0x9000
// P R O T O T Y P E S
void TLV5618A_options(void);
void TLV5618A_setup(void);
void TLV5618A_read(void);
void TLV5618A_write(void);
#endif
Se precisares do código SPI diz que ponho-o também aqui.
-
Podes sempre fazer um sanity check ao código usando isto:
http://wiblocks.luciani.org/src/lib/DAC/classDAC__TLV5618.html (http://wiblocks.luciani.org/src/lib/DAC/classDAC__TLV5618.html)
Sempre que queiras usar um chip, seja ele qual for, experimenta sempre meter o nome do mesmo e arduino no google, 99% das vezes apanhas uma biblioteca testada.
e foi o que fiz senso, vi esse site e o código e estou a fazer como aí estava mas não me tava a safar...
Obrigado msr! Agora estou aqui com o desenho de uma PCB em mãos mas mais logo ou amanhã já dou novidades;) thanks!
-
Mas já agora mete também o código SPI, sff
-
SPI
.c
#include "system.h"
SPI_settings _SPI_settings;
void SPI_set_mode(mode_t mode)
{
//SPI_disable();
switch(mode)
{
case SPI_MODE0:
SPI_set_cpol(0);
SPI_set_cpha(0);
break;
case SPI_MODE1:
SPI_set_cpol(0);
SPI_set_cpha(1);
break;
case SPI_MODE2:
SPI_set_cpol(1);
SPI_set_cpha(0);
break;
case SPI_MODE3:
SPI_set_cpol(1);
SPI_set_cpha(1);
break;
}
//SPI_enable();
}
void SPI_set_speed(speed_t speed)
{
_SPI_settings.speed = speed;
SPI1CON1bits.PPRE = (speed >> 3) & 0x03;
SPI1CON1bits.SPRE = speed & 0x07;
}
void SPI_set_CS(uint8_t level)
{
#ifndef SW_SPI
PORT3_P4 = level;
#endif
}
uint16_t SPI_send(uint16_t data)
{
uint16_t buf;
SPI1BUF = data;
while(!SPI1STATbits.SPIRBF);
buf = SPI1BUF;
return buf;
}
void SPI_init(void)
{
SPI1STAT = 0;
SPI1CON1 = 0x047E; // Master mode, 16bit mode
SPI1CON2 = 0; // Framed SPI1 support is disabled
// Enhaced buffer is disabled
SPI_set_mode(SPI_MODE3);
SPI_set_speed(SPI_FSCK_125k);
#if defined(MCU_P24F32KA301)
_ANSB12 = 0;
_ANSB13 = 0;
_ANSB14 = 0;
_ANSB15 = 0;
#endif
PORT3_P1_TRIS = 0; // SCK
PORT3_P2_TRIS = 0; // SDO
PORT3_P4_TRIS = 0; // CS
SPI_set_CS(1);
SPI1STATbits.SPIEN = 1; // Enable SPI module
}
.h
#ifndef _SPI_H
#define _SPI_H
#include "../protocols/protocols.h"
#define SPI_MODE0 0
#define SPI_MODE1 1
#define SPI_MODE2 2
#define SPI_MODE3 3
#define SPI_BITMODE8 0
#define SPI_BITMODE16 1
//#define SPI_FSCK_8M 0b11110 // ...bad results!
//#define SPI_FSCK_4M 0b11100 // ...bad results!
#define SPI_FSCK_2M 0b11000
#define SPI_FSCK_1M 0b01111
#define SPI_FSCK_500k 0b01110
#define SPI_FSCK_250k 0b01100
#define SPI_FSCK_125k 0b01000
#define SPI_default_options {P_SPI, SPI_FSCK_125k, SPI_MODE0, 0}
typedef struct _spi_s
{
speed_t speed;
mode_t mode;
uint8_t select;
} SPI_settings;
extern SPI_settings _SPI_settings;
#define SPI_get_speed() _SPI_settings.speed
#define SPI_get_mode() _SPI_settings.mode
//#define SPI_set_CSpin(pin) _SPI_settings.CSpin = pin
//#define SPI_get_CSpin() _SPI_settings.CSpin
#define SPI_enable() SPI1STATbits.SPIEN = 1
#define SPI_disable() SPI1STATbits.SPIEN = 0
#define SPI_set_cpol(b) SPI1CON1bits.CKP = b
#define SPI_set_cpha(b) SPI1CON1bits.CKE = (~(b) & 0x01)
#define SPI_set_bitmode(m) SPI1CON1bits.MODE16 = 1
void SPI_set_mode(mode_t mode);
void SPI_set_speed(speed_t speed);
uint16_t SPI_send(uint16_t data);
void SPI_set_CS(uint8_t level); // ???????
void SPI_init(void);
#endif
-
Muito obrigado!
-
Podes dar-me um ajudinha? Vês algum erro no meu código?
OpenSPI(SPI_FOSC_4, MODE_10, SMPEND);
na main:
Delay10KTCYx(5000);
PORTDbits.RD1 = 0; //chip select
PORTDbits.RD0=~PORTDbits.RD0; //led de debug
Delay10KTCYx(1);
SSPBUF = 0b1100111111111100; //envio de dados
while(!SSPSTATbits.BF);
Delay10KTCYx(1);
PORTDbits.RD1 = 1; //chip select
-
Já funciona ;)
Obrigado pela ajuda!