|
|
|
|
А вот и набросок графа - для одного входа (для каждого входа всё будет аналогично). Попытка отобразить в первом приближении работу обработчика прерывания по переполнению таймера. http://www.pic16.nm.ru/likbez1/graf4_02.gif Прошу анализировать и при возможности - критиковать. |
|
|
Всем привет! Давно читаю эту ветку.Решил в который раз заняться ПИКом. Но вот какая засада.При инициализации в TRISA вначале '0F'h,когда пытаюсь забросить туда нули,movlw 00h,mowf TRISA ,то там почему-то оказывается '20'h. Почему бы это? Заранее благодарен. |
|
|
ИМХО задачка достаточно сложная для заданного типа контроллера. Полагаю прерывание надо делать по переполнению аппаратного таймера, чтобы в программный счетчик +1 вгонять ( не пропустить его переполнение ) и только! Все остальное в бесконечном цикле..и этой задачкой он будет забит полностью.... |
|
|
Прошу прощения за описку. Вначале в TRISA находится 'FF'h |
|
|
Nikus: Почему бы это? Телепаты в отпуске. Укажите конкретно тип МК. Приаттачьте кусок программы, где это проявляется. Тогда можно будет что-то определённое сказать. Vlad_Petr: Все остальное в бесконечном цикле В этой задаче максимальная частота импульсов на входе около 50 Гц по условию, и длительность импульса не менее 1 мс. Так что, проверяя уровни на входах раз в 500 или 512 мкс - думаю, ничего не упустим. В крайнем случае сделаем t поменьше.
|
|
|
to picmaniac : Ну вообще-то я так понял,в этой ветке по умолчанию p16f628 применяется.У меня p16f628a. В приаттаченом куске ничего такого нет.Пока ещё не разобрался с настройкой конфигурации даже.Попозжа... А непонятная ситуация начинается с последней строки.До этого и после всё идёт пучком... 64003.txt |
|
|
И обязательно ли писать так: movlw B'00000000' movwf TRISA movlw B'00000000' movwf TRISB movlw B'00000000' movwf OPTION_REG а так можно?: movlw B'00000000' movwf TRISA movwf TRISB movwf OPTION_REG |
|
|
Nikus: Но вот какая засада.При инициализации в TRISA вначале '0F'h,когда пытаюсь забросить туда нули,movlw 00h,mowf TRISA ,то там почему-то оказывается '20'h. Да потому, что RA5 не может работать, как выход. Он всегда вход. b'00100000' = '20'h Nikus: movlw B'00000000' movwf TRISA movlw B'00000000' movwf TRISB movlw B'00000000' movwf OPTION_REG а так можно?: movlw B'00000000' movwf TRISA movwf TRISB movwf OPTION_REG Можно. А еще проще, clrf TRISA clrf TRISB clrf OPTION_REG Что касается вашего текста программы, то это какие-то черновые наметки. Что заметил, навскидку: неверно прописаны адреса ваших регистров (cblock 0x0C - так нельзя), лишняя команда в прерывании, отсутствует сброс флага прерывания. В инициализации порта А вроде все верно - как в даташите. picmaniacу. Сейчас начну писать программу. 
|
|
|
Zandy Вы правы,это пока были черновые наброски.Действительно,как это я упустил из виду RA5?Сейчас доделал немного.В Протеусе запустил.Мигают диоды(правда у меня немного другая схема). Только вот не могу пока разобраться как программировать TMR0,вернее как рассчитать значения для нужных задержек?Может кто ткнёт носом?В даташите многое непонятно.Например:"...любые команды записи в TMR0,сбрасывают предделитель."Как это понять?Что именно сбрасывают?Где? Zandy: cblock 0x0C - так нельзя если не трудно ,подскажите как правильно.
|
|
|
Nikus , см. карту памяти в даташите. Для PIC16F628(A) свободные регистры ОЗУ начинаются с адреса 020h. Это для 84-го с 0Ch. Поэтому cblock 0x20. Любые команды записи в TMR0 сбрасывают недоступный программно предделитель, т.е записывают в него 0. Это если предделитель подключен перед TMR0. Почитайте статьи ASD в "Радио".
|
|
|
|
|