Podařilo se mi generovat start; ACK; NAK; stop, ale data které ukládám do promněné nejsou správná. Konkrétně data ukládaná do hodnota1, LCD nic nevypisuje. Data ukládaná do hodnota jsou správná čítají od 0 do 255 a pak přetečou. Dokonce i dle I2C dekoderu je to správně.
Poradí mi někdo, kde mám chybu?
Kód: Vybrať všetko
#define F_CPU 1000000
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <stdio.h>
#include "lcd.h"
#include <avr/eeprom.h>
#include <util/twi.h>
char text[20] = {0,}; // pocet charakteru na radku LCD
// inicializace I2C
void i2c_init()
{
TWBR = 0x62; // nastaveni frekvence I2C
TWCR = (1<<TWEN); //povoleni I2C
TWSR = 0x00; //preddelicka
}
//I2C start
void i2c_start()
{
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTA); // start
while (!(TWCR & (1<<TWINT))); // pockej dokud start nebude dokonceny
}
//I2C write
void i2c_write(char x)
{
TWDR = x;
TWCR = (1<<TWINT) | (1<< TWEN); // zapis hex hodnoty
while (!(TWCR & (1<<TWINT))); // pockej dokud zapis nebude dokonceny
}
//I2C read
int i2c_read()
{
TWCR=(1<<TWEN)|(1<<TWINT); // cti data a generuj NAK
while (!(TWCR & (1<<TWINT))); // pockej dokud cteni nebude dokonceny
return TWDR; // prectena hodnota
}
//I2C ack + read
int i2c_readack()
{
TWCR=(1<<TWEN)|(1<<TWINT)|(1<<TWEA); // cti data a generuj ACK
while (!(TWCR & (1<<TWINT))); // pockej dokud cteni nebude dokonceny
return TWDR; // prectena hodnota
}
// I2C stop
void i2c_stop()
{
TWCR=(1<<TWSTO)|(1<<TWINT)|(1<<TWEN); // generuj stop
while(TWCR&(1<<TWSTO)); // cekej na stop
}
int main (void) {
lcd_init(LCD_DISP_ON); // inicializace LCD
uint16_t hodnota; //promena pro ulozeni hodnoty
uint16_t hodnota1;
i2c_init(); // inicializace I2C
sei(); // povolení globálního přerušení
while(1){
i2c_start(); // start
i2c_write(0xD7); // zapis device code (1101), address bit(011), + write(1)
hodnota1=i2c_readack(); // precte data a generuje ACK
hodnota = i2c_read(); // precte data a generuje NAK
i2c_stop(); // stop
lcd_gotoxy(0,0);
sprintf(text,"");
lcd_puts(text);
sprintf(text,"h:%d ",hodnota);
lcd_puts(text);
lcd_gotoxy(0,1);
sprintf(text,"");
lcd_puts(text);
sprintf(text,"h1: ",hodnota1);
lcd_puts(text);
lcd_gotoxy(0,2);
sprintf(text,"");
lcd_puts(text);
sprintf(text,"line3");
lcd_puts(text);
lcd_gotoxy(0,3);
sprintf(text,"");
lcd_puts(text);
sprintf(text,"line4");
lcd_puts(text);
}
}