Например TDA7294

Форум РадиоКот • Просмотр темы - Проблемы с прерыванием по таймеру 16F84A
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Вс дек 28, 2025 08:11:47

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Проблемы с прерыванием по таймеру 16F84A
СообщениеДобавлено: Вс окт 13, 2013 08:31:52 
Открыл глаза
Аватар пользователя

Карма: 1
Рейтинг сообщений: 10
Зарегистрирован: Пт июл 19, 2013 15:08:01
Сообщений: 44
Откуда: Дальний Восток
Рейтинг сообщения: 0
Доброго времени суток, товарищи.. Решил сегодня продолжить изучение микроконтроллеров и надумал обучиться работе с таймером и прерыванием на простейшем контроллере..
Весь день мучался: написал простенький код в 20 машинных слов для мигания светодиодом с различимым интервалом, однако, результат совершенно не тот который я задумывал: светодиод мигает (как бы странно это ни выглядело) со случайным интервалом..
Помогите разобраться: что я делаю не так и действительно ли я написал генератор псевдослучайных чисел?

Код:
Код:
LIST P=PIC16F84A
__config 0x3FF1

STATUS      EQU         .0003
INTCON      EQU         .0011
OPTION_REG  EQU         .0001
TMR0        EQU         .0001
RP0         EQU         .0005
w           EQU         .0000
f           EQU         .0001
PORTB       EQU         .0006
TRISB       EQU         .0006
Rsec        EQU         .0015

      org   0
      goto START

      org   04h
      goto main

START
      bsf         STATUS,RP0      ;BANK1
      movlw       b'00000111'
      movwf       OPTION_REG
        clrf        TRISB
      bcf         STATUS,RP0      ;BANK0
      movlw       b'10100000'
      movwf       INTCON
        clrf        Rsec

loop
      goto        loop

;----------

main
        incf        Rsec, f
        btfsc       Rsec, 7
        retfie

        clrf        Rsec
        comf        PORTB, f
        retfie

        end


писал в MPLAB
прошивал в PicKit2
кварц на 4 мГц


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблемы с прерыванием по таймеру 16F84A
СообщениеДобавлено: Вс окт 13, 2013 09:11:48 
Друг Кота
Аватар пользователя

Карма: 30
Рейтинг сообщений: 156
Зарегистрирован: Пн июл 28, 2008 22:12:01
Сообщений: 3604
Рейтинг сообщения: 0
Здесь хорошие уроки http://www.gooligum.com.au/tut_midrange.html
Конкретно по прерываниям http://www.gooligum.com.au/tutorials/mi ... id_A_6.pdf
И эта замечательная книга http://rghost.ru/49342639

К Вам вопрос - что и кто Вам насоветовал 84?
Выбор ИМХО совершенно не понятен .


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблемы с прерыванием по таймеру 16F84A
СообщениеДобавлено: Вс окт 13, 2013 09:21:15 
Открыл глаза
Аватар пользователя

Карма: 1
Рейтинг сообщений: 10
Зарегистрирован: Пт июл 19, 2013 15:08:01
Сообщений: 44
Откуда: Дальний Восток
Рейтинг сообщения: 0
пару месяцев назад нашел схемку программатора на 3-х резисторах, который прошивает 84-й, поэтому и приобрел его..
сейчас, конечно, есть уже и 628-й и 887-й, однако, в них много регистров, которые пока не совсем ясны, вот и балуюсь пока на 16F84А..


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблемы с прерыванием по таймеру 16F84A
СообщениеДобавлено: Вс окт 13, 2013 09:56:19 
Друг Кота
Аватар пользователя

Карма: 30
Рейтинг сообщений: 156
Зарегистрирован: Пн июл 28, 2008 22:12:01
Сообщений: 3604
Рейтинг сообщения: 0
CaseBot писал(а):
однако, в них много регистров, которые пока не совсем ясны, вот и балуюсь пока на 16F84А..


Что мешает изучать периферию постепенно , практически вся она отключена изначально . Единственно порты при старте могут находится в аналоговом режиме.


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: Проблемы с прерыванием по таймеру 16F84A
СообщениеДобавлено: Вс окт 13, 2013 10:13:33 
Открыл глаза
Аватар пользователя

