Перейти к содержанию
    

melandr

Участник
  • Постов

    32
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о melandr

  • Звание
    Участник
    Участник
  1. Petka, добрый день. не знаю, читаете сейчас этот форум. решил продублировать свой вопрос, который задал на Радиокоте. А то смотрю особо помочь не может никто там. А почитал здесь форум, думаю что-то толковое подскажете. Вот вопрос: Вопрос возник по внутрисхемному программированию. На плате установлен микроконтроллер ATmega8A в корпусе TQFP32. Для программирования контроллера выведен разъем IDC6 2x3. Программатор AvrUsb500 by Petka подключается через вот такой переходник https://ru.aliexpress.com/item/2PCS-10P ... 0.0.j93YN3 Ну и вроде бы нормально все прошивалось. А сейчас резко перестало. Начал сначала грешить на программатор, заново его перепрошил. Все нормально. Теперь остается только проверить сам контакт в разъеме IDC6 либо что-то с линиями SPI. Вопрос вот в чем, что и как можно проверить при перепрошивке. Например, при нажатии кнопки "Считать сигнатуру" линия Ресет подтягивается к минусу. Также допусти какое напряжение должно быть на линиях SCK, MISO, MOSI при отключенном программаторе, потом при подключении программатора. Потому что мерю напряжение на этих линиях на плате с ATmega8 в ДИП-корпусе, все линии подтянуты к +5В. А измеряю напряжение на ATmega8 в СМД корпусе, напряжение на линия SPI где-то 0,7В. При подключении программатора напряжениеподнимается до 1,5....2,2 В. Сам микроконтроллер куплен на ebay. Он уже был прошит, то есть сказать что он не работал, не скажу. Может у кого-то уже были похожие траблы? И только что после многократных передергиваний разъема SPI и смещения его в по сторонам удалось считать сигнатуру и записать прошивку, правда верификация прошла с ошибкой, но на индикаторе устройства отобразилась информация. Может кто-то знает, допусти при прижатии РЕСЕТа к 0, как должен отвечать программируемый контроллер? Какие должны быть уровни напряжений на линии SPI без подключенного программатора, с подключенным программатором, в режиме чтения? PS: этим программатором пользуюсь давно. Обычно прошивал ATmega8, ATmega168, ATmega88 - в ДИП-корпусе, ATtiny2313, ATtiny4313 - в СМД. Проблем не было. А сейчас пытаюсь прошить ATmega8A-AU в TQFP и что-то не идет нормально.
  2. А в AVR Studio 5 final заявлена поддержка STK500, я вроде бы не видел.
  3. Наконец, добил я код для WinAVR. Вылаживаю его может кому сгодится. #include <avr/io.h> #include <util/delay.h> #include <avr/pgmspace.h> // Задание выводимой строки текста. char static_text[] PROGMEM = "Hello, world!"; // Задание регистров порта подключения ЖКИ-модуля. #define LCD_PORT PORTD #define LCD_DDR DDRD // Задание номера бита порта для вывода сигнала Е. #define LCD_E PD3 // Задание номера бита порта для вывода сигнала RS. #define LCD_RS PD2 // Задание номера бита порта для вывода сигнала RW #define LCD_RW PD1 //Задание регистров порта для светодиода #define LED_PORT PORTC #define LED_DDR DDRC //Задание номера бита порта для светодиода #define LED PC0 // Команда очистки экрана. #define CLEAR_COMMAND 0b00000001 // Команда возврата курсора на начальную позицию. #define HOME_COMMAND 0b00000010 // Команда выбора направления сдвига курсора и экрана: // инкремент счетчика адреса, // без сдвига изображения. #define EMS_COMMAND 0b00000110 // Команда выбора отображения: // изображение включено, // курсор в виде подчерка выключен, // курсор в виде мерцающего знакоместа выключен. #define DISPLAY_COMMAND 0b00001100 // Команда задания сдвига курсора или экрана. //#define SHIFT_COMMAND 0b0001xx-- // Команда инициализации и задания режима работы индикатора // для 8-разрядного режима работы шины данных: // 4-хразрядная шина данных. // Здесь тетрады переставлены местами для корректной работы // подпрограммы записи команды в ЖКИ-модуль. #define INIT_8_COMMAND 0b00000010 // Команда инициализации и задания режима работы индикатора: // использование двухстрочного режима отображения информации, // матрица 5х8 точек, // 4-хразрядная шина данных. #define INIT_COMMAND 0b00101000 // Команда задания адреса в CGRAM. #define CGRAM_COMMAND 0b01000000 // Команда задания адреса в DDRAM. #define DDRAM_COMMAND 0b10000000 // Смещение первого знакоместа второй строки. #define SECOND_ROW 0x40 // Количество одновременно отображаемых символов на ЖКИ. #define TOTAL_CHARS 16 // Длительность программных задержек. #define INIT_DELAY 50 #define INIT_CONTROL_DELAY 50 #define WAIT_LINE_DELAY 1 #define WRITE_DATA_DELAY 50 #define WRITE_DATA_LONG_DELAY 2000 // Переставляет тетрады в байте. unsigned char swap(unsigned char data) { asm( "swap %0": "=r" (data): "0" (data) ); return data; } // Определение задержки для формирования сигналов на линиях. #define lcd_wait_line() _delay_us(WAIT_LINE_DELAY) // Записывает данные в ЖКИ-модуль. void _lcd_write_data(unsigned char data) { unsigned char lsn; // Вывод данных на 4-хразрядную шину. // Получение и вывод старшей тетрады. lsn = LCD_PORT & 0x0F; LCD_PORT = (data & 0xF0) | lsn; // Установка стробирующего сигнала Е. LCD_PORT |=(1<<LCD_E); // Задержка сигнала на линии. lcd_wait_line(); // Снятие стробирующего сигнала Е. LCD_PORT &= ~(1<<LCD_E); // Задержка сигнала на линии. lcd_wait_line(); // Получение и вывод младшей тетрады. LCD_PORT = (swap(data) & 0xF0) | lsn; // Установка стробирующего сигнала Е. LCD_PORT |= (1<<LCD_E); // Задержка сигнала на линии. lcd_wait_line(); // Снятие стробирующего сигнала Е. LCD_PORT &= ~(1<<LCD_E); // Задержка сигнала на линии. lcd_wait_line(); // Формирование задержки для ожидания выполнения команды ЖКИ-модулем. if (!LCD_RS && (CLEAR_COMMAND == data || HOME_COMMAND == data)) { _delay_us(WRITE_DATA_LONG_DELAY); } else { _delay_us(WRITE_DATA_DELAY); } } // Записывает команду в регистр IR ЖКИ-модуля. void lcd_control(unsigned char control) { // Установка линии RS в низкое состояние - сигнал записи команды. LCD_PORT &= ~(1<<LCD_RS); // Задержка сигнала на линии. lcd_wait_line(); _lcd_write_data(control); } // Записывает команду в регистр IR ЖКИ-модуля при инициализации. void lcd_init_control(unsigned char control) { lcd_control(control); // Задержка при инициализации должна быть больше. _delay_ms(INIT_CONTROL_DELAY); } // Записывает символ в регистр DR ЖКИ-модуля. void lcd_putchar(unsigned char c) { // Установка линии RS в высокое состояние - сигнал записи данных. LCD_PORT |= (1<<LCD_RS); // Задержка сигнала на линии. lcd_wait_line(); _lcd_write_data©; } // Инициализирует ЖКИ-модуль. void lcd_init(void) { // Порт подключения ЖКИ-модуля работает на вывод. LCD_DDR |= 0b11111110; // Предварительная задержка. _delay_ms(INIT_DELAY); // Отправка команды инициализации для 8-разрядного режима работы шины // данных, переключение на 4-хразрядную шину. lcd_init_control(INIT_8_COMMAND); // Отправка команды инициализации уже для 4-хразрядного режима. lcd_init_control(INIT_COMMAND); // Повторная отправка команды инициализации. lcd_init_control(INIT_COMMAND); // Задание режима отображения. lcd_init_control(DISPLAY_COMMAND); // Очистка экрана. lcd_init_control(CLEAR_COMMAND); // Выбор направления сдвига курсора и экрана. lcd_init_control(EMS_COMMAND); } // Записывает строку для отображения из памяти даных в ЖКИ-модуль. void lcd_puts(char *str) { char c; while (*str!='\0') { c = *str; lcd_putchar©; str++; } } // Записывает строку для отображения из памяти программ в ЖКИ-модуль. void lcd_putsf(char *str) { char c; while (pgm_read_byte(str)!='\0') { c = pgm_read_byte(str); lcd_putchar©; str++; } } int main(void) { LCD_PORT &= ~(1<<LCD_RW); // Инициализация ЖКИ-модуля. lcd_init(); // Вывод заданного текста в первой строке с первого знакоместа. lcd_putsf(static_text); // Переключение на четвёртое знакоместо второй строки. lcd_control(DDRAM_COMMAND + SECOND_ROW + 3); // Вывод заданного текста во второй строке с четвёртого знакоместа. lcd_putsf(static_text); //Конфигурираем порт для мигания светодиодом LED_DDR |= 0b11111111; for (;;) { //Мигаем светодиодом для проверки работоспособности программы LED_PORT |= (1<<LED); _delay_ms(1000); //задержка 1 секунда LED_PORT &= ~(1<<LED); _delay_ms(1000); //задержка 1 секунда } return 0; }
  4. Что-то все умерли? Все молчат, программу запустил с выводом символа из памяти данных, т.е. из ОЗУ. При выводе строки из памяти программ какой-то трабл. Не могли бы посмотреть по коду. Нужно ли вызывать функцию pgm_read_byte или pgm_read-word? Заранее благодарен за ответ
  5. Не могу понять где ошибка в коде, вроде изменил все, но изображение не выводится? #include <avr/io.h> #include <util/delay.h> #include <avr/pgmspace.h> // Задание выводимой строки текста. PROGMEM char static_text[] = "Hello, world!"; // Задание регистров порта подключения ЖКИ-модуля. #define LCD_PORT PORTD #define LCD_DDR DDRD // Задание номера бита порта для вывода сигнала Е. #define LCD_E PD3 // Задание номера бита порта для вывода сигнала RS. #define LCD_RS PD2 // Задание номера бита порта для вывода сигнала RW #define LCD_RW PD1 //Задание регистров порта для светодиода #define LED_PORT PORTC #define LED_DDR DDRC //Задание номера бита порта для светодиода #define LED PC0 // Команда очистки экрана. #define CLEAR_COMMAND 0b00000001 // Команда возврата курсора на начальную позицию. #define HOME_COMMAND 0b00000010 // Команда выбора направления сдвига курсора и экрана: // инкремент счетчика адреса, // без сдвига изображения. #define EMS_COMMAND 0b00000110 // Команда выбора отображения: // изображение включено, // курсор в виде подчерка выключен, // курсор в виде мерцающего знакоместа выключен. #define DISPLAY_COMMAND 0b00001100 // Команда задания сдвига курсора или экрана. //#define SHIFT_COMMAND 0b0001xx-- // Команда инициализации и задания режима работы индикатора // для 8-разрядного режима работы шины данных: // 4-хразрядная шина данных. // Здесь тетрады переставлены местами для корректной работы // подпрограммы записи команды в ЖКИ-модуль. #define INIT_8_COMMAND 0b00000010 // Команда инициализации и задания режима работы индикатора: // использование двухстрочного режима отображения информации, // матрица 5х8 точек, // 4-хразрядная шина данных. #define INIT_COMMAND 0b00101000 // Команда задания адреса в CGRAM. #define CGRAM_COMMAND 0b01000000 // Команда задания адреса в DDRAM. #define DDRAM_COMMAND 0b10000000 // Смещение первого знакоместа второй строки. #define SECOND_ROW 0x40 // Количество одновременно отображаемых символов на ЖКИ. #define TOTAL_CHARS 16 // Длительность программных задержек. #define INIT_DELAY 50 #define INIT_CONTROL_DELAY 50 #define WAIT_LINE_DELAY 1 #define WRITE_DATA_DELAY 50 #define WRITE_DATA_LONG_DELAY 2000 // Переставляет тетрады в байте. unsigned char swap(unsigned char data) { asm( "swap %0": "=r" (data): "0" (data) ); return data; } // Определение задержки для формирования сигналов на линиях. #define lcd_wait_line() _delay_us(WAIT_LINE_DELAY) // Записывает данные в ЖКИ-модуль. void _lcd_write_data(unsigned char data) { unsigned char lsn; // Вывод данных на 4-хразрядную шину. // Получение и вывод старшей тетрады. lsn = LCD_PORT & 0x0F; LCD_PORT = (data & 0xF0) | lsn; // Установка стробирующего сигнала Е. LCD_PORT |=(1<<LCD_E); // Задержка сигнала на линии. lcd_wait_line(); // Снятие стробирующего сигнала Е. LCD_PORT &= ~(1<<LCD_E); // Задержка сигнала на линии. lcd_wait_line(); // Получение и вывод младшей тетрады. LCD_PORT = (swap(data) & 0xF0) | lsn; // Установка стробирующего сигнала Е. LCD_PORT |= (1<<LCD_E); // Задержка сигнала на линии. lcd_wait_line(); // Снятие стробирующего сигнала Е. LCD_PORT &= ~(1<<LCD_E); // Задержка сигнала на линии. lcd_wait_line(); // Формирование задержки для ожидания выполнения команды ЖКИ-модулем. if (!LCD_RS && (CLEAR_COMMAND == data || HOME_COMMAND == data)) { _delay_us(WRITE_DATA_LONG_DELAY); } else { _delay_us(WRITE_DATA_DELAY); } } // Записывает команду в регистр IR ЖКИ-модуля. void lcd_control(unsigned char control) { // Установка линии RS в низкое состояние - сигнал записи команды. LCD_PORT &= ~(1<<LCD_RS); // Задержка сигнала на линии. lcd_wait_line(); _lcd_write_data(control); } // Записывает команду в регистр IR ЖКИ-модуля при инициализации. void lcd_init_control(unsigned char control) { lcd_control(control); // Задержка при инициализации должна быть больше. _delay_ms(INIT_CONTROL_DELAY); } // Записывает символ в регистр DR ЖКИ-модуля. void lcd_putchar(unsigned char c) { // Установка линии RS в высокое состояние - сигнал записи данных. LCD_PORT |= (1<<LCD_RS); // Задержка сигнала на линии. lcd_wait_line(); _lcd_write_data©; } // Инициализирует ЖКИ-модуль. void lcd_init(void) { // Порт подключения ЖКИ-модуля работает на вывод. LCD_DDR |= 0b11111100; // Предварительная задержка. _delay_ms(INIT_DELAY); // Отправка команды инициализации для 8-разрядного режима работы шины // данных, переключение на 4-хразрядную шину. lcd_init_control(INIT_8_COMMAND); // Отправка команды инициализации уже для 4-хразрядного режима. lcd_init_control(INIT_COMMAND); // Повторная отправка команды инициализации. lcd_init_control(INIT_COMMAND); // Задание режима отображения. lcd_init_control(DISPLAY_COMMAND); // Очистка экрана. lcd_init_control(CLEAR_COMMAND); // Выбор направления сдвига курсора и экрана. lcd_init_control(EMS_COMMAND); } // Записывает строку для отображения из памяти даных в ЖКИ-модуль. void lcd_puts(char *str) { char c; while (*str!='\0') { c = *str; lcd_putchar©; str++; } } // Записывает строку для отображения из памяти программ в ЖКИ-модуль. void lcd_putsf(PROGMEM char *str) { char c; while (pgm_read_byte(str)!='\0') { c = pgm_read_byte(str); lcd_putchar©; str++; } } int main(void) { // Инициализация ЖКИ-модуля. lcd_init(); // Вывод заданного текста в первой строке с первого знакоместа. lcd_putsf(static_text); // Переключение на четвёртое знакоместо второй строки. lcd_control(DDRAM_COMMAND + SECOND_ROW + 3); // Вывод заданного текста во второй строке с четвёртого знакоместа. lcd_putsf(static_text); //Конфигурираем порт для мигания светодиодом LED_DDR |= 0b11111111; for (;;) { //Мигаем светодиодом для проверки работоспособности программы LED_PORT |= (1<<LED); _delay_ms(1000); //задержка 1 секунда LED_PORT &= ~(1<<LED); _delay_ms(1000); //задержка 1 секунда } return 0; }
  6. Скажу честно, я начинающий программист на СИ, потому с Вашим кодом сложнее разобраться, и я иду по пути наименьшего сопротивления. Сначала разбираюсь с менее сложным кодом, просто код на CodeVision уже работает сразу после компиляции, и я решил , что с наименьшими затратами портирую его на WinAVR. А потом буду уже разбираться с Вашим кодом, так как в нем есть опрос ЖКИ на предмет готовности. А у Вас готовый проект, сложнее разобраться. Но все равно спасибо за помощь. Я просто хочу сделать отдельную библиотеек для ЖКИ, а потом просто подключать хидер в другие проекты.
  7. Код для CodeVision записан выше на странице, он нормально работает. Я просто переделываю код под WinAVR. Дело в том, что в коде для CodeVision для этого выражения отключены предупреждения компилятора. Я так понимаю это выражение служит для обработки строки символов в цикле. А выходом из цикла является символ конца строки "\0". Но WinAVR дает предупреждение, а не ошибку. А код не работает.
  8. Переделал код CodeVision под WinAVR. Вот код: #include <avr/io.h> #include <util/delay.h> #include <avr/pgmspace.h> // Задание выводимой строки текста. char *static_text PROGMEM = "Hello, world!"; // Задание регистров порта подключения ЖКИ-модуля. #define LCD_PORT PORTD #define LCD_DDR DDRD // Задание номера бита порта для вывода сигнала Е. #define LCD_E PD3 // Задание номера бита порта для вывода сигнала RS. #define LCD_RS PD2 // Задание номера бита порта для вывода сигнала RW #define LCD_RW PD1 //Задание регистров порта для светодиода #define LED_PORT PORTC #define LED_DDR DDRC //Задание номера бита порта для светодиода #define LED PC0 // Команда очистки экрана. #define CLEAR_COMMAND 0b00000001 // Команда возврата курсора на начальную позицию. #define HOME_COMMAND 0b00000010 // Команда выбора направления сдвига курсора и экрана: // инкремент счетчика адреса, // без сдвига изображения. #define EMS_COMMAND 0b00000110 // Команда выбора отображения: // изображение включено, // курсор в виде подчерка выключен, // курсор в виде мерцающего знакоместа выключен. #define DISPLAY_COMMAND 0b00001100 // Команда задания сдвига курсора или экрана. //#define SHIFT_COMMAND 0b0001xx-- // Команда инициализации и задания режима работы индикатора // для 8-разрядного режима работы шины данных: // 4-хразрядная шина данных. // Здесь тетрады переставлены местами для корректной работы // подпрограммы записи команды в ЖКИ-модуль. #define INIT_8_COMMAND 0b00000010 // Команда инициализации и задания режима работы индикатора: // использование двухстрочного режима отображения информации, // матрица 5х8 точек, // 4-хразрядная шина данных. #define INIT_COMMAND 0b00101000 // Команда задания адреса в CGRAM. #define CGRAM_COMMAND 0b01000000 // Команда задания адреса в DDRAM. #define DDRAM_COMMAND 0b10000000 // Смещение первого знакоместа второй строки. #define SECOND_ROW 0x40 // Количество одновременно отображаемых символов на ЖКИ. #define TOTAL_CHARS 16 // Длительность программных задержек. #define INIT_DELAY 50 #define INIT_CONTROL_DELAY 50 #define WAIT_LINE_DELAY 1 #define WRITE_DATA_DELAY 50 #define WRITE_DATA_LONG_DELAY 2000 // Переставляет тетрады в байте. unsigned char swap(unsigned char data) { asm( "swap %0": "=r" (data): "0" (data) ); return data; } // Определение задержки для формирования сигналов на линиях. #define lcd_wait_line() _delay_us(WAIT_LINE_DELAY) // Записывает данные в ЖКИ-модуль. void _lcd_write_data(unsigned char data) { unsigned char lsn; // Вывод данных на 4-хразрядную шину. // Получение и вывод старшей тетрады. lsn = LCD_PORT & 0x0F; LCD_PORT = (data & 0xF0) | lsn; // Установка стробирующего сигнала Е. LCD_PORT |=(1<<LCD_E); // Задержка сигнала на линии. lcd_wait_line(); // Снятие стробирующего сигнала Е. LCD_PORT &= ~(1<<LCD_E); // Задержка сигнала на линии. lcd_wait_line(); // Получение и вывод младшей тетрады. LCD_PORT = (swap(data) & 0xF0) | lsn; // Установка стробирующего сигнала Е. LCD_PORT |= (1<<LCD_E); // Задержка сигнала на линии. lcd_wait_line(); // Снятие стробирующего сигнала Е. LCD_PORT &= ~(1<<LCD_E); // Задержка сигнала на линии. lcd_wait_line(); // Формирование задержки для ожидания выполнения команды ЖКИ-модулем. if (!LCD_RS && (CLEAR_COMMAND == data || HOME_COMMAND == data)) { _delay_us(WRITE_DATA_LONG_DELAY); } else { _delay_us(WRITE_DATA_DELAY); } } // Записывает команду в регистр IR ЖКИ-модуля. void lcd_control(unsigned char control) { // Установка линии RS в низкое состояние - сигнал записи команды. LCD_PORT &= ~(1<<LCD_RS); // Задержка сигнала на линии. lcd_wait_line(); _lcd_write_data(control); } // Записывает команду в регистр IR ЖКИ-модуля при инициализации. void lcd_init_control(unsigned char control) { lcd_control(control); // Задержка при инициализации должна быть больше. _delay_ms(INIT_CONTROL_DELAY); } // Записывает символ в регистр DR ЖКИ-модуля. void lcd_putchar(unsigned char c) { // Установка линии RS в высокое состояние - сигнал записи данных. LCD_PORT |= (1<<LCD_RS); // Задержка сигнала на линии. lcd_wait_line(); _lcd_write_data©; } // Инициализирует ЖКИ-модуль. void lcd_init(void) { // Порт подключения ЖКИ-модуля работает на вывод. LCD_DDR |= 0b11111100; // Предварительная задержка. _delay_ms(INIT_DELAY); // Отправка команды инициализации для 8-разрядного режима работы шины // данных, переключение на 4-хразрядную шину. lcd_init_control(INIT_8_COMMAND); // Отправка команды инициализации уже для 4-хразрядного режима. lcd_init_control(INIT_COMMAND); // Повторная отправка команды инициализации. lcd_init_control(INIT_COMMAND); // Задание режима отображения. lcd_init_control(DISPLAY_COMMAND); // Очистка экрана. lcd_init_control(CLEAR_COMMAND); // Выбор направления сдвига курсора и экрана. lcd_init_control(EMS_COMMAND); } // Записывает строку для отображения из памяти даных в ЖКИ-модуль. void lcd_puts(char *str) { char c; while (c = *str++) { lcd_putchar©; } } // Записывает строку для отображения из памяти программ в ЖКИ-модуль. void lcd_putsf(char *str) { char c; while (c = *str++) { lcd_putchar©; } } int main(void) { // Инициализация ЖКИ-модуля. lcd_init(); // Вывод заданного текста в первой строке с первого знакоместа. lcd_putsf(static_text); // Переключение на четвёртое знакоместо второй строки. lcd_control(DDRAM_COMMAND + SECOND_ROW + 3); // Вывод заданного текста во второй строке с четвёртого знакоместа. lcd_putsf(static_text); //Конфигурираем порт для мигания светодиодом LED_DDR |= 0b11111111; for (;;) { //Мигаем светодиодом для проверки работоспособности программы LED_PORT |= (1<<LED); _delay_ms(1000); //задержка 1 секунда LED_PORT &= ~(1<<LED); _delay_ms(1000); //задержка 1 секунда } return 0; } Выдает в строке while (c = *str++) такое предупреждение warning: suggest parentheses around assignment used as truth value Также непонятно как использовать флеш память в функции // Записывает строку для отображения из памяти программ в ЖКИ-модуль. void lcd_putsf(char *str) { char c; while (c = *str++) { lcd_putchar©; } } Кто может подскажите.
  9. Все норм, спасибо. Заработало в железе, после того как шлейф переделал. Мой код правда не работает буду разбираться со своим кодом.
  10. Я так понимаю, что хоть программа написана не сильно красиво, но должна работать? Я сам заметил, что немного неудобно манипулировать управляющими линиями ЖКИ, и одновременно передавать данные, но у меня сейчас стоит задача запустить ЖКИ, а дальше оптимизировать и улучшать код. Так скомпилил в CodeVision, немного изменил, для мигания светодиодом. В протеусе запустил все норм, на экране в протеусе появилась надпись. В железе светодиод мигает, а изображения нет. Есть подозрение, что шлейф соединяющий отладочную плату с ЖКИ, не передает все сигналы. Так как изображения нет, но контрастность регулируется в верхней строке. Завтра прикуплю разьемы на шлейф, и переделаю.
  11. У Вас компилятор IAR, а то я пытаюсь скомпилить в AVRStudio, а он ругается? Спасибо буду разбираться с Вашим исходником.
  12. Частоту кварца указал правильно. Сейчас подкоректирую программу и проверю. По поводу подсветки в протеусе подключил без подстроечного резистора, попробую поставить резистор.
  13. Изменил код, получается линия RW при записи байта устанавливалась в "1", теперь код такой: #include <avr/io.h> //библиотека ввода/вывода #include <util/delay.h> //библиотека задержек #define RW 1 //RW=PD1 - сигнал управления ЖКИ #define RS 2 //RS=PD2 - сигнал управления ЖКИ #define E 3 //E=PD3 - сигнал управления ЖКИ //Программа передачи команд в ЖКИ void lcd_com (unsigned char lcd) { unsigned char temp; temp=((lcd&~(1<<RS))&~(1<<RW))|(1<<E); //RS=0 – это команда PORTD=temp; //Выводим на portD старшую тетраду команды, сигналы RS, E _delay_us(2); //Небольшая задержка в 2 мкс, для стабилизации PORTD=temp&~(1<<E); //Сигнал записи команды temp=((lcd*16)&~(1<<RS))|(1<<E); //RS=0 – это команда PORTD=temp; //Выводим на portD младшую тетраду команды, сигналы RS, E _delay_us(2); //Небольшая задержка в 2 мкс, для стабилизации PORTD=temp&~(1<<E); //Сигнал записи команды _delay_us(100); //Пауза для выполнения команды } //Программа записи данных в ЖКИ void lcd_dat (unsigned char lcd) { unsigned char temp; temp=((lcd&~(1<<RW))|(1<<RS))|(1<<E); //RS=1 – это данные PORTD=temp; //Выводим на portD старшую тетраду данных, сигналы RS, E _delay_us(2); //Небольшая задержка в 2 мкс, для стабилизации PORTD=temp&~(1<<E); //Сигнал записи данных temp=((lcd*16)|(1<<RS))|(1<<E); //RS=1 – это данные PORTD=temp; //Выводим на portD младшую тетраду данных, сигналы RS, E _delay_us(2); //Небольшая задержка в 2 мкс, для стабилизации PORTD=temp&~(1<<E); //Сигнал записи данных _delay_us(100); //Пауза для вывода данных } //Программа иниализации ЖКИ void lcd_init (void) { _delay_ms(15); lcd_com(0x33); //8-проводный интерфейс, _delay_ms(4.1); lcd_com(0x33); //8-проводный интерфейс, _delay_us(100); lcd_com(0x33); //8-проводный интерфейс, _delay_us(100); lcd_com(0x20); //4-проводный интерфейс, lcd_com(0x08); // полное выключение дисплея lcd_com(0x01); // очистка дисплея _delay_us(100); lcd_com(0x06); // сдвиг курсора вправо lcd_com(0x0D); // включение дисплея дисплея, мигающий курсор } //Основная программа int main(void) { DDRD=0xFE; //Инициализация portD PORTD=0x00; DDRC=0xFF; PORTC=0xFF; //Инициализация portС lcd_init(); //Инициализация ЖКИ lcd_dat('w'); //Вывод "www.avrlab.com" lcd_dat('w'); lcd_dat('w'); lcd_dat('.'); lcd_dat('a'); lcd_dat('v'); lcd_dat('r'); lcd_dat('l'); lcd_dat('a'); lcd_dat('b'); lcd_dat('.'); lcd_dat('c'); lcd_dat('o'); lcd_dat('m'); lcd_com(0xc0); //Ставим курсор на начало 2-й строки ЖКИ lcd_dat('I'); //Записываем "It's so easy" lcd_dat('t'); lcd_dat('"'); lcd_dat('s'); lcd_dat(' '); lcd_dat('s'); lcd_dat('o'); lcd_dat(' '); lcd_dat('e'); lcd_dat('a'); lcd_dat('s'); lcd_dat('y'); while (1) { PORTC=0xFE; //мигаем светодиодом для проверки работоспособности программы _delay_ms(1000);//задержка 1 секунда PORTC=0xFF; _delay_ms(1000);//задержка 1 секунда } return 1; } в Протеусе теперь лог такой, но все равно ни в железе ни в протеусе не работает:
  14. переписал немного программу, изменил процедуру инициализации ЖКИ, согласно рекомендациям на форуме. Вот код: #include <avr/io.h> //библиотека ввода/вывода #include <util/delay.h> //библиотека задержек #define RW 1 //RW=PD1 - сигнал управления ЖКИ #define RS 2 //RS=PD2 - сигнал управления ЖКИ #define E 3 //E=PD3 - сигнал управления ЖКИ //Программа передачи команд в ЖКИ void lcd_com (unsigned char lcd) { unsigned char temp; temp=(lcd&~(1<<RS))|(1<<E); //RS=0 – это команда PORTD=temp; //Выводим на portD старшую тетраду команды, сигналы RS, E _delay_us(2); //Небольшая задержка в 2 мкс, для стабилизации PORTD=temp&~(1<<E); //Сигнал записи команды temp=((lcd*16)&~(1<<RS))|(1<<E); //RS=0 – это команда PORTD=temp; //Выводим на portD младшую тетраду команды, сигналы RS, E _delay_us(2); //Небольшая задержка в 2 мкс, для стабилизации PORTD=temp&~(1<<E); //Сигнал записи команды _delay_us(100); //Пауза для выполнения команды } //Программа записи данных в ЖКИ void lcd_dat (unsigned char lcd) { unsigned char temp; temp=(lcd|(1<<RS))|(1<<E); //RS=1 – это данные PORTD=temp; //Выводим на portD старшую тетраду данных, сигналы RS, E _delay_us(2); //Небольшая задержка в 2 мкс, для стабилизации PORTD=temp&~(1<<E); //Сигнал записи данных temp=((lcd*16)|(1<<RS))|(1<<E); //RS=1 – это данные PORTD=temp; //Выводим на portD младшую тетраду данных, сигналы RS, E _delay_us(2); //Небольшая задержка в 2 мкс, для стабилизации PORTD=temp&~(1<<E); //Сигнал записи данных _delay_us(100); //Пауза для вывода данных } //Программа иниализации ЖКИ void lcd_init (void) { _delay_ms(15); lcd_com(0x33); //8-проводный интерфейс, _delay_ms(4.1); lcd_com(0x33); //8-проводный интерфейс, _delay_us(100); lcd_com(0x33); //8-проводный интерфейс, _delay_us(100); lcd_com(0x20); //4-проводный интерфейс, lcd_com(0x08); // полное выключение дисплея lcd_com(0x01); // очистка дисплея _delay_us(100); lcd_com(0x06); // сдвиг курсора вправо lcd_com(0x0D); // включение дисплея дисплея, мигающий курсор } //Основная программа int main(void) { DDRD=0xFE; //Инициализация portD PORTD=0x00; DDRC=0xFF; PORTC=0xFF; //Инициализация portС lcd_init(); //Инициализация ЖКИ lcd_dat('w'); //Вывод "www.avrlab.com" lcd_dat('w'); lcd_dat('w'); lcd_dat('.'); lcd_dat('a'); lcd_dat('v'); lcd_dat('r'); lcd_dat('l'); lcd_dat('a'); lcd_dat('b'); lcd_dat('.'); lcd_dat('c'); lcd_dat('o'); lcd_dat('m'); lcd_com(0xc0); //Ставим курсор на начало 2-й строки ЖКИ lcd_dat('I'); //Записываем "It's so easy" lcd_dat('t'); lcd_dat('"'); lcd_dat('s'); lcd_dat(' '); lcd_dat('s'); lcd_dat('o'); lcd_dat(' '); lcd_dat('e'); lcd_dat('a'); lcd_dat('s'); lcd_dat('y'); while (1) { PORTC=0xFE; //мигаем светодиодом для проверки работоспособности программы _delay_ms(1000);//задержка 1 секунда PORTC=0xFF; _delay_ms(1000);//задержка 1 секунда } return 1; } Попробовал запустить в железе, светодиод мигает, а на экран ЖКИ информация не выводится. В протеусе тоже самое, на экране ничего нет. Ваши Комментарии ожидаю, в чем может быть проблема? В протеусе выдало такие предупреждения Подключил сигнал управления RW к порту PD1, но почему-то вместо того чтобы быть в "0", в симуляторе PD1 находится в высоком состоянии. Что неправильно?
  15. Как проверить флаг занятости, какая должна быть последовательность кода? Какие задержки?
×
×
  • Создать...