Witam
Mam procesor Atmega8535 i pamięć i2c PCF8582C (sprawna bo willem ją programuje i odczytuje)
napisałem następujący program który ma za zadanie wpisać do 255 adresów pamięci pewną daną np 0xff i przedstawić zapis i potem odczyt tych danych na LCD
LCD – działa jak powinien
dana nie jest ani zapisywana ani nie da się odczytać zawartości pamięci.
Może ktoś znajdzie błąd i mi pomoże bo męczę się z tym od 4 dni.
Dzięki za pomoc.
Mam procesor Atmega8535 i pamięć i2c PCF8582C (sprawna bo willem ją programuje i odczytuje)
napisałem następujący program który ma za zadanie wpisać do 255 adresów pamięci pewną daną np 0xff i przedstawić zapis i potem odczyt tych danych na LCD
LCD – działa jak powinien
dana nie jest ani zapisywana ani nie da się odczytać zawartości pamięci.
Może ktoś znajdzie błąd i mi pomoże bo męczę się z tym od 4 dni.
// Plik i2c.c
#define SDA 1
#define SCL 0
void waitms(unsigned long t)//ms
{
unsigned long t1;
for(;t>0;t--)
{
for(t1=27;t1!=0;t1--);
}
}
void wait10()
{
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
void i2c_start (void)
{
DDRC |= 1 << SDA;
DDRC |= 1 << SCL;
PORTC |= 1 << SDA;
PORTC |= 1 << SCL;
wait10();
PORTC &= ~1 << SDA;
wait10();
PORTC &= ~1 << SCL;
wait10();
}
void i2c_stop(void)
{
DDRC |= 1 << SDA;
DDRC |= 1 << SCL;
PORTC &= ~1 << SDA;
wait10();
PORTC |= 1 << SCL;
wait10();
PORTC |= 1 << SDA;
wait10();
}
unsigned char w_i2c (unsigned char dana)
{
DDRC |= 1 << SDA;
DDRC |= 1 << SCL;
unsigned char i;
i=8;
while(i)
{
--i;
if (dana&0x80)
{
PORTC |= 1 << SDA;
}
else
{
PORTC &= ~(1 << SDA);
}
wait10();
PORTC |= 1 << SCL;
wait10();
PORTC &= ~(1 << SCL);
wait10();
dana<<=1;
}
DDRC &= ~1 << SDA;
wait10();
PORTC |= 1 << SCL;
wait10();
i = (bit_is_set(PINC, PC1));
PORTC |= 1 << SCL;
wait10();
DDRC |= 1 << SDA;
return i;
}
unsigned char o_i2c (unsigned char potwierdzienie)
{
DDRC |= 1 << SDA;
DDRC |= 1 << SCL;
unsigned char i, dana;
dana = 0;
i = 8;
DDRC &= 1 << SDA;
while(i)
{
--i;
PORTC |= 1 << SCL;
wait10();
dana = dana | ((unsigned char) (bit_is_set(PINC, PC1)) << i );
PORTC &= ~1 << SCL;
wait10();
}
DDRC |= 1 << SDA;
if (potwierdzienie==1)
{
PORTC |= 1 << SDA;
}
else
{
PORTC &= ~1 << SDA;
}
wait10();
PORTC |= 1 << SCL;
wait10();
PORTC &= 1 << SCL;
wait10();
return dana;
}
#include "lcd4bit.c"
#include "i2c.c"
#include <avr/io.h>
int main(void)
{
int x, temp;
DDRB |= 1 << 0;
PORTB |= 1<< 0;
lcd_int();
lcd_clr();
write_text("Zapis do pam.");
for (x=0;x<254;x++)
{
lowerline();
i2c_start();
w_i2c(0xa0);
w_i2c(x);
w_i2c(0xff);
i2c_stop();
write_text("ADR "); write_x_hex(x);write_text(" 0x00");
_delay_ms(20);
}
lcd_clr();
write_text("Odczyt z pam.");
int dana=0;
for (x=0;x<254;x++)
{
lowerline();
i2c_start();
w_i2c(0xa0);
w_i2c(x);
i2c_start();
w_i2c(0xa1);
dana=o_i2c(1);
write_text("ADR ");write_x_hex(x);write_text(" = ");write_x_hex(dana);
i2c_stop();
_delay_ms(20);
}
write_text("koniec");
}
Dzięki za pomoc.