ATMega16 при посылке STOP в конце пакета, STOP реально в шину проходит, а вот бит TWSTO в регистре TWCR автоматически не снимается, что должно быть. Не возможно программно отловить, что STOP выполнен. (задержку не предлагать.)
Может в позднем протеусе пойдет? кто может, проверьте, плиз.
проект в AVRStudio прикладываю, там же и файлик протеуса.
Код:
|
int main(void){
DDRA=255;
DDRC=0b00000000;
PORTC=0b00000011;
TWBR=32;
TWCR=(1‹‹TWINT)|(1‹‹TWSTA)|(1‹‹TWEN); // даем START в шину
while (!(TWCR & (1‹‹TWINT))){}; // ждем выполнения STARTa
TWDR=DS1307_ADR;
TWCR=(1‹‹TWINT)|(1‹‹TWEN); // даем адрес устройства
while (!(TWCR & (1‹‹TWINT))){}; // ждем выполнения
TWDR=0x07;
TWCR=(1‹‹TWINT)|(1‹‹TWEN); // даем адрес памяти
while (!(TWCR & (1‹‹TWINT))){}; // ждем выполнения
TWDR=0b00010000;
TWCR=(1‹‹TWINT)|(1‹‹TWEN); // даем данные в память
while (!(TWCR & (1‹‹TWINT))){}; // ждем выполнения
TWCR=(1‹‹TWINT)|(1‹‹TWSTO)|(1‹‹TWEN)|(1‹‹TWIE); // даем STOP
while (TWCR & (1‹‹TWSTO)){}; // ждем выполнения STOPa
// ждать можно бесконечно, в PROTEUSe бит TWSTO автоматом не сбрасывается после выполнения STOP.
TWCR=(1‹‹TWINT)|(1‹‹TWSTA)|(1‹‹TWEN)|(1‹‹TWIE); // даем START в шину
while (1){PORTA=0x55; PORTA=0xAA;} // дергаем лапками
} |