collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: PIC e DAC TLV5618A  (Lida 3959 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline beirao

  • Mini Robot
  • *
  • Mensagens: 1.531
PIC e DAC TLV5618A
« 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...
"O único lugar onde o sucesso vem antes do trabalho, é no dicionário" - Albert Einstein

Offline Sérgio_Sena

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.649
    • Electronic Gear for Musicians
Re: PIC e DAC TLV5618A
« Responder #1 em: 17 de Março de 2012, 17:02 »
tens um protocol-analyzer p te ajudar ?

Offline beirao

  • Mini Robot
  • *
  • Mensagens: 1.531
Re: PIC e DAC TLV5618A
« Responder #2 em: 17 de Março de 2012, 17:03 »
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...
"O único lugar onde o sucesso vem antes do trabalho, é no dicionário" - Albert Einstein

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: PIC e DAC TLV5618A
« Responder #3 em: 17 de Março de 2012, 21:28 »
Podes sempre fazer um sanity check ao código usando isto:
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.
Avr fanboy

Offline msr

  • Mini Robot
  • *
  • Mensagens: 798
Re: PIC e DAC TLV5618A
« Responder #4 em: 17 de Março de 2012, 21:41 »
Usei esse DAC ha uns tempos num projecto pessoal inacabado.
Aqui fica o código (a funcionar):

.c
Código: [Seleccione]
#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
Código: [Seleccione]
#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.

Offline beirao

  • Mini Robot
  • *
  • Mensagens: 1.531
Re: PIC e DAC TLV5618A
« Responder #5 em: 17 de Março de 2012, 22:23 »
Podes sempre fazer um sanity check ao código usando isto:
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!
"O único lugar onde o sucesso vem antes do trabalho, é no dicionário" - Albert Einstein

Offline beirao

  • Mini Robot
  • *
  • Mensagens: 1.531
Re: PIC e DAC TLV5618A
« Responder #6 em: 17 de Março de 2012, 22:25 »
Mas já agora mete também o código SPI, sff
"O único lugar onde o sucesso vem antes do trabalho, é no dicionário" - Albert Einstein

Offline msr

  • Mini Robot
  • *
  • Mensagens: 798
Re: PIC e DAC TLV5618A
« Responder #7 em: 17 de Março de 2012, 22:37 »
SPI

.c
Código: [Seleccione]
#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
Código: [Seleccione]
#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

Offline beirao

  • Mini Robot
  • *
  • Mensagens: 1.531
Re: PIC e DAC TLV5618A
« Responder #8 em: 17 de Março de 2012, 22:48 »
Muito obrigado!
"O único lugar onde o sucesso vem antes do trabalho, é no dicionário" - Albert Einstein

Offline beirao

  • Mini Robot
  • *
  • Mensagens: 1.531
Re: PIC e DAC TLV5618A
« Responder #9 em: 17 de Março de 2012, 23:10 »
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
"O único lugar onde o sucesso vem antes do trabalho, é no dicionário" - Albert Einstein

Offline beirao

  • Mini Robot
  • *
  • Mensagens: 1.531
Re: PIC e DAC TLV5618A
« Responder #10 em: 17 de Março de 2012, 23:20 »
Já funciona ;)

Obrigado pela ajuda!
« Última modificação: 17 de Março de 2012, 23:31 por beirao »
"O único lugar onde o sucesso vem antes do trabalho, é no dicionário" - Albert Einstein