Search the Community
Showing results for tags 'TWI'.
-
Здравствуйте! Пишу программу на C++ для управления LCD (HD44780) по I2C через модуль расширения портов ввода/вывода PCF8574AT. void LCD_I2C::readBF() { transmitByte(0b00001110); //transmits E, RW set to HIGH and RS, set to LOW _delay_ms(5); transmitByte(0b00001010); //transmits E, RS set to LOW and RW set to HIGH _delay_ms(5); initRestart(); transmitAddrRW(0b01111111); //sends PCF8574AT address + SLA+R do { receiveDataAck(); PORTA = storage; } while((storage & (1 << BF)) != 0); //wait until BF is 0 initRestart(); transmitAddrRW(0b01111110); } Метод void transmitByte(uint8_t data) после инициализации состояния "Старт" и отправки адреса устройства + SLA+W отправляет байт данных по TWI с ожиданием бита подтверждения (команды работают верно, проверял по регистру статуса TWI - 0x08, 0x10 и 0x24). Метод void transmitAddrRW(uint8_t address) отправляет соответственно SLA+W/R + адрес устройства (команда работает также верно). Нареканий к работе TWI у меня нет, т.к. недавно с его помощью успешно запустил часы DS1307 с интеграцией LCD. После передачи запроса на чтение флага занятости инициализируется состояние "ПОВСТАРТ", отправляется адрес устройства + SLA+R, далее идет цикл - запрос байта данных (состояние выводов PCF8574AT) с отправкой бита подтверждения uint8_t receiveDataAck() (команды работают также верно, возвращает storage = TWDR) и вывод storage на порт А микроконтроллера (там установлены светодиоды). Чтение регистра данных TWDR после принятия байта данных (receiveDataAck()) дает следующий результат - 0b00000010 - установлен только бит RW микросхемы. Таким образом, флаг занятости BF = DB7 = 7й бит оказывается сразу же сброшенным, происходит мгновенный выход из цикла - контроллер дисплея не успевает скушать информацию, и инициализация не выполняется (неудачную инициализацию определяю по отсутствию курсора). Ожидалось, что флаг занятости будет установлен в единицу и произойдет несколько итераций перед выходом из цикла. При замене метода ожидания сброса флага занятости BF на программную задержку в 250 мс везде, где это требует datasheet - инициализация происходит успешно (появляется курсор, как и должно быть). Вопрос: что можно сделать, чтобы вместо _delay_ms(250) использовать readBF(), т.к. этот путь мне кажется более верным (уж очень не хочется использовать задержку .__.)? Возможно, проблема в микросхеме, которая неверно выдает информацию при чтении? (Имеется вторая микросхема, она вообще не работает:D) З.Ы. На фото виден результат чтения флага BF и Adress Counter - установлен только бит RW. З.Ы.Ы Кому интересно - вот функция main(). Повторюсь - проблема только в методе readBF(): void LCD_I2C::init() { setBitRate(20000); initStart(); transmitAddrRW(0b01111110); //send PCF8574AT address + SLA+W _delay_ms(60); sendInstruction(0b00110000); //function set 8-bit operation _delay_ms(20); sendInstruction(0b00110000); //function set 8-bit operation _delay_ms(5); sendInstruction(0b00110000); //function set 8-bit operation _delay_ms(5); sendInstruction(0b00100000); //function set 4-bit operation readBF(); //_delay_ms(250); //debug!! sendInstruction(0b00100000); //function set 4-bit operation, 2 lines, 5x8 dots sendInstruction(0b10000000); readBF(); //_delay_ms(250); //debug!! sendInstruction(0b00000000); //display off, cursor off, blinking off sendInstruction(0b10000000); readBF(); //_delay_ms(250); //debug!! sendInstruction(0b00000000); //display clear sendInstruction(0b00010000); readBF(); //_delay_ms(250); //debug!! sendInstruction(0b00000000); //entry mode set increment, display shift off sendInstruction(0b01100000); readBF(); //_delay_ms(250); //debug!! sendInstruction(0b00000000); //display on, cursor off, blinking off sendInstruction(0b11100000); readBF();/ }
-
помогите разобраться с кодом .(послать значение по шине TWI на ЦАП PCF8591) не работает в протеусе ... #define F_CPU 8000000UL #include <stdlib.h> #include <avr/io.h> #include <util/delay.h> //*** ИНИЦИАЛИЗАЦИЯ ШИНЫ TWI ***/ void TWI_Init(void) { // Установка тактовой частоты F_scl = 100 кГц TWBR =32; TWSR &= (~((1<<TWPS1)|(1<<TWPS0))); TWCR |= (1 << TWEN); // Разрешение работы TWI-модуля } /*** ЗАПУСК TWI ***/ void TWI_Start(void) { TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); while(!(TWCR & (1<<TWINT))); TWDR = 1001000; // передача адреса модуля PCF8591 в шину TWI TWCR=(1<<TWINT)|(1<<TWEN); while(!(TWCR & (1<<TWINT))); } /*** ОСТАНОВКА TWI ***/ void TWI_Stop(void) { TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); while(TWCR & (1<<TWSTO)); // Ожидание завершения передачи условия СТОП } /***ПЕРЕДАЧА ДАННЫХ В TWI***/ void TWI_WriteByte(uint8_t data) { TWDR = data; // Загрузка данных в TWDR TWCR=(1<<TWINT)|(1<<TWEN); while(!(TWCR & (1 << TWINT))); // Ожидание завершения передачи данных } /*** ПЕРЕДАТЬ ЗНАЧЕНИЕ В PCF8591 ***/ void PCF8591_get(void) { TWI_Start(); // Запуск TWI TWI_WriteByte(0x40); //включаем цап TWI_WriteByte(100); // запись в ЦАП значения 100 TWI_Stop(); // Остановить TWI } int main(void) { TWI_Init(); while (1) { PCF8591_get; _delay_ms(50); } }
-
привет! есть кто живой? всех с праздниками! пока ждал заказанных rtc, поигрался с разными часами в протеусе (1302, 1307, 8563). пользовался встроенными библиотеками кодвижона - все работает, все норм. разве что 8563 подключил с помощью либы "i2c" - рабоатает, но часы явно отстают. как я понял из-за того, что во встроенной i2c.h нет настройки частоты. вот решил попробовать эти часы запустить с библиотекой TWI.h из того же кодвижена, но вылазят ошибки, причем в местах, тупо скопированных из комментария либы по подключению. код добавил ниже, объясните, в чем ошибки? ОШИБКИ В КОММЕНТЫ ДОБАВИЛ /*--------------------------------------------------------------- pcf8563 test ---------------------------------------------------------------*/ #include <mega88pa.h> #include <pcf8563_twi.h> #define TWI_CLK_RATE 100000 #define MCU_FREQ_ 8000000 TWI_MASTER_INFO_t twi_master; // ЗДЕСЬ ВЫДАЕТ ОШИБКУ " '(' expected " !!! interrupt [TWI] void twi_master_isr(void) { twi_master_int_handler(&twi_master); // ОШИБКА " undefined symbol 'twi_master_int_handler' " } void main(void) { unsigned char day=1, month=1, hour=6, min=6, sec=6; int year=8; twi_init(&TWI0,TWI_SDASETUP_4CYC_gc,TWI_SDAHOLD_OFF_gc,false); // ОШИБКА " undefined symbol 'twi_init' " twi_master_init(&twi_master,&TWI0,TWI_BAUD_REG(MCU_FREQ_,TWI_CLK_RATE)); pcf8563_twi_init(&twi_master); #asm("sei") while(1) {} } чушь какая-то... особенно смущает, что про функции из "twi.h" (которая в этом проекте видится кодвижоном) компилятор пишет как про какие-то символы...
-
Добрый день. Пытаюсь сделать конвеер для аппаратного TWI модуля ATMega8. Контроллер в режиме мастера периодически работает с 4 разными устройствами на шине. LCD1602 висит также на шине I2C. Инициализация проходит информация на LCD выводится. Далее идёт процесс опроса времени с DS3231. Время передаётся но в конце при передаче СТОП на линию І2С. СТОП не проходит. Логический анализатор показывает на линии SCL - 1, SDA - 0. В регистре статуса F8. Ожидание ни к чему не приводит. Продолжение кода тоже. Как с этим бороться может кто сталкивался.
-
Здравствуйте! Имею в наличии 7-ми дюймовый экран от портативного DVD плеера. На фото ресивер на процессоре (чипе) mx88v462. В поисках в интернете для Arduino готовых библиотек не нашел. Но натолкнулся на странички на форуме, http://radiokot.ru/f...068630#p2068630 http://radiokot.ru/f...p?f=61&t=105858 Изначально не мог даже перенести библиотеки из Avr Studio в Arduino. На форуме, добрый человек помог, за что ему большое спасибо.. http://forum.amperka...иблиотеки.6538/ Код для Arduino: //не правильно работает mx88v462_2.zip Код для Avr Studio: //работает на Atmega16 MX88V462.zip Разница между проектами в том что разделен файл на *.cpp и *.h Но на Arduino код не работает, а точнее не совсем правильно, дисплей не инициализируется... Код для Avr точно рабочий, так как создал проект в Avr Studio для Atmega16, скомпилировал, получил hex файл, залил той же ArduinoЙ. MX88V462.zip И результат: Но проблема, перенесенная библиотека для Arduino не работает, дисплей не инициализируеться... Ресивер для дисплей работает по протоколу I2C. В проекте в Avr Studio реализован программный I2C, что и написано на форуме автора данной библиотеки. http://radiokot.ru/f...068630#p2068630 http://radiokot.ru/f...p?f=61&t=105858 В проекте для Arduino было опробовано и программный I2C и при помощи Wire. Но дисплей не инициализируется.. Потом в Proteus подключил Atmega328 и Atmega16. В Atmega328 залил hex файл скомпилированным в Aruino IDE // тот что не правильно работает В Atmega16 залил hex файл, тот с которым инициализировался дисплей и вывел текст. Подключил осциллограф к SDA SCL обеих микроконтроллеров. Chanel A - желтый -> SDA Atmega328 Chanel B - синий -> SCL Atmega328 Chanel C - красный -> SDA Atmega16 Chanel D - зеленый -> SCL Atmega16 И проблема в том, что сигналы не совпадают, скважность и сам сигнал. Частота кварцов выставлена одинаковая, 16M Видно что сам сигнал и скважность разная, думаю из за этого дисплей не инициализируется. При том что код почти одинаковый.. Пожалуйста, помогите решить данный вопрос, очень надо поднять данный дисплей... Буду очень благодарен.
-
- MX88V462
- Перенос библиотеки
-
(and 7 more)
Tagged with: