Никогда не понимал боязни delay. Если в основной программе есть задержка, прерывание выполняется быстро (как и положено), какая разница - выполняется delay или крутится бесполезный while? Обработку кнопок всегда делал так: нажалась кнопка, проконтролировал отпускание, выдержал 0,1-0,3 с для устранения дребезга. В зависимости от назначения программы код по нажатию может выполняться после нажатия кнопки, после отпускания, реже после выдержки времени.
msmmmm, я не говорю, что delay ну совсем нельзя использовать... просто сталкивался с лагами, когда работает таймер c точным счетом и используется delay, выходит такая же фигня как и у Ника. Не задумывался почему, но замечал, во время работы delay прерывания таймера работают нестабильно.
Добавлено (17.11.2017, 08:48) --------------------------------------------- Ник, не за что, на флаговый автомат больше похоже, хотя что-то есть и похожее) Ну и присутствует возможность расширения функций, без особого усложнения алгоритма.
msmmmm, я delay использую, зачем мучится с какими то расчетами если проще поставить задержку. Просто хотелось что бы и программа выполнялась и задержка была.
Добавлено (21.11.2017, 17:45) --------------------------------------------- Начал изучать USART, и столкнулся с такой проблемой. Подскажите как быть, в CodeVisionAVR я не нашёл прерывания по флагу UDRE, это 12 вектор (UCSRB=(1<<UDRIE)). В программе пришлось использовать функцию в которой проверял опустошение буфера передачи while (!(UCSRA=(1<<UDRE)) и с подставлением значения в UDR. Может как то можно вызвать данное прерывание?
Мега32, просто на ней сделал плату для учёбы с со своим блоком питания и внутрисхемного программирования. Мне только что удалось подружить два меги по USART. Простенькая схемка, при принятии данных одной она изменяет значения и отсылает другой, та в свою очередь принимает, зажигает светодиод (или тушит) и отсылает обратно и так по кругу. Вижу мигающий светодиод. С компом подружил частично, только на передачу, на прием почему то перезагружается. Буду разбераться
Доброе время суток. Хочу реализовать в своих проектах дисплей от нокиа 2300 (контроллер PCF8814). Распиновка ножек с тыльной стороны экрана светодиоды сверху 1-xRES(аппаратный сброс); 2-xCS (команда или данные); 3-GND; 4- SDA(передача байт); 5-SCLK( тактирование); 6-VDDI , 7-VDD (+ 3,3V); 8-LED+; Скачал даташит частично понятно но не нашел последовательность инсталляции экрана (если можно пошагово), также в гугле не нашел. Подскажите как правильно подключить его к контроллеру (меге32), как луче по SPI-3 проводам или 4 или I2C? Есть обрывки (чужих) программ. Писать буду на Си. К экрану спаял переходник на основе делителей и понижения питания до 3.3v на KIA1117.
Доброе время суток. Так и не заработал дисплей от нокиа 2300 (возможно он и не рабочий, был вытащен со с ломаного телефона). В магазине купил дисплей от нокиа 5110. Нашёл на него дата шит (в инете без проблем), после ознакомления решил написать программу и все заработало с первого раза. Поэтому решил выложить готовую программу, рабочий "образец" может кому пригодится. В программе сноски написаны на русском. Я писал на CodeVisionAVR и мега 32 (учебная плата моей разработки), но думаю проблемы не будет написать на другой контроллер и также на другой порт, если надо помогу И так, дисплей надо подключать как на схеме через делитель (ПИТАНИЕ ДИСПЛЕЯ 3,3 ВОЛЬТА!!!!) Модуль имеет следующие выводы для подключения: RST – вывод сброса контроллера дисплея CE – вывод разрешения передачи данных DC – выбор режима передачи, команда или данные DIN – вход передачи данных интерфейса SPI CLK – вывод тактирования интерфейса SPI VCC – вывод питания дисплея LIGHT – вывод управление подсветкой, для включения необходимо подать низкий логический уровень GND – общий провод (отрицательный полюс источника питания) Передача данных осуществляется с помощью стандартного интерфейса SPI, частота тактирования до 4 МГц. Пишу на работе посему за раз все выложить не могу корпорация режет
Project : Version : Date : 08.05.2018 Author : Nik Company : Comments:
Chip type : ATmega32 Program type : Application AVR Core Clock frequency: 8 MHz Memory model : Small External RAM size : 0 Data Stack size : 512 *******************************************************/
#include <mega32.h> #include <delay.h>
#define RES_0 PORTD&=0b11111110 // установка линии RES в 0 (аппаратный сброс) PD0 #define RES_1 PORTD|=0b00000001 // установка линии RES в 1 #define CS_0 PORTD&=0b11111101 // установка линии CS в 0 (выбор) PD1 #define CS_1 PORTD|=0b00000010 // установка линии CS в 1 #define DC_0 PORTD&=0b11111011 // установка линии DC в 0 // команда #define DC_1 PORTD|=0b00000100 // установка линии DC в 1 // данные #define SDA_0 PORTD&=0b11110111 // установка линии SDA в 0 (данные) PD2 #define SDA_1 PORTD|=0b00001000 // установка линии SDA в 1 #define SCLK_0 PORTD&=0b11101111 // установка линии SCLK в 0 (тактирование) PD3 #define SCLK_1 PORTD|=0b00010000 // установка линии SCLK в 1 #define DC0 0 #define DC1 1
sda_date(DC0,0x21); // включить контроллер дисплея, горизонтальная адресация, расширеный набор функций. Function set sda_date(DC0,0x13); // настройка смещения напряжения. Bias system sda_date(DC0,0x04); // команда установки температурного коэффициента, здесь выбран 0-й коэффициент. Temperature control sda_date(DC0,0xB8); // команда установки контрастности дисплея. Set Vop sda_date(DC0,0x20); // команда настройки функций: включить контроллер дисплея, горизонтальная адресация, выбрать стандартный набор команд. Function set sda_date(DC0,0x0C); // команда настройки отображения: выбрать нормальный режим работы. Display control Lcd_Clear (); //очистка дисплея от мусора. После инициализация дисплея на экране светятся хаотично тчки (светится = 1, не светится = 0), их и требуется убрать предварительно записав 0х00. }
lcd_gotoxy(3,0); // установка курсора lcd_puts("ПРИВЕТ!"); // вывод текста lcd_gotoxy(3,1); // установка курсора lcd_puts("ПРОВЕРКА"); // вывод текста lcd_gotoxy(0,2); // установка курсора lcd_puts("работы дисплея"); // вывод текста lcd_gotoxy(0,3); // установка курсора lcd_puts("--------------"); // вывод текста lcd_gotoxy(2,5); // установка курсора lcd_puts("NOKIA 5110"); // вывод текста