Texas Instruments ADS1191 - problém s programovaním cez AVR

Ahojte,

mám problém so získavaním testovacích signálov z tohto EKG čipu. Zapisovanie do registrov funguje v pohode, ale pri snahe o získavanie korektných dát mi posiela späť chybné dáta.

Na programovanie spomínaného čipu využívam ATmega328p a AVR Dragon programér + Atmel Studio 6.0.

Ak by mi niekto vedel poradiť kde môže byť chyba budem mu veľmi vďačný :wink:

[code]
/*

  • Simplified_first_time.c
  • Created: 18. 12. 2014 18:28:00
  • Author: Kubo
    */

#include <avr/io.h>
#include <util/delay.h>
#include “spi.h”

//init PINs
#define MOSI_PIN 3
#define MISO_PIN 4
#define SCK_PIN 5
#define SS_PIN 2
#define RESET_PIN 6
#define DRDY_PIN 7
#define START_PIN 0

//ADS1191 SPI commands
#define ADS_CMD_WAKEUP 0x02
#define ADS_CMD_STANDBY 0x04
#define ADS_CMD_RESET 0x06
#define ADS_CMD_START 0x08
#define ADS_CMD_STOP 0x0A
#define ADS_CMD_OFFSETCAL 0x1A
//read commands
#define ADS_CMD_RDATAC 0x10
#define ADS_CMD_SDATAC 0x11
#define ADS_CMD_RDATA 0x12
//register commands
#define ADS_CMD_RREG 0x20
#define ADS_CMD_WREG 0x40

//ADS1191 command macros
#define ADS_wakeup() ADS_spi_send(ADS_CMD_WAKEUP)
#define ADS_standby() ADS_spi_send(ADS_CMD_STANDBY)
#define ADS_reset() ADS_spi_send(ADS_CMD_RESET)
#define ADS_start() ADS_spi_send(ADS_CMD_START)
#define ADS_stop() ADS_spi_send(ADS_CMD_STOP)
#define ADS_offsetcal() ADS_spi_send(ADS_CMD_OFFSETCAL)
#define ADS_rdatac() ADS_spi_send(ADS_CMD_RDATAC)
#define ADS_sdatac() ADS_spi_send(ADS_CMD_SDATAC)
#define ADS_rdata() ADS_spi_send(ADS_CMD_RDATA)

//ADS1194 register addresses
#define ADS_REG_ID 0x00
#define ADS_REG_CONFIG1 0x01
#define ADS_REG_CONFIG2 0x02
#define ADS_REG_LOFF 0x03
#define ADS_REG_CH1SET 0x04
#define ADS_REG_CH2SET 0x05
#define ADS_REG_RLD_SENS 0x06
#define ADS_REG_LOFF_SENS 0x07
#define ADS_REG_LOFF_STAT 0x08
#define ADS_REG_MISC1 0x09
#define ADS_REG_MISC2 0x0A
#define ADS_REG_GPIO 0x0B

//functions

void ADS_CSelect()
{
PORTB &= ~(1<<SS_PIN);
}

void ADS_de_CSelect()
{
PORTB|= (1<<SS_PIN);
}

uint8_t ADS_read_register(uint8_t address){
//spi_send(0x20 | (address&0x1F));
//ADS_CSelect();
spi_send(0x20 | address);
spi_send(0x00);
uint8_t ret = spi_send(0xff);
//ADS_de_CSelect();
return ret;
}

void ADS_write_register(uint8_t address, uint8_t value){
spi_send(0x40 | (address&0x1F));
spi_send(0x00);
spi_send(value);
}

uint8_t ADS_spi_send(uint8_t data){
//ADS_CSelect();
uint8_t ret = spi_send(data);
//ADS_de_CSelect();
return ret;
}

void USART_Init()
{
UCSR0B=(1<<RXEN0)|(1<<TXEN0); // enable USART Receiver and Transmitter
UCSR0C=(1<<UCSZ00)|(1<<UCSZ01); // set 8-bit form of data to receive and transmit + 1 stop bit
UBRR0=0; //0.5 MBaudov pri Fosc=8MHz
}
void USART_Transmit(unsigned int data)
{
//while((UCSR0A&(1<<UDRE0)) == 0b00100000 alebo 32=2^5) ako v IFe vysledky 2 - true or false, NETREBA PORROVNAVAT!!!
while(!(UCSR0A&(1<<UDRE0))) // kym bude 0- caka kym sa nevyprazdni buffer, akonahle 1 - buffer je prazdny
{
}
UDR0=data; // okamžite odošle
}

void ADS_Init()
{
spi_init();
ADS_de_CSelect();
PORTB &= ~(1<<RESET_PIN);
for (int k=0;k<10;k++)
{
_delay_ms(100); //RESET=1 for 1s
}
PORTB |= (1<<RESET_PIN); //POWERDOWN
_delay_ms(1);
PORTB &= ~(1<<RESET_PIN);
_delay_ms(1);
PORTB |= (1<<RESET_PIN);
_delay_ms(7);

ADS_CSelect();
ADS_sdatac();

_delay_ms(1);

}

int main(void)
{

ADS_Init();

ADS_write_register(ADS_REG_CONFIG1,0x02);
ADS_write_register(ADS_REG_CONFIG2,0xA3);
ADS_write_register(ADS_REG_CH1SET,0x05);
ADS_write_register(ADS_REG_CH2SET,0x05);
ADS_write_register(ADS_REG_MISC1,0x02);
ADS_write_register(ADS_REG_MISC2,0x82);
ADS_offsetcal();
_delay_ms(1); 
ADS_de_CSelect();
_delay_ms(5);
ADS_CSelect(); 
ADS_stop();
_delay_ms(5);
ADS_sdatac();
_delay_ms(5);
ADS_de_CSelect();
//_delay_ms(5);
//PORTB |= (1<<START_PIN);
//ADS_start();
_delay_ms(5);
//ADS_CSelect();  
PORTB |= (1<<START_PIN);
_delay_ms(10); 
ADS_CSelect(); 
//ADS_rdata();
ADS_rdatac();
_delay_ms(3);  
ADS_de_CSelect();
for (int k=0;k<10;k++)
{
	_delay_ms(100);             
}
ADS_CSelect();
_delay_ms(3);  
//while(!(PORTB&(1<<DRDY_PIN))) 
//{
	
	
	uint8_t Status1 = ADS_spi_send(0xff);
	uint8_t Status2 = ADS_spi_send(0xff);
	uint8_t MSB_CH1 = ADS_spi_send(0xff);
	uint8_t LSB_CH1 = ADS_spi_send(0xff);
	uint8_t MSB_CH2 = ADS_spi_send(0xff);
	uint8_t LSB_CH2 = ADS_spi_send(0xff);
	//uint8_t MSB_CH3 = ADS_spi_send(0xff);
	//uint8_t LSB_CH3 = ADS_spi_send(0xff);
//}
_delay_ms(1);
ADS_sdatac();
//ADS_stop();
_delay_ms(5);
ADS_de_CSelect();
//ADS_read_register(ADS_REG_CH2SET);
PORTC=0;

while(1)
{	

}

}[/code]

Díky moc :slight_smile: