Witam
Wiem że to śmieszne ale nie potrafię sobie poradzić z odczytem danych z układu MAX1288. Napisałem procedurę która powinna inicjować układ i przeprowadzić odczyt z układu łącznie ze zlepieniem dwóch bajtów w 16bitów i zwróceniem tej wartości do głównego programu. Ale jak to zwykle w życiu bywa nie bardzo chce to działać.
Tu pdf do układu:
http://datasheets.maxim-ic.com/en/ds/MAX1286-MAX1289.pdf
Układ ma mierzyć napięcie z jednego wejścia i wyświetlać na LCD. Wszystko oparte jest na atmedze 32 z zegarem 4MHz.
Byłbym bardzo wdzięczny za wszelkie sugestie co skopałem.
Wiem że to śmieszne ale nie potrafię sobie poradzić z odczytem danych z układu MAX1288. Napisałem procedurę która powinna inicjować układ i przeprowadzić odczyt z układu łącznie ze zlepieniem dwóch bajtów w 16bitów i zwróceniem tej wartości do głównego programu. Ale jak to zwykle w życiu bywa nie bardzo chce to działać.
Tu pdf do układu:
http://datasheets.maxim-ic.com/en/ds/MAX1286-MAX1289.pdf
Układ ma mierzyć napięcie z jednego wejścia i wyświetlać na LCD. Wszystko oparte jest na atmedze 32 z zegarem 4MHz.
// DEFINICJE DLA SPI
#define CNVST_ON PORTB |= 0x08 ;
#define CNVST_OFF PORTB &= ~(0x08);
//----------------------------- ODCZYT Z AC ----------------------------------//
void spi_init(void) //inicjacja spi jako master, czestotliwosc 31250Hz
{
DDRB |= 0xB0; // Ustawienie SCK, MOSI & SS jako wyjsc
PORTB &= 0x5F; // wyzerowanie MOSI, & SCK
SPCR = 0x73; //konfiguracja rejestrow SPI
SPSR = 0x00;
}
int spi_odczyt(void)
{
char i = 0x00;
char pom_temp1 = 0x00;
char pom_temp2 = 0x00;
int wynik_ADC = 99; //zmienna 16 bit BEZ znaku dla wyyniku odczytu ???? moze powinna byc ze znakiem
//CNVST PB3
//DOUT MISO
//PORTA |= 0x80; // wlaczenie bitu 7 (msb)
//PORTA &= ~0x80; // wylaczenie bitu 7
//////// Start transmisji 1-ego bajtu
CNVST_ON; // ustawienie CNVST na "1"
for(i=0;i<6;i++) // przytrzymanie CNVST przez 1,4us
{
asm ("nop");
}
CNVST_OFF; // ustawienie CNVST na "0"
for(i=0;i<40;i++) // odczekanie na koniec konwersji i gotowosc do wyslania
{
asm ("nop");
}
SPDR = 0x00; // wlaczenie odbierania przez wpisanie wartosci do rejestru SPDR
while (!(SPSR & (1<<SPIF))); // Sprawdzenie flagi konca transmisji
pom_temp1 = SPDR; // zapisanie 1-ego bajtu
/////// Start transmisji 2-ego bajtu
CNVST_ON; // ustawienie CNVST na "1"
for(i=0;i<6;i++) // przytrzymanie CNVST przez 1,4us
{
asm ("nop");
}
CNVST_OFF; // ustawienie CNVST na "0"
for(i=0;i<40;i++) // odczekanie na koniec konwersji i gotowosc do wyslania
{
asm ("nop"); // dla zegara 1MHz 1us dla zegara 4MHz powinno byc 0,25us
}
SPDR = 0x00; // wlaczenie odbierania przez wpisanie wartosci do rejestru SPDR
while(!(SPSR & (1<<SPIF))); // Sprawdzenie flagi konca transmisji
pom_temp2 = SPDR; // zapisanie 2-ego bajtu
CNVST_ON; //ustawienie portu w stan wysoki zeby sie nie gryzl z drugim urzadzeniem
//wartosci testowe
//pom_temp1=0xFF; //MSB
//pom_temp2=0x00; //LSB
// scalenie MSB z LSB do jednej zmiennej 16 bitowej
wynik_ADC = pom_temp1;
wynik_ADC <<=8;
wynik_ADC |= pom_temp2;
//zerowanie trzech najstarszych bitow trzeba zrobic
return (wynik_ADC + 256); //zwracanie wartosci zmierzonej ?? dlaczego wartosc zerowa rowna jest -256??
}
//--------------------------- KONIEC ODCZYTU Z AC ----------------------------//Byłbym bardzo wdzięczny za wszelkie sugestie co skopałem.