Skocz do zawartości

ADXL345 SPI brak sensownych wskazan


20rafalo

Pomocna odpowiedź

Witam

skonfigurowałem wstępnie adxl345, jednak wyniki są błędne. Czy ruszam akcelerometrem czy ie pokazuje jakieś wartości na wyświetlaczu lcd.

Mój sprzęt to: Atmega16A 1Mhz (testowane również na 8Mhz). Wyświetlacz LCD, ADXL345.

W programie część na pewno jest dobrze napisana, gdyż jak zmienię szybkość SPI to na wyświetlaczu szybciej wyświetlają się domyślnie dane. Jednak nie wiem czy dobrze ustawiłem Master/slave.

ADXL345 jest na gotowej płytce i wygląda na to, że to on jest master. Sam już nie wiem....

Oto kod:

[code]
/*main.c
*
*  Created on: 05-11-2012
*      Author: Rafal
*  *
*                 ________
*    XCK/T0 PB0 -|1     40|-PA0 ADC0
*    TI     PB1 -|2     39|-PA1 LCD_RS
* INT2/ANIO PB2 -|3     38|-PA2 LCD_RW
* OC0/AIN1  PB3 -|4     37|-PA3 LCD_E
*akc:   SS  PB4 -|5     36|-PA4 LCD_D4
*akc:  MOS  PB5 -|6     35|-PA5 LCD_D5
*akc:  MISO PB6 -|7     34|-PA6 LCD_D6
*akc:   SCK PB7 -|8     33|-PA7 LCD_D7
*         RESET -|9     32|-AREF
*         VCC   -|10    31|-GND
*          GND  -|11    30|-AVCC
*        XTAL2  -|12    29|-PC7
*        XTAL1  -|13    28|-PC6
*           PD0 -|14    27|-PC5
*           PD1 -|15    26|-PC4
*           PD2 -|16    25|-PC3
*           PD3 -|17    24|-PC2
*           PD4 -|18    23|-PC1
*           PD5 -|19    22|-PC0
*           PD0 -|20    21|-PD7
*                 --------
*/
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include<avr/io.h>
#include "lcd44780.h"
////-------------------dla LCD--------------------------------------------
#define EEMEM __attribute__((section(".eeprom")))
//----------------------------------------------------------------------------
#define RANGE_2G   0
#define MEASURE      (1<<3)
#define DEVID       0x00
#define DATA_FORMAT  0x31//Data format control;SPI, int_invert,range
#define DATAX0      0x32
#define DATAX1      0x33
#define DATAY0      0x34
#define DATAY1      0x35
#define DATAZ0      0x36
#define DATAZ1      0x37
#define FIFO_CTL    0x38//trigger, samples (D4,D3)
#define POWER_CTL   0x2D//Power Save features control;wakeup,measure,autosleep
#define BW_RATE     0x2C//BW_RATE (read/write)
#define SPEED       0x0F // Buffer Speed - 3200Hz; DODANE!!!!!!!!!!!!!!!!!!!!!!!!
#define MOSI PB5
#define MISO PB6
#define SCK PB7
#define SS PB4
#define ADXL_ON()   PORTB &= ~(1<<SS) //CS dla ADXL
#define ADXL_OFF()  PORTB |= (1<<SS)
//--------lcd----------
char PROGMEM tab1[] = {"Akcel"};
char PROGMEM tabXh[] = {"Xh= "};
char PROGMEM tabXl[] = {"Xl= "};
char PROGMEM tabYh[] = {"Yh= "};
char PROGMEM tabYl[] = {"Yl= "};
char PROGMEM tabZh[] = {"Zh= "};
char PROGMEM tabZl[] = {"Zl= "};
uint16_t a;
//------END-lcd------
//-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
//"MASTER
void ADXL_write(uint8_t byte_addres, uint8_t data) {  //zapis do ADXL345 - 8bit adresu i 8bit danych
 ADXL_ON();
 SPDR = byte_addres;
 while(!(SPSR & (1<<SPIF)));//wait for set flags SPIF in register SPSR
 SPDR = data;//this write my? byte
 while(!(SPSR & (1<<SPIF)));
 ADXL_OFF();
}
uint8_t ADXL_read(uint8_t byte_addres)
{// odczyt od ADXL345 - 128+adres, zwraca 8 bit  danych

 ADXL_ON();
 SPDR = 0x08 | byte_addres;//The Master may continue to shift
 	  	  	  	  	  	  //the next byte by writing it into SPDR
while(!(SPSR & (1<<SPIF)));//loop_until_bit_is_set(SPSR, SPIF);
 ADXL_OFF();
 return SPDR;
}
void SPI_INICIAL(void) //ustawia SPI w tryb MASTER;by RM
{
//set otut MOSI SCK CS
DDRB |=(1<<MOSI)|(1<<SCK)|(1<<SS);
PORTB |=(1<<SCK);
//active SPI, Master;
//CPOL = 1, CPHA = 1 Setup (Falling edge) Sample (Rising
///* Enable SPI, Master, set clock rate fck/64;=16 */
SPCR = ((1<<SPE) | (1<<MSTR) | (1<<SPR0) |(1<<SPR1));// | (1<<CPOL) | (1<<CPHA);
}
void ADXL_INICIAL() {   //wysyla konfiguracje do ADXL345
 ADXL_write(POWER_CTL, 0);
 ADXL_write(DATA_FORMAT,0x7F);// RANGE_2G);
 ADXL_write(BW_RATE, SPEED);//v2 data rate
 ADXL_write(POWER_CTL, 0x08); //MEASURE);//v1 (MEASURE, SLEEP,WAKEUP D0, LINK)

}


