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ý
[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