Свежие обсуждения
Микроконтроллеры

Ликбез по программированию PIC

1 68 99

А вот и набросок графа - для одного входа (для каждого входа всё будет аналогично). Попытка отобразить в первом приближении работу обработчика прерывания по переполнению таймера. 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 в "Радио".