Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
PIC контроллеры. Программаторы и первый проект на PIC |
Программирование микроконтролеров,ремонт аудио/видео/бытовой техники,полезные устройства для дома,телефония, обсуждение статей журнала Радио |
|
Опции темы |
07.04.2011, 15:56 | #811 |
Форумец
|
Попробуйте сделать процедуру с проверкой удержания кнопки.
Код:
void ir() { if (RC5.received) { cmd = RC5.command; RC5.received = 0 ; if (last_toggle == IR.toggle) return; else last_toggle = IR.toggle; if (cmd==16) vol_up(); if (cmd==17) vol_down(); if (cmd==11) rez_stb(); if (cmd==12) rez_mute(); if (cmd==32) rez_mode_up(); if (cmd==33) rez_mode_down(); } } |
07.04.2011, 18:37 | #812 | |
Форумец
Сообщений: 7
Регистрация: 07.04.2011
Не в сети |
Цитата:
|
|
08.04.2011, 08:26 | #815 |
Форумец
|
Да, будет вылетать, но при этом первая пришедшая команда будет обработана, а последующие нет. А Вы о чем хотите сказать, что Вам надо длительное и короткое нажатие раздельно обрабатывать?
|
08.04.2011, 09:50 | #816 |
Форумец
Сообщений: 7
Регистрация: 07.04.2011
Не в сети |
Я хочу чтобы работа полностью соответствовала работе с обычной бытовой техникой, т.е. нажали кнопку параметр изменяется на 1, если удерживаем кнопку, требуемый параметр изменяется пока мы держим кнопку, нажали другую кнопку меняется другой параметр на 1 или тотже самый параметр только в другую сторону -1, если мы нажали и удерживаем параметр также начинает увеличиваться или уменьшаться в течении времени удержания.
|
08.04.2011, 10:23 | #817 | ||
Форумец
|
Цитата:
Цитата:
Ближе к проблеме. Хочется разобраться с причиной, поэтому в коде умышленно предложил убрать повторные нажатия. Сначала надо решить одно, а потом переходить к другому. |
||
11.04.2011, 07:25 | #818 | |
Форумец
Сообщений: 7
Регистрация: 07.04.2011
Не в сети |
Убрал последнее состояние стейт-машины, все работает как нужно. В итоге получился вот такой код:
Цитата:
|
|
13.04.2011, 18:50 | #822 | |
Форумец
|
Цитата:
Если контроллер новый, то с завода он выходит с установленным битом конфигурации LVP, который разрешает низковольтовое программирование. Если контроллер прошивался раньше или Вы с новья прошили его прошивкой со сброшенным в ней битом, то все, Ваш программатор ничего уже не сможет с ним сделать, для перепрограммирования нужен программатор с режимом высоковольтного программирования, чтобы снова установить бит LVP. |
|
26.04.2011, 10:22 | #824 |
Форумец
Сообщений: 4
Регистрация: 29.03.2011
Не в сети |
Здравствуйте, petrd! Проиллюстрируйте, пожалуйста, на микроси для 16F628 работу компаратора, напряжение берём с переменного резистора а при сработке изменяется переменная (загорается светодиод).
|
03.05.2011, 00:06 | #825 |
Форумец
Сообщений: 36
Регистрация: 19.10.2010
Возраст: 57
Не в сети |
Вот небольшой пример на Си для 12F629- - это в общем заготовка для диммера с аналоговым входом- ну или для другого подобного устройства-суть не в этом для чего но тут используется компаратор с внутренним источником опорного напряжения.. Для 628 будет в принципе аналогично- там только два компаратора- вот и все.. Если что не так- то пардон- сам только учусь... Если что- пусть господа знатоки покритикуют
Код:
unsigned short t,old_GPIO; void init() { CMCON = 0x07; TRISIO = 0x28; OPTION_REG = 0b11000101; INTCON.GIE = 0; } void main() { init() ; do { old_GPIO = GPIO; if(old_GPIO.F5 == 1) {TRISIO =0x28; old_GPIO.F1 = 1; old_GPIO.F4 = 0; GPIO = old_GPIO;} if(old_GPIO.F5 == 0) { CMCON = 0x04; VRCON = 0xA3; TRISIO = 0x2A; TMR0 = 0; Delay_us(10); if(CMCON.F6==1){ t = TMR0; old_GPIO.F4 =1; GPIO = old_GPIO;} } } while(1); } |
05.05.2011, 14:17 | #827 |
Форумец
Сообщений: 36
Регистрация: 19.10.2010
Возраст: 57
Не в сети |
вот фрагмент с комментариями если что не понятно- идея там простая- из напряжения сети формируются импульсы частотой 100 герц, которые подаются на вход синхронизации. При положительной полуволне сетевого напряжения происходит заряд конденсатора, а при отрицательной - разряд конденсатора , фиксация состояния компаратора а также считывание состояния таймера TMR0.... Идея далеко не нова- фрагмент чисто учебный . За основу взят стандартный пример применения AN958 PIC 10F202,204 с официального сайта Microchip-
http://www.microchip.com/stellent/id...pnote=en021266 поищи в сети - там правда все на асемблере- вот я для развития и пытаюсь перевести подобное на Си плюс адаптировать для сети 50Гц а не 60 как в штатах Код:
unsigned short t,old_GPIO; // НАЧАЛЬНАЯ ИНИЦИАЛИЗАЦИЯ void init() { CMCON = 0x07; // все выводы контроллера-цифровые TRISIO = 0x28; //выводы GPIO5,3-на ввод, остальные - на вывод OPTION_REG = 0b11000101;/* подтягивающие резисторы- выключены, активный фронт внешнего прерывания-передний,такиовый сигнал для таймера- внутренний. предделитель- перед TMR0, коэффициент деления- 1:64 */ INTCON.GIE = 0; //прерывания запрещены } void main() { init() ; // НАЧАЛЬНАЯ ИНИЦИАЛИЗАЦИЯ do { old_GPIO = GPIO; // считывания состояния портов if(old_GPIO.F5 == 1)// если на входе синхронизации полуволна положительная {TRISIO =0x28; // то настраиваем GPIO,1 на вывод old_GPIO.F1 = 1; // и выставляем на него лог 1 для зарядки конденсатора old_GPIO.F4 = 0; // выключаем светодиод GPIO = old_GPIO;} // if(old_GPIO.F5 == 0) // если на входе синхронизации полуволна положительная { CMCON = 0x04; // то конфигурируем компаратор с внутренним ИОН VRCON = 0xA3; // TRISIO = 0x2A;// настраиваем GPIO,1 как аналоговый вход компаратора TMR0 = 0; // сбрасываем таймер Delay_us(10); // задержка 10мксек для установки режима компаратора if(CMCON.F6==1){ // ждем разряда конденсатора ниже напряжения ИОН t = TMR0; // считываем показание таймера old_GPIO.F4 =1; // включаем светодиод GPIO = old_GPIO;} // } } while(1); // бесконечный цикл } |
05.05.2011, 20:04 | #829 |
Форумец
Сообщений: 4
Регистрация: 29.03.2011
Не в сети |
Спасибо, буду разбираться!
|
11.05.2011, 20:26 | #830 |
Форумец
Сообщений: 4
Регистрация: 29.03.2011
Не в сети |
Здравствуйте, уважаемые форумчане!
Никто не пробовал подключать индикатор от убитого DVD к пику? Там, вроде, I2C и пример в хелпе к микроси есть, но какой адрес устройства и какие данные/команды посылать? |
13.05.2011, 17:10 | #831 |
Форумец
Сообщений: 7
Регистрация: 17.10.2009
Не в сети |
Всем привет!!!
Запустил GLCD WG240128 пишет , рисует , просто класс!!! Но вот проблема с меню ,не знаю как мне передать из одного пункта меню 3 значения. подскажите в каком направлении копать??? на форуме микрочипа нашел кусок меню написанный petrd если есть возможность прокоментируйте как это работает, заранее спасибо typedef struct typeMenu{ unsigned char *Name; struct typeMenu *Prev; struct typeMenu *Next; struct typeMenu *Down; struct typeMenu *Up; unsigned char Flag: 1; }; extern struct typeMenu Menu_0; extern struct typeMenu Menu_1; extern struct typeMenu Menu_2; extern struct typeMenu Menu_3; extern struct typeMenu Menu_4; extern struct typeMenu Menu_4_1; struct typeMenu Menu_0 ={"Menu_0", &Menu_4, &Menu_1, 0, 0, 0}; struct typeMenu Menu_1 ={"Menu_1", &Menu_0, &Menu_2, 0, 0, 0}; struct typeMenu Menu_2 ={"Menu_2", &Menu_1, &Menu_3, 0, 0, 0}; struct typeMenu Menu_3 ={"Menu_3", &Menu_2, &Menu_4, 0, 0, 0}; struct typeMenu Menu_4 ={"Menu_4", &Menu_3, &Menu_1, &Menu_4_1, 0, 0}; struct typeMenu Menu_4_1 ={"Menu_4_1", 0, 0, &Menu_4, 0, 0}; |
31.05.2011, 20:37 | #832 |
Форумец
Сообщений: 13
Регистрация: 31.05.2011
Возраст: 33
Не в сети |
Привет всем участникам форума , у меня есть проблема на счет програмирования в MicroC используя стандартный код для управления ЖКИ 16/2 я попробывал написать код бегущей строки вроде-бы все вышло решил добавить побольше текста вышла абракодабра какая-то причем она меняется при движении строки убрал пару знаков все стало нормально пробывал как в 4-х битном так и 8-ми не помогает
|
31.05.2011, 20:52 | #833 |
Форумец
Сообщений: 13
Регистрация: 31.05.2011
Возраст: 33
Не в сети |
В последствии я так понял что переполнен стек так как MicroC выдает ошибку и отказывается компилировать также пробывал просто выводить текст на индикатор при большом объеме тоже не хочет стало ясно что это проблема самого компилятора посоветуйте как выйти из этой ситуации строго не судите так как на си только учусь програмировать, а начинал с ассемблера
|
31.05.2011, 22:08 | #835 |
Форумец
Сообщений: 13
Регистрация: 31.05.2011
Возраст: 33
Не в сети |
char *text = "mikroElektronika";
void main() { Lcd_Config(&PORTB, 4, 5, 6, 3, 2, 1, 0); // Lcd_Init_EP5, see Autocomplete LCD_Cmd(LCD_CLEAR); // Clear display LCD_Cmd(LCD_CURSOR_OFF); // Turn cursor off LCD_Out(1,1, text); // Print text to LCD, 1st row, 1st column Delay_ms(1000); LCD_Out(2,6,"mikroE"); // Print text to LCD, 2nd row, 6th column text = "RADIO AMATER UR5XCA"; LCD_Out(3,1,text); LCD_Out(4,1,"RADIO AMATER UR5XCA"); Delay_ms(1000); LCD_Cmd(LCD_CLEAR); LCD_Cmd(LCD_CURSOR_OFF); LCD_Out(5,2,"LIZUNOV KIRILL"); LCD_Out(6,1,"MY CALL UR5XCA"); LCD_Out(7,1,"123456"); } |
31.05.2011, 22:18 | #836 |
Форумец
Сообщений: 13
Регистрация: 31.05.2011
Возраст: 33
Не в сети |
Это я немного добавил текста решил попробывать когда в последнем выходе на 7-ю строку оставляю один знак то код компилируется я так понял что MicroC для хранения информации выводимой на экран ЖКИ использует стек в моем примере на 16F877A в разделе статистика видно стеки с 0-го по 15-й если я использую много текста то в GPR после 15-го стека появляется lstr2_LCD Test и так далее.
|
31.05.2011, 22:23 | #837 |
Форумец
Сообщений: 13
Регистрация: 31.05.2011
Возраст: 33
Не в сети |
А еще после неудачной компиляции в окне Message Text появляется Const truncated lstr2_LCD но прошивка создается в режиме симуляции в Proteus могут отсутствовать некоторые строки вроде самые первые в компиляторе оно как-то заменяет ели писать больше текста то пропадет предыдущий написаный ранее.
|
31.05.2011, 22:45 | #838 | ||
Форумец
|
Это не проблема компилятора, это проблема Ваших знаний языка Си и особенностей данного компилятора. Пока не пройдет компиляция без ошибок, на hex (coff) файлы нет никакого смысла смотреть и тем более их куда-то совать в симуляторы и прошивать ими контроллеры
Цитата:
Цитата:
Почитайте про указатели в Си и загляните в ассемблерный листинг - узнаете много интересного. |
||
31.05.2011, 23:25 | #840 |
Форумец
Сообщений: 13
Регистрация: 31.05.2011
Возраст: 33
Не в сети |
char;
void main() { Lcd_Config(&PORTB, 4, 5, 6, 3, 2, 1, 0); // Lcd_Init_EP5, see Autocomplete LCD_Cmd(LCD_CLEAR); // Clear display LCD_Cmd(LCD_CURSOR_OFF); // Turn cursor off LCD_Out(1,1,"abcdefg"); // Print text to LCD, 1st row, 1st column Delay_ms(1000); LCD_Out(2,6,"mikroE"); // Print text to LCD, 2nd row, 6th column LCD_Out(3,1,"hklmnop"); LCD_Out(4,1,"RADIO AMATER UR5XCA"); Delay_ms(1000); LCD_Cmd(LCD_CLEAR); LCD_Cmd(LCD_CURSOR_OFF); LCD_Out(5,2,"LIZUNOV KIRILL"); LCD_Out(6,1,"MY CALL UR5XCA"); LCD_Out(7,1,"123456"); Delay_ms(1000); LCD_Cmd(LCD_CLEAR); LCD_Cmd(LCD_CURSOR_OFF); LCD_Out(1,2,"rstuw"); } |