Witam.
Chciałem zrealizować sobie odczyt danych z akcelerometru po i2c, a następnie wyświetlenie ich na wyświetlaczu LCD. Część programu od LCD działa, niestety problem pojawia się przy odczycie z akcelerometru (a dokładniej to przed, bo jeszcze nawet nie doszedłem do końca początku
). W podręczniku opisane jest zapisanie odebranych danych do wskaźnika (tak mi się wydaje). Chciałem zmienić sobie to na zwykłą tablicę danych, żeby potem ładnie stworzyć sobie z tego zmienną i wrzucić ją na wyświetlacz. Jednak wyskakuje błąd przy linii
Kod:
while (len--) (bufor++) = TWI_read( len ? ACK : NACK );
o treści
../lcdmain.c:147: error: lvalue required as left operand of assignment
Oczywiście przy zachowaniu *buf zamiast 'bufor' wszystko się kompiluje, ale nie wiem co z tym dalej zrobic
Wszystkie kody są na podstawie Pana książki (po dzikiej edycji w czasie testowania różnych wariantów, przepraszam za chaos;))
oto kod programu:
Kod:
/*
* main.c
*
* Created on: 2010-03-31
* Autor: Miros3aw Kardao
*/
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include "LCD/lcd44780.h"
#define ACK 1
#define NACK 0
//#define SLA 0x3A
//#define adr 0x32
//#include "twi.h"
// poni?sz1 linijke czasami trzeba wpisaa w eclipse przed definicjami
// zmiennych w pamieci EEPROM, ?eby nie podkreola3 sk3adni jako b3ednej
#define EEMEM __attribute__((section(".eeprom")))
//char PROGMEM tab1[] = {"tekst1"};
//char EEMEM tab2[] = {"tekst2"};
uint8_t znak_L[] = {16,16,18,20,24,16,31,0}; // wzór znaku litery L w pamieci RAM
uint8_t znak_o[] EEMEM = {4,32,14,17,17,17,14,0}; // wzór znaku litery ó w pamieci EEPROM
uint8_t znak_buzka[] PROGMEM = {14,17,27,17,17,21,17,14}; // wzór znaku buYki w pamieci FLASH
uint8_t znak_termo[] PROGMEM = {4,10,10,10,17,31,31,14}; // wzór znaku termometru w pamieci FLASH
volatile uint8_t pwm1, pwm2, pwm3;
int main(void)
{
DDRD |= (1<<PD0);
PORTD |= (1<<PD0);
lcd_init();
uint8_t bufor [6]; // <==================================== czy tak można?
TWI_read_buf(0x3A, 0x32, 6, bufor);
// lcd_str_P(tab1); // napis z pamieci FLASH
// lcd_locate(0,10); //pierwsza cyfra to rzad, druga to nr kolumny startujacej!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// lcd_str_P( PSTR("x") ); // napis z pamieci FLASH
// lcd_locate(1,0);
// lcd_str_E(tab2); // napis z pamieci EEPROM
lcd_locate(1,0);
lcd_str("x"); // napis z pamieci RAM,
// lcd_locate(0,0);
// lcd_str("dsds");
// za3adowanie znaków do pamieci CGRAM
lcd_defchar(0x80, znak_L);
lcd_defchar_E(0x81, znak_o);
lcd_defchar_P(0x82, znak_buzka);
lcd_defchar_P(0x83, znak_termo);
// wyowietlenie w3asnych znaków na LCD
lcd_locate(0,7);
lcd_str("\x80\x81");
lcd_locate(1,8);
lcd_str("\x82");
lcd_locate(1,7);
lcd_str("\x83");
while(1);
}
void i2cSetBitrate(uint16_t bitrateKHz) {
uint8_t bitrate_div;
bitrate_div = ((F_CPU/1000l)/bitrateKHz);
if(bitrate_div >= 16)
bitrate_div = (bitrate_div-16)/2;
TWBR = bitrate_div;
}
void TWI_start(void) {
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTA);
while (!(TWCR&(1<<TWINT)));
}
void TWI_stop(void) {
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
while ( !(TWCR&(1<<TWSTO)));
}
void TWI_write(uint8_t bajt) {
TWDR = bajt;
TWCR = (1<<TWINT)|(1<<TWEN);
while ( !(TWCR&(1<<TWINT)));
}
uint8_t TWI_read(uint8_t ack) {
TWCR = (1<<TWINT)|(ack<<TWEA)|(1<<TWEN);
while ( !(TWCR & (1<<TWINT)));
return TWDR;
}
void TWI_write_buf( uint8_t SLA, uint8_t adr, uint8_t len, uint8_t bufor )
{
TWI_start();
TWI_write(SLA);
TWI_write(adr);
while (len--) TWI_write(bufor++);
TWI_stop();
}
void TWI_read_buf(uint8_t SLA, uint8_t adr, uint8_t len, uint8_t bufor) {
TWI_start();
TWI_write(SLA); // adres ukladu slave 0x3A-zapis /0x3B-odczyt
TWI_write(adr); /// przekazanie adresu adxl_datax,y,z
TWI_start();
TWI_write(SLA + 1); // ponowny start (repeated start)
while (len--) bufor++ = TWI_read( len ? ACK : NACK );
TWI_stop();
}