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

melandr

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

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

  • Посещение

Весь контент 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. Как проверить флаг занятости, какая должна быть последовательность кода? Какие задержки?
  16. Вопрос по поводу питания. Если у меня напряжение питания 4,6 В, запустится ли ЖКИ? Также по поводу задержек, попробовать просимулировать, определить какие задержки, и скорректировать согласно даташиту?, или можно использовать те, что уже прописаны в программе?
  17. Почитал http://electronix.ru/forum/index.php?s=&am...st&p=143374, и решил линию управления RW переключить с GND на линию PD1. Поэтому если будут исходники с чтением состояния ЖКИ, очень хотелось бы ознакомиться.
  18. Оптимизацию я отключил, чтобы циклы компилятор не убрал. По поводу функции delay, функция хорошая, но там есть ограничение по задержке, вроде бы 768мкс/частоту кварца в МГц, соответственно задержка получается маленькой. Мне непонятно не слишком ли маленькие задержки в одну оперцию asm "nop"?
  19. Спасибо за отзывчивость, вылаживаю все исходные данные. Вот код: #include <avr/io.h> //библиотека ввода/вывода #define RS 2 //RS=PD2 - сигнал управления ЖКИ #define E 3 //E=PD3 - сигнал управления ЖКИ #define TIME 10 //Константа временной задержки для ЖКИ //Частота тактирование МК - 4Мгц //Программа формирования задержки void pause (long int a) { unsigned int i; for (i=a;i>0;i--); } //Программа передачи команд в ЖКИ void lcd_com (unsigned char lcd) { unsigned char temp; temp=(lcd&~(1<<RS))|(1<<E); //RS=0 – это команда PORTD=temp; //Выводим на portD старшую тетраду команды, сигналы RS, E asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации PORTD=temp&~(1<<E); //Сигнал записи команды temp=((lcd*16)&~(1<<RS))|(1<<E); //RS=0 – это команда PORTD=temp; //Выводим на portD младшую тетраду команды, сигналы RS, E asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации PORTD=temp&~(1<<E); //Сигнал записи команды pause (10*TIME); //Пауза для выполнения команды } //Программа записи данных в ЖКИ void lcd_dat (unsigned char lcd) { unsigned char temp; temp=(lcd|(1<<RS))|(1<<E); //RS=1 – это данные PORTD=temp; //Выводим на portD старшую тетраду данных, сигналы RS, E asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации PORTD=temp&~(1<<E); //Сигнал записи данных temp=((lcd*16)|(1<<RS))|(1<<E); //RS=1 – это данные PORTD=temp; //Выводим на portD младшую тетраду данных, сигналы RS, E asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации PORTD=temp&~(1<<E); //Сигнал записи данных pause(TIME); //Пауза для вывода данных } //Программа иниализации ЖКИ void lcd_init (void) { lcd_com(0x2c); //4-проводный интерфейс, 5x8 размер символа pause(100*TIME); lcd_com(0x0c); //Показать изображение, курсор не показывать pause(100*TIME); lcd_com(0x01); //Очистить DDRAM и установить курсор на 0x00 pause (100*TIME); } //Основная программа int main(void) { DDRD=0xfc; //Инициализация portD PORTD=0x00; DDRC=0xFF; PORTC=0xFF; //Инициализация portС pause(1000); //Задержка, чтобы ЖКИ успел включиться 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; //мигаем светодиодом для проверки работоспособности программы pause(15000000);//задержка 0,5 секунда PORTC=0xFF; pause(15000000);//задержка 0,5 секунда } return 1; } Задержки конечно сделано уххх.. :), но не хочется заморачиваться с таймером, главное запустить ЖКИ. Значит эта программа мигает светодиодом что в железе, что в Протеус. Есть подозрения, что из-за смены частоты тактирования процессора (в исходном примере кварц был на 4 МГц, а у меня 14,745600МГц), изменились временные интервалы при работе с ЖКИ. Необходимо изменить переменную TEMP, но только на сколько и в какую сторону непонятно. Выкладываю схему подключения
  20. LCD + ATmega8

    Доброго дня Всем! Думаю эта тема уже конкретно проработана на форуме, но нужного мне ответа не нашел. Пытаюсь подключить ЖКИ к контроллеру. Сначала пробовал использовать готовые библиотеки. Но ничего не получилось. Везде используется другая частота тактирования процессора, и я подозреваю, что я не попадаю в нужные временные задержки дл работы с ЖКИ. Прогу писал в GCC. Также запускал в Протеусе для проверки. Прога не заводилсь. Потом нашел исходничек маленький в CodeVision. Вот он: /***************************************************** This program was produced by the CodeWizardAVR V2.05.0 Professional Automatic Program Generator © Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Version : Date : 28.04.2011 Author : NeVaDa Company : Comments: Chip type : ATmega8 Program type : Application AVR Core Clock frequency: 14,745600 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *****************************************************/ #include <mega8.h> //Библиотека для расчета задержки по времени #include <delay.h> // Alphanumeric LCD Module functions #include <alcd.h> // Declare your global variables here void main(void) { // Declare your local variables here // Input/Output Ports initialization // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00; DDRB=0x00; // Port C initialization // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0xFF; DDRC=0xFF; // Port D initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 PORTD=0x00; DDRD=0xFF; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped TCCR0=0x00; TCNT0=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer1 Stopped // Mode: Normal top=0xFFFF // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer2 Stopped // Mode: Normal top=0xFF // OC2 output: Disconnected ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off MCUCR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; // USART initialization // USART disabled UCSRB=0x00; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; // ADC initialization // ADC disabled ADCSRA=0x00; // SPI initialization // SPI disabled SPCR=0x00; // TWI initialization // TWI disabled TWCR=0x00; // Alphanumeric LCD initialization // Connections specified in the // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu: // RS - PORTD Bit 2 // RD - PORTD Bit 1 // EN - PORTD Bit 3 // D4 - PORTD Bit 4 // D5 - PORTD Bit 5 // D6 - PORTD Bit 6 // D7 - PORTD Bit 7 // Characters/line: 16 delay_us(500); lcd_init(16); #asm("sei") lcd_gotoxy (2,0); lcd_putsf("HELLO,WORLD!"); while (1) { PORTC=0xFE; delay_ms(1000);//задержка 1 секунда PORTC=0xFF; delay_ms(1000);//задержка 1 секунда } } Светодиод поцепил, чтобы было видно что программа работает. В протеусе эта программа запустилась, но в железе изображения на ЖКИ нет. Регулирую контрастность на ЖКИ, все нормально, сначала темнее верхний ряд, потом нижний. Подскажите в чем может быть проблема? Заранее благодарен за ответ. ЗЫ:Вылаживаю архив с исходником и проектом Протеус LCD.rar ЗЫ2:Хотелось бы написать программу в GCC, так в КодеВижене ничего не видно, что и как работает, а интересно разобраться в работе с ЖКИ. Если у кого то есть исходничек для работы с ЖКИ 44780 и ATmega8 с кварцем 14,745600 МГц, большая просьба выложить или дать нормальную ссылочку.
  21. to ds1307 Большое спасибо, по Вашему совету выпаял кондеры во входных цепях FT232RL по 47 пФ, заменил сопротивления по 27 Ом сопротивлениями 0 Ом. В программируемой плате выпаял супервизор и сопротивление 22 Ом заменил сопротивлением 1кОм. И о чудо, оно заработало!!!!!!!!!!!!!!!! Светодиод при подключении целевой платы горит, сигнатура нормально читается, прошил ATtiny2313. Огромное спасибо.
  22. При попытке считывания сигнатуры или фьюзов CodeVision после появления сообщения о том что STK500/AVRISP communication error, светодиод несколько раз мигает, как будто программатор перегружается. В AVRStudio окно настройки программатора не появляется.
  23. Закоротил супервизор. Сбой программы перестал происходить. Но программатор не определяется.
  24. До этого дросселя не было. Проблемы были те же самые. Сейчас поставил 3,3 мкГн. Ничего не изменилось Танталы стоят три штуки по питанию программатора. Значит светодиод мигает, правда только в полнакала. Это происходит когда подвисает чип на программируемой плате. На программируемой плате стоит микросхема супервизора, поэтому когда происходит сбой программы, залитой рабочим программатором, на выходе супервизора Res напряжение постоянно меняется в пределах 0,1-0,5 В. Сейчас постараюсь его закоротить, чтобы исключить его влияние. Флюс отмыт. Паял мой знакомый, он занимается изготовлением плат, паял паяльной станцией. я думаю тут проблем не должно быть. Еще такой вопрос, замерил напряжения на разъеме ISP, при работающей программе в программируемом контроллере вот такие напряжения: MOSI - 5.03 B Clc - 0 B RESET - 5.03 B SCK - 0.08 B MISO - 5.03 B Также происходит сбой программы при подключении программатора к программируемой плате. Думаю проблема в супервизоре, перемкну его и отпишу. Значит вот схема программируемой платы mk2313sch.pdf Вот схема программатора, есть небольшие добавления от топологии Petka, но в принципе та же схема. PS:Еще обратил внимает что программа сбоит при подключении программатора, только когода он не подключен к USB. PS2:Закоротил супервизор, и запитал программируемую плату от программатора. Программатор перестал определяться как в CodeVision, так и в AVRStudio. Правда питание просело до 3,95 В Разделил питание, программируемая плата запитана от своего питания, а программатор от USB. При попытке подключения программатора в AVRStudio с подключенной целевой платой, пишет, что невозможно подключиться. При отключении программируемой платы, программатор подключается и появляется окно AVR Prog. Непонятно. Прошивал похожим программатором, только изготовленным другими людьми. Прошивало без проблемм. До этого прошивал STK200/300 тоже проблем не возникало. Вход в консольный режим программатора происходит без проблем.
  25. Проверил фьюзы, выставил согласно рекомендовым Petka для Mega8. Значит получается такая происходит непонятка. Подключил программатор к USB, потом подключил программируемую плату. В CodeVision считывается сигнатура програмируемого чипа правильно только первый раз. После второго считывания пишет что запрограммированы lock bits, и сигнатуру считать не возможно.Пока программатор не будет переподключен к USB, не считывает сигнатуру. Еще при считывании сигнатуры мигает светодиод на программаторе несколько раз, а в CodeVision выдается предупреждение, что STK500/AVRISP communication error. И рекомендуется проверить питание, настройки и т.д. В AVRStudio сигнатрура считывается, только она не соответствует программируемому чипу. Вот пример, что пише AVRStudio: при подключении программатора Detecting on 'COM2'... AVRISP with V2 firmware found on COM2 Getting revisions.. HW: 0x02, SW Major: 0x02, SW Minor: 0x0a .. OK Getting isp parameter.. SD=0x02 .. OK при чтении сигнатуры Setting mode and device parameters.. OK! Entering programming mode.. OK! Reading signature .. 0x00, 0x01, 0x02 .. OK! Leaving programming mode.. OK! Чип ATtiny2313, его сигнатура - 0х1Е, 0х91, 0x0A
×
×
  • Создать...