Witam
Nie potrafię nawiązać komunikacji pomiędzy w/w układami.
Mam taki kod ale na wyświetlaczu ciągle dostaje 'ff' zamiast wartości którą wpisuje '02'
#include <avr/io.h>
#include <util/delay.h>
#include "hd44780.h"
#include <stdio.h>
//********************************************definicje SPI**********************************************
#ifndef SPI_H
#define SPI_H
#ifdef __AVR_ATmega8515__
#define SPI_PORT PORTB
#define SPI_DDR DDRB
//PINS
#define SCK_POS PB7
#define MISO_POS PB6
#define MOSI_POS PB5
#define SS_POS PB4
#endif
//SS : Slave Select
//#define SS_PORT PORTB
//#define SS_DDR DDRB
//#define SS_POS PB4
#define SS_HIGH() SPI_PORT|=(1<<SS_POS)
#define SS_LOW() SPI_PORT&=(~(1<<SS_POS))
void SPIInit(void);
void spi_start(void);
void spi_end(void);
void spi_tx(unsigned char data);
unsigned char spi_rx(void);
void ade7763_write_to_reg( char adres, char wartosc );
unsigned char ade7763_read_from_reg( char adres);
#endif
//*********************************************************************************************************************
char str[32]="ADE7763 TEST";
int main(void)
{
SPIInit();
lcd_init();
LCD_DISPLAY(LCDDISPLAY);
LCD_CLEAR;
LCD_LOCATE(1,0);
lcd_puts(str);
while(1)
{
unsigned char wynik;
ade7763_write_to_reg(0x13,0x02); //wysyłam na adres 0x13 wartość 0x02
wynik = ade7763_read_from_reg(0x13); //powinienem dostac wartosc 0x02 z adresu 0x13 ale mam na lcd FF
itoa( wynik, str, 16);
LCD_LOCATE(6,1);
lcd_puts(str);
}
}
void ade7763_write_to_reg( char adres, char wartosc )
{
spi_start();
adres = (adres+0x80); // zapisuje najpierw adres pozniej wartosc
spi_tx(adres); //adres do wpisania
_delay_us(0.05);
spi_tx(wartosc); //wartosc zapisywana do rejestru
spi_end();
}
unsigned char ade7763_read_from_reg( char adres)
{
unsigned char wartoscrej;
spi_start();
adres = (adres+0x00); // zapisuje najpierw adres pozniej wartosc
_delay_us(4) ; //t9=4czeka dopoki adres sie zaladuje
wartoscrej= spi_rx();
return wartoscrej;
}
void SPIInit()
{
//Set up SPI I/O Ports
SPI_DDR|=((1<<MOSI_POS)|(1<<SCK_POS)| (1 << SS_POS));
SPCR|=(1<<SPE)|(1<<MSTR)|(1<<CPHA)|(1<<SPR1)|(1<<SPR0); //f=f/128
}
void spi_tx(unsigned char data)
{
/* Start transmission */
SPDR = data;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)));
return;
}
unsigned int fikcja;
unsigned char spi_rx(void)
{
//wysyla fikcyjna wartosc
SPDR = fikcja;
/* Wait for reception complete */
while(!(SPSR & (1<<SPIF)));
/* Return data register */
return SPDR;
}
void spi_start(void)
{
spi_end(); //czeka na zakonczenie poprzedniej sesji
SS_LOW(); //ustawia SS na niski poziom
return;
}
void spi_end(void)
{
SS_HIGH(); //ustawia SS na wysoki poziom
return;
}
Nie potrafię nawiązać komunikacji pomiędzy w/w układami.
Mam taki kod ale na wyświetlaczu ciągle dostaje 'ff' zamiast wartości którą wpisuje '02'
#include <avr/io.h>
#include <util/delay.h>
#include "hd44780.h"
#include <stdio.h>
//********************************************definicje SPI**********************************************
#ifndef SPI_H
#define SPI_H
#ifdef __AVR_ATmega8515__
#define SPI_PORT PORTB
#define SPI_DDR DDRB
//PINS
#define SCK_POS PB7
#define MISO_POS PB6
#define MOSI_POS PB5
#define SS_POS PB4
#endif
//SS : Slave Select
//#define SS_PORT PORTB
//#define SS_DDR DDRB
//#define SS_POS PB4
#define SS_HIGH() SPI_PORT|=(1<<SS_POS)
#define SS_LOW() SPI_PORT&=(~(1<<SS_POS))
void SPIInit(void);
void spi_start(void);
void spi_end(void);
void spi_tx(unsigned char data);
unsigned char spi_rx(void);
void ade7763_write_to_reg( char adres, char wartosc );
unsigned char ade7763_read_from_reg( char adres);
#endif
//*********************************************************************************************************************
char str[32]="ADE7763 TEST";
int main(void)
{
SPIInit();
lcd_init();
LCD_DISPLAY(LCDDISPLAY);
LCD_CLEAR;
LCD_LOCATE(1,0);
lcd_puts(str);
while(1)
{
unsigned char wynik;
ade7763_write_to_reg(0x13,0x02); //wysyłam na adres 0x13 wartość 0x02
wynik = ade7763_read_from_reg(0x13); //powinienem dostac wartosc 0x02 z adresu 0x13 ale mam na lcd FF
itoa( wynik, str, 16);
LCD_LOCATE(6,1);
lcd_puts(str);
}
}
void ade7763_write_to_reg( char adres, char wartosc )
{
spi_start();
adres = (adres+0x80); // zapisuje najpierw adres pozniej wartosc
spi_tx(adres); //adres do wpisania
_delay_us(0.05);
spi_tx(wartosc); //wartosc zapisywana do rejestru
spi_end();
}
unsigned char ade7763_read_from_reg( char adres)
{
unsigned char wartoscrej;
spi_start();
adres = (adres+0x00); // zapisuje najpierw adres pozniej wartosc
_delay_us(4) ; //t9=4czeka dopoki adres sie zaladuje
wartoscrej= spi_rx();
return wartoscrej;
}
void SPIInit()
{
//Set up SPI I/O Ports
SPI_DDR|=((1<<MOSI_POS)|(1<<SCK_POS)| (1 << SS_POS));
SPCR|=(1<<SPE)|(1<<MSTR)|(1<<CPHA)|(1<<SPR1)|(1<<SPR0); //f=f/128
}
void spi_tx(unsigned char data)
{
/* Start transmission */
SPDR = data;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)));
return;
}
unsigned int fikcja;
unsigned char spi_rx(void)
{
//wysyla fikcyjna wartosc
SPDR = fikcja;
/* Wait for reception complete */
while(!(SPSR & (1<<SPIF)));
/* Return data register */
return SPDR;
}
void spi_start(void)
{
spi_end(); //czeka na zakonczenie poprzedniej sesji
SS_LOW(); //ustawia SS na niski poziom
return;
}
void spi_end(void)
{
SS_HIGH(); //ustawia SS na wysoki poziom
return;
}