ATmega16 и 24С32

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
stepper88
Родился
Сообщения: 2
Зарегистрирован: Сб апр 03, 2010 18:03:15

ATmega16 и 24С32

Сообщение stepper88 »

Здравствуйте, господа!
Возникла у меня такая проблема - пытаюсь подключить 24C через TWI. Написал такую программу в CVAVR:

#include <mega16.h>

void init(void)
{
TWBR=0x0A;
TWAR=0x00;
TWCR=0x40;
TWSR=0x00;
DDRD=0xff;
PORTD=0;
}

void twi_start (void)
{
TWCR=0xE4; //формируем сигнал старта
while (!(TWCR & (1<<TWINT)));
TWCR=0<<5; //обнуляем бит TWSTA
while (!(TWCR & (1<<TWINT)));
}

void send_byte (char byte)
{
TWDR=byte;
TWCR=0xC4;
while (!(TWCR & (1<<TWINT)));
}

void start_tx (void)
{
send_byte(0xA0); //Настраиваем EEPROM на прием информации
}

void main (void)
{
init();
twi_start();
start_tx();
send_byte(0x00); //Посылаем первую половину адреса
send_byte(0x00); //Посылаем вторую половину адреса
send_byte(0x53); //Посылаем данные для записи
twi_start();
send_byte(0xA0); //Настраиваем устройство на запись
send_byte(0x00); //Первая половина адреса чтения
send_byte(0x00); //Вторая половина адреса чтения
twi_start(); //Рестарт
send_byte(0xA1); //Переводим EEPROM на выдачу информации
TWCR=0xC4;
while (!(TWCR & (1<<TWINT)));
PORTD=TWDR; //Выводим принятые данные на порт D
}

В процессе написания и параллельной отладки в Протеусе (6.9 SP4) обнаружил такие странности:
1. При отсылке байта с микроконтроллера почему-то никогда не приходит подтверждение (согласно регистру статуса, который так же выводил на порт, а даташит утверждает, что должны), но при этом сообщения о формировании старта воплне адекватные.
2. При чтении ячейки выдавалось 0xFF.
3. EEPROM указывал пустой файл - при отправке байта в него ничего не писалось.

Заранее благодарен за помощь.
С уважением Андрей
P.S. Смриншот со схемой прилагаю
Вложения
Schema.jpg
(182.75 КБ) 529 скачиваний
Реклама
Onkel
Открыл глаза
Сообщения: 68
Зарегистрирован: Вс июн 20, 2010 17:49:47

Re: ATmega16 и 24С32

Сообщение Onkel »

если уж тут atmega, 24 c b сode vision - никак не могу въехать, что делает в сv прерывание
interrupt [TWI] void twi_isr ( void )
интуитивно думал, что оно вызывается когда операция i2c аппаратного завершается (получен ankn и подобное)?
Написал код постраничной записи /чтения 24с, код работает, прерывание не вызывается. Дело в том, что мк есть другие дела, и ему некогда ждать 2-3 мс (время записи чтения от обращения до Стоп).
Теперь думаю, что прерывание это вызывается только когда общий колл или обращение к i2c м-контроллера как к слейву (ну адрес совпал)?
Даташит самого cv курил, там несколько строк и совершенно непонятно, что это прерывание делает. Из даташита к атмеге вроде следует, что мк может сгенерить прерывание, когда операция на i2c шине завершена - а тогда вопрос, как это прерывание добыть в CV?
Ну в крайнем случае конечно сделаю по службе таймеров - послал старт, ушел, вернулся через х мкс, посмотрел ответ, послал контрл байт, ушел, вернулся через у мкс, посмотрел ответ и т.д. - но хотелось бы попроще и как следствие понадежнее.
Фонтаны на Outlet Village Белая Дача, г Наро- Фоминск
Цех упаковки стройматериалов
Цех пиролиза покрышек с крекингом и ректификацией
Серийные приборы "Умный Дом" Uniel
Премия первой степени "Больше чем профессия" 2016 г
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»