Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
PIC контроллеры. Программаторы и первый проект на PIC |
Программирование микроконтролеров,ремонт аудио/видео/бытовой техники,полезные устройства для дома,телефония, обсуждение статей журнала Радио |
|
Опции темы |
28.09.2009, 18:28 | #302 | |||
Форумец
Сообщений: 35
Регистрация: 30.06.2009
Возраст: 47
Не в сети |
Пример не рабочий.
Цитата:
Но в будущем хочу сделать, чтоб допустим одной кнопкой переключать разные действия типа программы, друг за другом. А вот это работает. Цитата:
Цитата:
Последний раз редактировалось RN3QGA; 28.09.2009 в 20:29. |
|||
28.09.2009, 21:02 | #303 | ||
Форумец
|
Цитата:
Первая. Зачем Вы в цикле сделали это: Код:
trisio:=0; Вторая. Вот здесь: Код:
... else begin trisio:=0; // это Вы уберёте (уже убрали) Gpio:=0xff; Delay_ms(300); Gpio:=0x00; end; ...... Цитата:
Код:
procedure Vdelay_ms(time_in_ms : word) |
||
28.09.2009, 21:14 | #304 | |
Форумец
Сообщений: 35
Регистрация: 30.06.2009
Возраст: 47
Не в сети |
Все понял. Спасибо.
Про Delay - Да совершенно верно, менять задержку по ходу программы. Буду смотреть. Цитата:
А как можно обработать поочередно нажатие. чтоб нужная часть кода срабатывала, допустим 1 раз - 1код., еще раз 2 код, и т д. по кругу? |
|
28.09.2009, 21:22 | #305 |
Форумец
Сообщений: 552
Регистрация: 17.06.2005
Возраст: 40
Не в сети |
petrd, А вы с емкостными кнопками, а точнее со слайдерами дело не имели случаем?
Пытаюсь тут сделать его по микрочиповской технологии( 2 треугольных электрода), получается ерунда полнейшая. Чувствительность к боковому смещению пальца просто ужасающая. P.S. Кстати правильную форму электродов ктонибудь знает? |
28.09.2009, 21:24 | #306 |
Форумец
|
Гонют меня от ПК. Кратко - надо завести переменную-счетчик, которая меняется при каждом нажатии кнопки, а от ее состояния и плясать. Подробнее, если надо, завтра.
|
28.09.2009, 21:25 | #307 | |
Форумец
Сообщений: 35
Регистрация: 30.06.2009
Возраст: 47
Не в сети |
Так с
Цитата:
А вообще прикольная весчь PIC вот только знаний маловато. на одном желании далеко не уедешь. Жена уже у виска неделю крутит, говорит хуже пацана увлекся не оттянешь, а оно просто надоело собирать кем - то придуманное хочется разобраться самому. |
|
28.09.2009, 21:27 | #308 | |
Форумец
Сообщений: 35
Регистрация: 30.06.2009
Возраст: 47
Не в сети |
Я только хотел про переменную спросить, значит в верном направлении думаю, будем пробовать если не получиться спрошу. Спасибо.
Ну наверно что-то типа этого в примитиве конечно, работает но с одной особенностью. Чем больше задержка Delay тем кнопка не точно по нажатию срабатывает. Тратиться время я это понимаю но как обойти. Чтоб кнопка на нажатие четко срабатывала, а то перескакивает бывает. Цитата:
Последний раз редактировалось RN3QGA; 28.09.2009 в 22:30. |
|
29.09.2009, 08:44 | #309 | |
Форумец
|
Цитата:
|
|
29.09.2009, 08:50 | #310 | |
Форумец
|
Цитата:
|
|
30.09.2009, 07:58 | #311 |
Форумец
Сообщений: 35
Регистрация: 30.06.2009
Возраст: 47
Не в сети |
А чегойто я подключил к GP3 (4 нога P12F626) диод а он у меня не светится, хотя трисы в 0 выставлены, светятся только G 0,1,2. Как то одтельно подключать на до что ли ?
Про таймеры и прирывания честно говоря не совсем понятно т.к. на Си, я 0. Но попробую разобраться если что спрошу. Спасибо за помощь. |
30.09.2009, 08:19 | #312 | |
Форумец
|
Цитата:
2. К Си надо присматриваться, ибо мало кто работает с контроллерами на Паскале, а поэтому и помочь мало кто сможет. 3. С прерываниями и таймерами ничего сложного нет, просто надо один раз разобраться, а без них дальше никуда. |
|
30.09.2009, 08:50 | #313 | |
Форумец
Сообщений: 35
Регистрация: 30.06.2009
Возраст: 47
Не в сети |
Да понимаю я что к Си - но в Пасе хоть знакомый синтаксис, уж не выпускалиб тогда его вообще может уже бы и начал изучать,а так уж очень заманчиво много знакомого.
Ну уж не обессутьте как надаем просто скажите я пойму. Если не затруднит может переведете сей код под PIC12F629 на Пас уж простите за наглость. Но мне так разобраться проще. Цитата:
Допустим в первой части где эти самые прерывания, стоят - переменные и команды, например нажатия кнопок или изменения чего нибудь а как эти изменения будут попадать в While ведь он я понял выполняется сам по себе. Или наоборот в While все переменные и команды, например нажатия кнопок или изменения чего нибудь? Разьясните если не напряжно. Последний раз редактировалось RN3QGA; 30.09.2009 в 14:46. |
|
30.09.2009, 16:00 | #314 | |
Форумец
|
Цитата:
Код:
program Name_Program; // начало объявления констант, переменных, меток // // конец объявления констант, переменных, меток // начало объявления процедур и функций procedure interrupt; // подпрограмма обработки прерываниий begin if TestBit(INTCON, T0IF) = 1 then begin // здесь код, указывающий что делать, если произошло переполнение TMR0 ClearBit(INTCON, T0IF); // стирать бит надо обязательно end end; procedure Init; // подпрограмма инициализации begin end; // конец объявления процедур и функций // далее основной код программы, именно отсюда и начинается ее выполнение begin Init; // вызов процедуры инициализации INTCON.T0IE := 1; // после этой команды разрешается работа прерываний таймера 0 при условии // разрешения работы механизма прерываний INTCON.GIE := 1; // после выполнения этой команды разрешена работа механизма прерываний while true do // отсюда и до конца код вечного цикла begin //код вечного цикла end; end. Последний раз редактировалось petrd; 20.09.2010 в 10:07. |
|
30.09.2009, 22:11 | #315 |
Форумец
Сообщений: 35
Регистрация: 30.06.2009
Возраст: 47
Не в сети |
Ого. Ну это надо вникнуть подожду то что позже.
Буду осмысливать. Но как я понял без этого более менее, что - то путнее написать не пулуцца. Огромное спасибо Петр. С уважением RN3QGA. (зовут меня Игорь ну это вдруг послать куда нибудь захочется). |
02.10.2009, 10:25 | #316 |
Форумец
Сообщений: 35
Регистрация: 30.06.2009
Возраст: 47
Не в сети |
Вот тут подумал, Петр а может на конкретной задаче разобрать.
И я Вам меньше глупых вопросов задавать буду и Вам один раз написать. Если конечно это Вас устроит. Я понимаю Вам не очень то интересно мигать светодиодами да еще и Паскаль вспоминать, но уж не обижайтесь на мою, отчасти лень, отчасти назойливость. Просто редко сейчас находятся люди - ЛЮДИ. |
02.10.2009, 15:44 | #317 | |
Форумец
|
Цитата:
Код:
program Test_Program; var count, oldstate, g, old_GPIO: byte; procedure interrupt; // подпрограмма обработки прерываниий begin if TestBit(INTCON, T0IF) = 1 then begin count := count+1; if g = 255 then begin if count>6 then begin GPIO := old_GPIO; old_GPIO := not(old_GPIO) and 0x07; count := 0; end end else GPIO := 0x07; ClearBit(INTCON, T0IF); end end; procedure Init; // подпрограмма инициализации begin TRISIO := 0x18; GPIO := 0x07; OPTION_REG := 0x87; // настройка TMR0, прерывания будут каждые 65,536 ms INTCON.T0IE := 1; INTCON.GIE := 1; count := 14; oldstate := 0; g := 0; old_GPIO := 0; OSCCAL := OSCCAL; asm bsf STATUS, RP0 call 0x3FF movwf OSCCAL bcf STATUS, RP0 end; end; begin Init; while true do begin if Button(GPIO, 4, 10, 0) then oldstate := 255; if oldstate and Button(GPIO, 4, 1, 1) then begin g := not(g); oldstate := 0; end end; end. Последний раз редактировалось petrd; 20.09.2010 в 10:07. |
|
02.10.2009, 21:38 | #318 |
Форумец
Сообщений: 35
Регистрация: 30.06.2009
Возраст: 47
Не в сети |
У-ух Петр огромное спасибо.
Я вот единственное забыл сказать Вам, что я у себя на макетке переделал диоды, анодом к выводам, катодом на массу через R. Если это важно конечно. Ну я пока подожду с Вашего позволения комментария дабы лишних вопросов не задавать ну , а уж потом "держитесь". И вопросик немного в сторону. В постах выше Вы "показали" свое железо для отладки, скажите если не секрет это для работы или для души приобретено, я не буду скрывать, в принципе я могу себе позволить приобрести ну скажем черта в банке, только вот оно мне нужно или нет понять не могу, стоит ли приобретать, просто я немного помешан с детства на электронике, вот только жизнь сложилась далеко от этого, но увлечение оказывается сильней, короче нужен совет пригодится это железо мне или достаточно на макетке собирать и мучать? Но все остальное в силе через тернии к звездам. |
02.10.2009, 21:51 | #319 |
Форумец
|
1. OPTION_REG := 0x87 - настройка TMR0.
Таймер работает от внутреннего генератора (период Fosc/4 = 1 мкс), такты поступают на предделитель 1:256 и дальше собственно в 8-разрядный счетчик TMR0. Итого, переполнение и выставление флага переполнения T0IF в регистре INTCON происходит каждые 1 х 256 х 256 = 65 536 мкс. 2. Код: Код:
OSCCAL := OSCCAL; asm bsf STATUS, RP0 call 0x3FF movwf OSCCAL bcf STATUS, RP0 end; Код:
retlw xx (код 34xx) Код:
retlw xx Обычно начинающие пользуются простыми программаторами, которые успешно затирают эту константу, после чего в последней ячейке читается 3FFF, что соответствует команде ADDLW 0xFF, а следующей выполняемой командой должна быть команда с адресом 0x400, а так как физически такого адреса нет, то программа переходит на адрес 0x0000, т.е. на начало программы и получаем ненужный вечный цикл, вешающий программу. В результате в точку из которой подпрограмма вызывалась уже не вернуться. В этом случае применение этого кода не имеет смысла. Поэтому если временная точность не нужна, то этот кусок кода можно просто не использовать. Продвинутые программаторы не затирают эту константу, PICKit2 может даже провести калибровку и восстановить эту константу. Если константа затерта, то если есть возможность лучше в ячейку по адресу 0x3FF записать число 0x3480, что соответствует середине диапазона подстройки. Думаю, что если использовать чужие прошивки использующие калибровочную константу, а в прошиваемом контроллере она затерта, то и работать не будет. Вроде так. |
02.10.2009, 22:36 | #320 | |
Форумец
|
Цитата:
2. Железо мое, использую для себя и для работы. Если заниматься постоянно, то удобно, когда много делаешь макетки лепить и сопли с них убирать запаришься, я прошел через это. А если это порыв и деньги есть, то все равно жалеть не придется. 3. Сам такой, но от себя не уйти. С 1988 года в ВС СССР, потом РФ, два года окончательно никак с ними не попрощаюсь из-за должка в виде квартиры. За последние два года пришлось наверстывать, что за 19 лет не успел. |
|
03.10.2009, 07:03 | #321 | |
Форумец
Сообщений: 35
Регистрация: 30.06.2009
Возраст: 47
Не в сети |
О Петр. Да мы с Вами еще и коллеги.
Я тоже из бывших служивых, правда еще старлеем уволился и не стал ничего дожидаться. Если честно то не жалею. Но это тема другая не будем засорять эфир как говорят радиолюбители. Ок на счет девайса подумаю, може придется купить, уж очень хочется. С кодом буду разбираться, вопросы задам по ходу. Да чуть не забыл: о константах которые программатор затирает. я использую самостейный программатор Экстра пик. Мне нужно проверить затирает он или нет для начала? , и если затирает (а скорее всего затирает), то необходимо будет ручками постоянно допписывать Цитата:
Все ли я правильно понял? |
|
03.10.2009, 13:58 | #322 | |
Форумец
|
Цитата:
|
|
03.10.2009, 20:29 | #323 |
Форумец
Сообщений: 35
Регистрация: 30.06.2009
Возраст: 47
Не в сети |
И так ,скопировал, компильнул, прошил, включил - горят все три светодиода но реакции на кнопку нет. Закоментировал ASM - все заработало. Подцепил еще светодиод на GP5 и кнопку на GP3 для продолжения экспериментов. Светодиод на GP5 не мигает. Видимо нужно настраивать, вроде бы этот вывод может работать на выход или я ошибаюсь.
|
03.10.2009, 20:43 | #324 | |
Форумец
|
Цитата:
|
|
03.10.2009, 21:00 | #325 |
Форумец
Сообщений: 35
Регистрация: 30.06.2009
Возраст: 47
Не в сети |
Да, действительно все работает ОК с этим вроде понял. Так, ну теперь как подключить GP5, и еще допустим как я говорил выше нужно организовать выбор,например разного типа мигания по нажатию кнопки, в приведенном коде, где это сделать? Я понял, так (поправите конечно) видимо необходимо организовать процедуру(ы) отдельно и из цикла While вызывать их при нужном условии.
Наверное сам код здесь (пока теория попозже проверю), [PHP]procedure interrupt; // подпрограмма обработки прерываниий begin if TestBit(INTCON, T0IF) = 1 then begin count := count+1; if g = 255 then begin if count>6 then begin GPIO := old_GPIO; old_GPIO := not(old_GPIO) and 0x07; count := 0; end[/PHP] а обрабатывать переменные кнопки и т.д. в While надеюсь правильно? Последний раз редактировалось RN3QGA; 03.10.2009 в 22:23. |
04.10.2009, 20:04 | #326 | |
Форумец
|
Цитата:
Код:
..... old_GPIO := not(old_GPIO) and 0x07; -> old_GPIO := not(old_GPIO) and 0x27; ...... GPIO := 0x07; ->GPIO := 0x27; ...... Вот эта строчка: Код:
if count>6 then 3. Обрабатывать кнопки надо в вечном цикле while, можно сделать так - одна кнопка включает-выключает моргание, другая изменяет частоту. |
|
04.10.2009, 21:12 | #327 | ||
Форумец
Сообщений: 35
Регистрация: 30.06.2009
Возраст: 47
Не в сети |
Значит получается прямая зависимость от количества прерываний, но все таки одно не понял, как организовать выбор разных подпрограмм (может не совсем корректно сказано конечно), ну то есть если переменная 1 то так мигаем, если 2 то по другому, если 3 то по третьему, я конечно могу предположить, что можно в зависимости от их количества делать проверку, то есть в нашем случае к примеру
Цитата:
Цитата:
Последний раз редактировалось RN3QGA; 04.10.2009 в 22:57. |
||
05.10.2009, 11:42 | #328 | |
Форумец
|
Цитата:
Код:
program Test_Program; var count, oldstate, g, old_GPIO, flash: byte; procedure interrupt; // подпрограмма обработки прерываниий begin if TestBit(INTCON, T0IF) = 1 then begin count := count+1; //if g = 255 then //begin if count > flash then begin GPIO := old_GPIO; old_GPIO := not(old_GPIO) and 0x07; count := 0; end; // end //else //GPIO := 0x07; ClearBit(INTCON, T0IF); end end; procedure Init; // подпрограмма инициализации begin TRISIO := 0x18; GPIO := 0x07; OPTION_REG := 0x87; // настройка TMR0, прерывания будут каждые 66,304 ms INTCON.T0IE := 1; INTCON.GIE := 1; count := 14; oldstate := 0; g := 0; old_GPIO := 0; OSCCAL := OSCCAL; asm bsf STATUS, RP0 call 0x3FF movwf OSCCAL bcf STATUS, RP0 end; end; begin Init; while true do begin if Button(GPIO, 4, 10, 0) then oldstate := 255; if oldstate and Button(GPIO, 4, 1, 1) then begin g := g+1; oldstate := 0; end; case g of 0: flash := 1; // здесь может быть целая подпрограмма, а не один оператор 1: flash := 4; 2: flash := 8; 3: flash := 12 else begin g :=0; flash := 1; end; end; end; end. Про настройки таймера надо почитать datasheet, здесь перевод на русском http://www.microchip.ru/files/d-shee...12F629_675.pdf, а здесь книга про PIC16F84, но практически все подходит http://vrtp.ru/index.php?act=lib&COD...e&article=2388. Последний раз редактировалось petrd; 20.09.2010 в 10:08. |
|
06.10.2009, 09:25 | #330 | ||
Форумец
Сообщений: 35
Регистрация: 30.06.2009
Возраст: 47
Не в сети |
Ну уж все таки еще момент.
Цитата:
Цитата:
|
||