Форум РадиоКот https://radiokot.ru/forum/ |
|
Вывод информации на дисплей https://radiokot.ru/forum/viewtopic.php?f=61&t=145537 |
Страница 1 из 1 |
Автор: | LegionKC [ Пт май 26, 2017 16:51:45 ] |
Заголовок сообщения: | Вывод информации на дисплей |
Всем Привет. Прошу не кидаться тапками за название темы, понимаю, что уже много опубликовано материалов по этому вопросу, однако все кроется в нюансах. Итак, к проблеме. Выполняю курсовую работу. Опыта в программировании минимум. Имеется схема с МК ATmega8 и дисплеем LM044 на контроллере HD44780. При попытке вывести инфу на дисплей столкнулся с этими двумя рядами прямоугольников (к слову, дисплей 20х4). Спойлер![]() Поначалу думал, что оторвались провода, которые соединяют дисплей с МК. Нет, все прозваниваются. Кстати, схема вся была спаяна преподавателем и раньше дисплей уже выводил инфу, но когда начал я ее прошил своей прогой, появилось, то что на фотке. Потом пошли мысли, что неправильно настроил выводы в CodeVision AVR, в котором работаю. Исходя из даташита МК и того, куда припаяны провода в схеме, настроил порты таким образом: Спойлер![]() Думал, что теперь будет все норм, прошил снова - ничего. Начал уже бесится, изучил десятки страниц (уже не первый день работаю над схемой, думал все-таки смогу сделать сам, ан нет) Решил начать с простого. Нашел в инете самый простой код по выводу инфы СпойлерКод: /*************************************/ #include <mega8.h> #include <lcd.h> #include <delay.h> #asm .equ __lcd_port=0x12; PORTD /* ЖКИ дисплей подключили к порту I/O D */ #endasm void main(void) /* Основная функция "main", с которой начинается выполнение всей программой процедуры */ { lcd_init(20); /* инициализация на 20 символов */ lcd_clear(); lcd_gotoxy(0,0); lcd_putsf("LCD 20x04"); lcd_gotoxy(0,1); lcd_putsf("Hello World!"); lcd_gotoxy(0,2); lcd_putsf("CodeVision AVR"); lcd_gotoxy(0,3); lcd_putsf("ver. 1.25.3"); while(1){} } Сделал стандартный проект в CodeVision AVR, вставил туда этот код, настроил настроил выводы на свои. СпойлерКод: /******************************************************* This program was created by the CodeWizardAVR V3.12 Advanced Automatic Program Generator © Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Version : Date : 26.05.2017 Author : Company : Comments: Chip type : ATmega8 Program type : Application AVR Core Clock frequency: 8,000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *******************************************************/ #include <mega8.h> // Alphanumeric LCD functions #include <alcd.h> #include <delay.h> #asm .equ __lcd_port=0x12; PORTD /* ЖКИ дисплей подключили к порту I/O D */ #endasm // Declare your global variables here void main(void) { // Declare your local variables here // Input/Output Ports initialization // Port B initialization // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0); // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Port C initialization // Function: Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0); // State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0); // Port D initialization // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0); // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0); // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped TCCR0=(0<<CS02) | (0<<CS01) | (0<<CS00); TCNT0=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer1 Stopped // Mode: Normal top=0xFFFF // OC1A output: Disconnected // OC1B output: Disconnected // 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=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10); TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10); 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=0<<AS2; TCCR2=(0<<PWM2) | (0<<COM21) | (0<<COM20) | (0<<CTC2) | (0<<CS22) | (0<<CS21) | (0<<CS20); TCNT2=0x00; OCR2=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<TOIE0); // External Interrupt(s) initialization // INT0: Off // INT1: Off MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00); // USART initialization // USART disabled UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (0<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8); // Analog Comparator initialization // Analog Comparator: Off // The Analog Comparator's positive input is // connected to the AIN0 pin // The Analog Comparator's negative input is // connected to the AIN1 pin ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0); SFIOR=(0<<ACME); // ADC initialization // ADC disabled ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADFR) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); // SPI initialization // SPI disabled SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0); // TWI initialization // TWI disabled TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE); // Alphanumeric LCD initialization // Connections are specified in the // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu: // RS - PORTC Bit 0 // RD - PORTC Bit 1 // EN - PORTC Bit 2 // D4 - PORTC Bit 3 // D5 - PORTC Bit 4 // D6 - PORTC Bit 5 // D7 - PORTB Bit 2 // Characters/line: 20 lcd_init(20); lcd_clear(); lcd_gotoxy(0,0); lcd_putsf("LCD 20x04"); lcd_gotoxy(0,1); lcd_putsf("Hello World!"); lcd_gotoxy(0,2); lcd_putsf("CodeVision AVR"); lcd_gotoxy(0,3); lcd_putsf("ver. 1.25.3"); while (1) { // Place your code here } } Прошил в Протеусе МК и вуаля - в Протеусе инфа выводится! Спойлер![]() На радостях решил, что теперь-то все получится - опять нет! Прошивал МК через AVRDUDE PROG 3.0 через USBasp Ребят, у меня к вам такие вопросы: 1. Что может быть не так с дисплеем? 2. Нужно ли как-то настраивать порты МК? Потому что я нигде не видел, чтобы хоть где-то пытались настроить порты МК при выводе инфы на экран. Даже в том коде, что я выложил. Прошу вас, высказывайте любые идеи и мысли, ибо я реально хочу понять программирование и выяснить в чем же проблема. Спасибо! |
Автор: | tosh2000 [ Пт май 26, 2017 21:07:35 ] | ||
Заголовок сообщения: | Re: Вывод информации на дисплей | ||
У дисплея есть вывод отвечающий за его контраст. Его можно менять с помощью шим с контроллера либо с помощью переменного резистора. И скорее всего порт С настроить на вывод придётся , а именно DDRC = 0xFF, а у Вас настроен на вход (все выводы в ноль) , скорее всего и так пойдёт, но лучше настроить на выход.
|
Автор: | ARV [ Пт май 26, 2017 21:19:47 ] |
Заголовок сообщения: | Re: Вывод информации на дисплей |
Дисплеи на контроллере HD44780 всегда показывают первую строку черной, а вторую белой после подачи питания, если инициализация дисплея не выполнена. 4-строчный дисплей реализован как двустрочный, в котором первая строка продолжается на третьей, потому у вас такая и картина. Кстати, распределение внутренней памяти для 4-строк тоже может внести некоторую путаницу, но на инициализацию это однозначно не повлияет. А вот почему у вас инициализация не проходит - я не знаю, ибо в CVAVR не шарю совсем. Я пользуюсь AVR-GCC и библиотечкой от Peter Fleury - 4-строчный дисплей завелся с первой попытки, никаких проблем не было. |
Автор: | tosh2000 [ Пт май 26, 2017 21:46:03 ] |
Заголовок сообщения: | Re: Вывод информации на дисплей |
Не знаю что в функции инициализации экрана, может стоит уточнить подходит ли она для этого типа. |
Автор: | _abk_ [ Пт май 26, 2017 21:50:10 ] |
Заголовок сообщения: | Re: Вывод информации на дисплей |
Все подходит. И контраст тут ни причем. Не проходит инициализация дисплея. Я вначале убедился бы, что программа вообще выполняется. На фьюзы посмотрите, что там в генераторе. Добавьте в код пару строк - поморгайте диодиком. Не ошиблись ли, как присоединены выводы к ЖКИ от МК. Что-то еще и придумать сложно. Ну и не забудьте потом с нами радостью поделиться. |
Автор: | polli123456 [ Вс май 28, 2017 18:27:40 ] |
Заголовок сообщения: | Re: Вывод информации на дисплей |
Если новая Atmega8, то по умолчанию тактируется встроенным генератором 1Мгц, а вы прошили её вашим исходником с 8Мгц, не меняя частоту тактирования. Короче, скорее всего фьюзы проверяйте справка здесь, ну и "тупые" залипы\непропаи, не туда проводок... И зачем в исходнике это: Код: #asm .equ __lcd_port=0x12; PORTD /* ЖКИ дисплей подключили к порту I/O D */ #endasm У вас CVAVR 3 версии, и все LCD настройки в свойствах проекта. в программу их писать не надо |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |