20rafalo Napisano Grudzień 7, 2012 Udostępnij Napisano Grudzień 7, 2012 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 More sharing options...
MirekCz Grudzień 7, 2012 Udostępnij Grudzień 7, 2012 1. ADXL345 zawsze jest slave 2. Jakieś wartości tzn jakie/ 3. Napisz dokładnie w jaki tryb chcesz ustawić ADXL. Link do komentarza Share on other sites More sharing options...
20rafalo Grudzień 7, 2012 Autor tematu Udostępnij Grudzień 7, 2012 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 More sharing options...
MirekCz Grudzień 7, 2012 Udostępnij Grudzień 7, 2012 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 More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
20rafalo Grudzień 7, 2012 Autor tematu Udostępnij Grudzień 7, 2012 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 More sharing options...
20rafalo Grudzień 14, 2012 Autor tematu Udostępnij Grudzień 14, 2012 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 More sharing options...
Mars Grudzień 14, 2012 Udostępnij Grudzień 14, 2012 http://www.rocketnumbernine.com/2009/04/10/5v-33v-bidirectional-level-converter Chyba taniej się nie da. Aczkolwiek nie sprawdzałem i nie analizowałem zasady działania. Pamiętam o tym na zasadzie "kiedyś się przyda" 😉 Link do komentarza Share on other sites More sharing options...
Harnas Grudzień 14, 2012 Udostępnij Grudzień 14, 2012 sygnały z porów MISO, MOSI są dwustronne Jesteś pewien? Link do komentarza Share on other sites More sharing options...
20rafalo Grudzień 15, 2012 Autor tematu Udostępnij Grudzień 15, 2012 Jesteś pewien? Na 99% 😋 W trybie 3 wire tak jest. MISO pracuje w obie strony. Wydaje mi się że program dobrze napisany.. chyba'P Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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ę »