Карма: 1
Рейтинг сообщений: 10
Зарегистрирован: Пт июл 19, 2013 15:08:01
Сообщений: 44
Откуда: Дальний Восток
Рейтинг сообщения: 0
Но ведь если в данном контроллере есть таймер и прерывание, то они должны работать..
И должна быть причина такому поведению..


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблемы с прерыванием по таймеру 16F84A
СообщениеДобавлено: Вс окт 13, 2013 10:45:14 
Друг Кота
Аватар пользователя

Карма: 50
Рейтинг сообщений: 1398
Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7321
Откуда: 845-й км.
Рейтинг сообщения: 1
Медали: 1
Получил миской по аватаре (1)
Инициализацию не смотрел, а в прерывании написана какая-то глупость.

CaseBot писал(а):
Код:
main
        incf        Rsec, f
        btfsc       Rsec, 7
        retfie

        clrf        Rsec
        comf        PORTB, f
        retfie

Получается так, что вы инкрементируете Rsec и когда оно досчитает до 128 должно что-то выполняться. Однако получается наоборот. На каждом шаге вы уходите на clrf Rsec и дальше совсем непонятная конструкция - зачем вам комплиментарное от портаБ? Это раз.

Второе, обрабатывая прерывание вам надо снимать флаг запроса прерывания. Т.е. если прерывание вызвалось по флагу от T0IF - его надо снять внутри прерывания, иначе выйдя из прерывания прерывание снова произойдет сразу!

Ну и научитесь еще и сохранять контекст. В данном примере это не актуально, но в будущем оно будет нужно.

p.s. И еще, бросайте эту дурную затею с толпой EQU... напишите просто include "p16f84.inc" и пользуйтесь на здоровье.


Последний раз редактировалось uldemir Вс окт 13, 2013 13:29:00, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблемы с прерыванием по таймеру 16F84A
СообщениеДобавлено: Вс окт 13, 2013 12:10:22 
Открыл глаза
Аватар пользователя

Карма: 1
Рейтинг сообщений: 10
Зарегистрирован: Пт июл 19, 2013 15:08:01
Сообщений: 44
Откуда: Дальний Восток
Рейтинг сообщения: 0
uldemir писал(а):
Получается так, что вы инкрементируете Rsec и когда оно досчитает до 128 должно что-то выполняться. Однако получается наоборот. На каждом шаге вы уходите на clrf Rsec

ну с этим я разобрался, просто когда готовил код (обрезал лишнее) поспешил и перепутал, но суть не в этом, до этого совершенно иными способами прореживался интервал..

uldemir писал(а):
и дальше совсем непонятная конструкция - зачем вам комплиментарное от портаБ? Это раз.

комплементарное? впервые слышу.. здесь http://www.microchip.ru/?mid=3&cid=46 написано иначе
а на этой страничке http://labkit.ru/html/Assembler_for_PIC?id=334 учат использовать команду "сравнения" XORWF, из за которой я не так давно пол дня убил на поиск ошибки..

uldemir писал(а):
Второе, обрабатывая прерывание вам надо снимать флаг запроса прерывания. Т.е. если прерывание вызвалось по флагу от T0IF - его надо снять внутри прерывания, иначе выйдя из прерывания прерывание снова произойдет сразу!

да, Вы правы.. я думал его необходимо снимать только для идентификации источника прерывания (чтобы узнать что вызвало прерывание)

uldemir писал(а):
Ну и научитесь еще и сохранять контекст. В данном примере это не актуально, но в будущем оно будет нужно.

а вот здесь не совсем понятно что Вы имели ввиду

Благодарю за оперативную помощь..


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблемы с прерыванием по таймеру 16F84A
СообщениеДобавлено: Вс окт 13, 2013 12:28:27 
Друг Кота

Карма: 27
Рейтинг сообщений: 1283
Зарегистрирован: Ср фев 11, 2009 20:35:58
Сообщений: 7853
Рейтинг сообщения: 0
Посмотри пример от производителя и не иди по пути горе учителей из инета.
c:\Program Files\Microchip\MPASM Suite\Template\Code\PIC16F84


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблемы с прерыванием по таймеру 16F84A
СообщениеДобавлено: Вс окт 13, 2013 12:29:29 
Друг Кота
Аватар пользователя

