Chciałbym zapytać, czy ktoś ma może procedurkę do obsługi takich pamięci dla C.
Mam WinAVR, w którym możemy znaleść przykład twitest.c.
Niestety, po skompilowaniu, zajmuje troszke za dużo, znacznie za dużo bo ok połowę pamięci kości.
Nawet po okrojeniu ze zbędnych rzeczy i tak dużo zajmuje.
Czy ma ktoś taką, która zajmuje niezbyt wiele? Czy w C jest na to szansa, czy pozostaje tylko ASM?
Dodano po 4 [godziny] 42 [minuty]:
Udało mi się dokonać zapisu do eeprom.
Mam problemy z odczytem Random Read
Procek się wiesza, nie wiem gdzie jest błąd.
i2c.c:
main.c:
Nie wiem gdzie błąd
Mam WinAVR, w którym możemy znaleść przykład twitest.c.
Niestety, po skompilowaniu, zajmuje troszke za dużo, znacznie za dużo bo ok połowę pamięci kości.
Nawet po okrojeniu ze zbędnych rzeczy i tak dużo zajmuje.
Czy ma ktoś taką, która zajmuje niezbyt wiele? Czy w C jest na to szansa, czy pozostaje tylko ASM?
Dodano po 4 [godziny] 42 [minuty]:
Udało mi się dokonać zapisu do eeprom.
Mam problemy z odczytem Random Read
Procek się wiesza, nie wiem gdzie jest błąd.
i2c.c:
void i2c_init (void)
{
TWBR = 0x10;
}
unsigned char i2c_start (void)
{
/*writing a one to TWINT clears it, TWSTA=Start, TWEN=TWI-enable*/
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
/*wait, until start condition has been sent --> ACK*/
while (!(TWCR & (1<<TWINT)));
return TWSR; }
void i2c_stop (void)
{
/*writing a one to TWINT clears it, TWSTO=Stop, TWEN=TWI-enable*/
TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN); }
unsigned char i2c_send (unsigned char send)
{
TWDR = send;
/*send content of TWDR*/
TWCR = (1<<TWINT) | (1<<TWEN);
/*wait, until address has been sent --> ACK*/
while (!(TWCR & (1<<TWINT)));
return TWSR; }
unsigned char i2c_read (unsigned char ack)
{
/*send content of TWDR; TWEA = enable ACK*/
TWCR = (1<<TWINT) | (ack<<TWEA) | (1<<TWEN);
/*wait, until byte has been received --> ACK*/
while (!(TWCR & (1<<TWINT)));
return TWDR; }
main.c:
#include <avr/io.h>
#define F_CPU 1000000
#include "inne.c" //<-Usart
#include "i2c.c" //Obsługa i2C
void main(void)
{
unsigned char k=10;
USART_Init(12);
i2c_start();
i2c_send(0b10100000);//<- adres fizyczy 00, 1 bit adresu słowa 0 + Write
i2c_send(0b00000000);//<- reszta adresu słowa, więc 1 znak w pamięci
i2c_start(); //<-powtóżony start
i2c_send(0b10100001);// <-Powtórzony adres fizyczny + Read
k=i2c_read(0);<-Tu się procek wiesza
i2c_stop();
USART_Transmit(k);
}
Nie wiem gdzie błąd