//-----------------------------------------------------------------------------
//------------MAIN--------MAIN------MAIN--------MAIN------MAIN--------MAIN------
//-----------------------------------------------------------------------------
int main (void)
{
//-----------------------------------------------------
//--------------------LCD-----------------------------
//-----------------------------------------------------
   lcd_init();//inicjalizacja LCD (załadowanie niezbędnych funkcji
 	lcd_locate(0,0);
 	lcd_str("Wita");			
//-----------------------------------------------------
//----------------END LCD-----------------------------
//-----------------------------------------------------

 volatile uint8_t Dataxh=0, Dataxl=0, Datayh=0, Datayl=0, Datazh=0, Datazl=0;
 volatile uint16_t Dataxhloop=0, Dataxlloop=0, Datayhloop=0, Dataylloop=0, Datazhloop=0, Datazlloop=0;

 SPI_INICIAL();//
 _delay_ms(1000);//

 ADXL_INICIAL();//
 _delay_ms(1000);

 sei();

 while(1) {
////////////////////////////////////////////////

      Dataxhloop = ADXL_read(DATAX1);
	  Dataxlloop = ADXL_read(DATAX0);
      Datayhloop = ADXL_read(DATAY1);
      Dataylloop = ADXL_read(DATAY0);
      Datazhloop = ADXL_read(DATAZ1);
      Datazlloop = ADXL_read(DATAZ0);


  lcd_locate(0,0);
  lcd_str_P(tab1);
  _delay_ms(150);

   lcd_locate(1,0);
   lcd_str_P(tabXh);
   lcd_locate(1,4);//
   lcd_int(Dataxhloop);
   lcd_locate(1,8);
   lcd_str_P(tabXl);
   lcd_locate(1,12);//
   lcd_int(Dataxlloop);

   lcd_locate(2,0);
   lcd_str_P(tabYh);
   lcd_locate(2,4);//
   lcd_int(Datayhloop);
   lcd_locate(2,8);
   lcd_str_P(tabYl);
   lcd_locate(2,12);//
   lcd_int(Dataylloop);

   lcd_locate(3,0);
   lcd_str_P(tabZh);
   lcd_locate(3,4);//
   lcd_int(Datazhloop);
   lcd_locate(3,8);
   lcd_str_P(tabZl);
   lcd_locate(3,12);//
   lcd_int(Datazlloop);

  }


 return (0);
}

[/code]

Oto schemat akcelerometru

Dodam, że podłączenie SDO akcelerometru do MISO Atmegi skutkuje zatrzymaniem programu. CD akcelerometru do SS Atmegi. Nie podłączyłem żadnych przerwań.

Wiem, że to forum jest jedno z lepszych i ktoś się znajdzie, kto znajdzie błąd 😉.

Pozdrawiam i życzę miłego wieczoru.

Link do komentarza
Share on other sites

Ze schematu wynika ze 3 wire musi być. Zmieniłem tylko R4 (widać na schemacie)na 10K, bo 0ohm nie zbyt bezpiecznie, jesli np bym podlaczyl do AVR a tam byla by "1" logiczne ;/

Chcę aby ADXL wskazywal mi małe odchylenia- czyli 2g.

Ja na razie to ciągle jest 55-> 255->55-> 255->125-->>55-> 255 ->615->..., czasem na inną wartość -> a nawet ADLX345 nie dotykam. Najgorsze jest to, że jeśli odłączę ADXL345 od Atmegi to dalej wyświetla te same liczby ;/ Nawet po resecie ;/

Jak ruszę ADXL to tak jak by coś jeszcze innego wyświetlało ale nawet nie zdążę odczytać-chyba 615 i 1xx- nie ważne jak mocno odchylę. Czyli reasumując jakieś śmieci ;/

Nie załączyłem na forum biblioteki z wyświetlaczem bo on działa dobrze. Napisy ładnie wyświetla.

ADXL podłączony do +5V- płytka ma układ dodatkowy, który to umożliwia.

Czy nie muszę mieć ustawianego przerwania z ADXL?

Jak byś mógł wstępnie sprawdzić czy moje deklaracje i postępowanie w kodzie w/w jest ok.

Na razie chcę po prostu "coś" mierzyć- aby liczby sensownie się wyświetlały w zależności od wychylenia, dopiero potem będę je jakoś konwertował i wykorzystywał dalej...

Z góry dzięki za odpowiedź...

[ Dodano: 07-12-2012, 23:23 ]