Карма: 50
Рейтинг сообщений: 1398
Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7321
Откуда: 845-й км.
Рейтинг сообщения: 1
Медали: 1
Получил миской по аватаре (1)
Претензия за "комплиментарное" снимается. Действительно, микрочип просто инвертирует все биты (а не инвертирует и прибавляет 1).

Сохранение контекста:
Цитата:
Код:
EXAMPLE 8-1: SAVING STATUS AND W REGISTERS IN RAM
    PUSH MOVWF W_TEMP ; Copy W to TEMP register,
    SWAPF STATUS, W ; Swap status to be saved into W
    MOVWF STATUS_TEMP ; Save status to STATUS_TEMP register
ISR : :
: ; Interrupt Service Routine
: ; should configure Bank as required
: ;
    POP SWAPF STATUS_TEMP, W ; Swap nibbles in STATUS_TEMP register
; and place result into W
    MOVWF STATUS ; Move W into STATUS register
; (sets bank to original state)
    SWAPF W_TEMP, F ; Swap nibbles in W_TEMP and place result in W_TEMP
    SWAPF W_TEMP, W ; Swap nibbles in W_TEMP and place result into W
Эта конструкция сделает так, что при вызове прерывания можно установить любую страницу памяти, изменить значение аккумулятора, а по возвращении они восстановятся в то состояние которое было перед вызовом. Чтобы основная программа не потеряла бы данные. Это важно, если основное тело хоть чуть сложнее чем loop: goto loop.

Еще один момент.
Код:
      movlw       b'10100000'
      movwf       INTCON
      clrf        Rsec
Инициализировать Rsec следует до разрешения прерываний. иначе может быть ситуация, что прерывание уже ждёт и при разрешении сразу же вызывется. А значение переменной, которое используется в прерывании не определено. В результате возможны трудноуловимые глюки, с которыми трудно бороться.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблемы с прерыванием по таймеру 16F84A
СообщениеДобавлено: Вс окт 13, 2013 12:57:35 
Открыл глаза
Аватар пользователя

Карма: 1
Рейтинг сообщений: 10
Зарегистрирован: Пт июл 19, 2013 15:08:01
Сообщений: 44
Откуда: Дальний Восток
Рейтинг сообщения: 0
uldemir писал(а):
Эта конструкция сделает так, что при вызове прерывания можно установить любую страницу памяти, изменить значение аккумулятора, а по возвращении они восстановятся в то состояние которое было перед вызовом. Чтобы основная программа не потеряла бы данные. Это важно, если основное тело хоть чуть сложнее чем loop: goto loop.
Да, про это я знаю.. Опустил для упрощения кода..

uldemir писал(а):
Инициализировать Rsec следует до разрешения прерываний. иначе может быть ситуация, что прерывание уже ждёт и при разрешении сразу же вызывется. А значение переменной, которое используется в прерывании не определено. В результате возможны трудноуловимые глюки, с которыми трудно бороться.
Про это я не подумал, буду знать..
Еще раз спасибо..


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблемы с прерыванием по таймеру 16F84A
СообщениеДобавлено: Пн окт 14, 2013 08:57:26 
Сверлит текстолит когтями
Аватар пользователя

Карма: 22
Рейтинг сообщений: 81
Зарегистрирован: Пн дек 08, 2008 10:58:48
Сообщений: 1262
Откуда: Винница
Рейтинг сообщения: 0
http://www.pic24.ru/doku.php/osa/articl ... formatting


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблемы с прерыванием по таймеру 16F84A
СообщениеДобавлено: Пт ноя 29, 2013 19:23:58 
Открыл глаза
Аватар пользователя

Карма: 1
Рейтинг сообщений: 10
Зарегистрирован: Пт июл 19, 2013 15:08:01
Сообщений: 44
Откуда: Дальний Восток
Рейтинг сообщения: 0
urry писал(а):
http://www.pic24.ru/doku.php/osa/articles/mpasm_formatting

Благодарю, то что надо для начинающего программиста :solder:


Нарушение пункта 2.7 Правил форума


Последний раз редактировалось AlekseyEnergo Вс дек 01, 2013 11:11:16, всего редактировалось 1 раз.
.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y