Po odpięciu przewodu programatora od płytki stykowej (był sam przewód podpięty do Atmegi) układ przestał szaleć. Wartości jakie wyświetla się to: Xh 59; Xl 58;Yh 61;Yl 60; Zh 63 Zl 62.

Jeśli podepnę linię SDO do MISO Atmegi i zresetuję -> pojawiają się same zera. ADXL nic nie wysyła mimo poruszania ;/

[ Dodano: 07-12-2012, 23:43 ]

Dodam, że jak Miso podłącze do masy to są zera na wyświetlaczu, jak to +5V to same 255.

A ze schematu, który otrzymałem wraz z ADXL wynikało, że pod SDO nie trzeba nic podłączać.

Sprawdziłem jeszcze takie kombinacje: SDA ->MISO, SDO-> MOSI; SDO-> MISO, SDA ->MOSI. Jednak żadna z tych opcji nie sprawiły, że ADXL zaczął mierzyć. Jedynie podawanie jakiejś wartości napięcia na MISO wpływa na wskazania wyświetlacza

Link do komentarza
Share on other sites

Tak rzuciłem oko na ten schemat.. widzisz ten rezystor R4 o wartości 0ohm na płytce? Z nim żadna komunikacja nie jest możliwa, bo on ściąga SDO zawsze do zera?

Druga sprawa to takie działania jak Ty opisujesz (losowe liczby nawet po odłączeniu czujnika) sugerują, że czujnik nie ustawia żadnych sensownych wartości na pinach i piny ustawiają się na jakieś losowe śmieci pojawiające się na ścieżkach.

Kilka rzeczy do sprawdzenia:

1. Czy mikrokontroler jest dobrze przylutowany i ma dobrze skonfigurowane piny? Ściągnij rezystorem 1k wejście sygnału w mikrokontrolerze do GN i sprawdź czy teraz ostajesz same zera.

Sprawdź też miernikiem czy na wyjściu SPI mikrokontrolera (zegarowym i z danymi) pojawia się zmiana ppziomów podczas wysyłania danych.

2. Sprawdź przynajmniej wizualnie czy ADXL345 jest dobrze przylutowany

3. Sprawdź czy masz poprawny stan na pinie CS - czyli czy ADXL wchodzi w tryb SPU.

To tak kilka pomysłów na szybko przed snem... 🙂

PS. Po Twoich dodatkowych informacjach widzę, że robisz postępy. Patrz tylko początek mojego postu -> wylutuj rezystor R4 o wartości 0 Ohm z płytki i powinno śmigać.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

wylutuj rezystor R4 o wartości 0 Ohm z płytki i powinno śmigać.

Napisałem, że go wylutowałem bo "biedziłem" się tydzien z tym rezystorem ufając firmie, która sprzedała mi gotowy ADXL345 na tej płytce co Ci podesłałem- takie moduły sprzedają na znanym serwisie. Za R4 dałem 10k. Czy wywalic go całkowicie?

Pracuję na płytce stykowej. Tylko ADXL jest polutowany zgodnie ze schematem w/w przez firmę. Przewody ADXL->ATMega jakieś 15cm...

Zauważyłem, że MISO od Atmegi nie musi być w ogóle używane w tym zestawieniu- mam racje?

Jak podłączyć ADXL z Atmegą, żeby być pewnym, że jest ok?

Z góry dzięki

[ Dodano: 08-12-2012, 00:10 ]

Teraz podłączyłem tak:

atMEGA -> adxl

SCK -> CS SCL

MOSI -> SDA

MISO -> SDO

PB4(SS) -> CS

Zasilanie +5V

Po resecie są same ZERA - co bym nie robił.

ADXL nic nie wysyła??

[ Dodano: 08-12-2012, 00:13 ]

Ściągnij rezystorem 1k wejście sygnału w mikrokontrolerze do GN i

Dokładniej o jakie wejście chodzi?

Zaczynam robić pomiary. Dam opóźnienie 5sek w pętli głównej, aby nie uzyskiwać wartości średniej 😋

I być w stanie to odczytać 😋

VCC- 5,014V

RST 4,726V

SCK 0,016V

MISO 0V

MOSI 4,971V

PB4(SS) 4,968V

Napięcia SUPER stabilne.

Po zmianie ustawień SPCR na: SPCR = ((1<

Zmieniły się napięcia na:

SCK 4,966V

MOSI 0,022V

Poruwnując z wyświetlaczem LCD, który jest podlaczony do portu A- tam zmieniają się średnio o 0,1V- znaczy że coś się dzieje i ładnie wyświetla 😉

Link do komentarza
Share on other sites

Z racji, że na płytce z ADXL345 jest marnej jakości stabilizator- zamiast 3,3V daje 4,2V pokusiłem się o dodanie do układu 74HC244N i zasilić adxl napięciem 3,3V

Tak się zastanawiam jak go włączyć- zauważyłem że w buforze wg schematu kierunek danych jest jednostronny, a sygnały z porów MISO, MOSI są dwustronne.

Jakieś propozycje? 😋

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.