Перейти к содержанию

прерывания на Pic16f84a


pirojok

Рекомендуемые сообщения

доброго времени суток!

начал я разбираться в прерываниях и совсем запутался...

имею pic16f84а. Перечитал несколько документов по теме прерывания, в частности там написано:

Бит 4 INTE – Разрешение внешнего прерывания INT

1 – прерывание разрешено

0 – прерывание запрещено

Бит 3 RBIE – Разрешение прерывания по изменению сигнала на входах

RB7:RB4 PORTB

1 – прерывание разрешено

0 – прерывание запрещено

Что за штука эти внешние прерывания?

мне надо сделать прерывание по изменению сигнала на порту RB4, это возможно? остальные ноги порта будут стоять на выход.

То есть у меня как бы есть кнопка, при нажатию на которую должен происходить переход в подрограмму прерывания... я как человек обладающий поверхностными знаниями электроники до того как посмотреть как подключаются кнопки спаял такую: от плюса питания к ноге RB4 идет сначала резистор 1,5кОм, потом сама кнопка. А тут где то смотрел что кнопка замыкает +U питания на землю через резистор (то есть при нажатии 1 сменяется на 0). А у меня получается наоборот. С такой конструкцией можно работать?

но это не самое главное... по быстрому написал простую программку чтобы это все проверить:

LIST p=16F84a ; Используется PIC16F84A.

__CONFIG 03FF3H ; WDT включен, бит защиты не установлен.

OptionR equ 01h ; Option - банк1

Status equ 03h ; Регистр Status

PortB equ 06h ; Порт B

TrisB equ 06h ; Tris B - Банк1

IntCon equ 0Bh ; Регистр IntCon

org 0 ; Начать выполнение программы с нулевого адреса PC

goto START ; (с первой команды подпрограммы START).

org 4 ; Назначение вектора прерывания (назначается, если

; в программе используются прерывания).

bsf PortB,1

bcf IntCon,0

nope nop

goto nope

retfie

START ;bsf OptionR,6

;bsf IntCon,3

;bsf IntCon,7

clrf IntCon

bsf Status,5

bcf TrisB,1

bsf TrisB,0

bsf TrisB,4

bsf TrisB,5

bsf TrisB,6

bcf Status,5

loop bsf PortB,1

movlw .255

movwf 0Eh

call delay

bcf PortB,1

movlw .255

movwf 0Eh

call delay

goto loop

delay movlw .255

movwf 0Fh

lo decfsz 0Fh,1

goto lo

decfsz 0Eh,1

goto delay

return

end

по идее когда нет прерывания после включения питания должен моргать светодиод на RB,1 когда прерывание было он должен просто гореть. Однако при заливке всего этого в МК никаких видимых сподвижений выполнения программы не наблюдается... ничего не горит проще говоря... не подскажете где ошибка?

Схема примерная во вложении.

ну и плюс к тому там через резистор кнопка к RB4 подключена

post-8340-1167206745_thumb.jpg

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

ага, с этим все нормально. если в той же программе ставишь clrf IntCon то есть запрет всех прерываний, то огоньки нормально мигают.. а если вот так вот, то глухо

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Ничё не понял в инициализации...

Значиццо так, по даташиту указано:

OPTION_REG equ 81h

PortB equ 06h

TrisB equ 86h

Остальные регистры вроде в обоих банках присутствуют.

И вообще, #include <p16f84a.inc> ещё никто не отменял, или ты MPLAB никогда не использовал?

Кстати, можно использовать встроенные в МК pull-up (подтягивающие резисторы) командой "bcf OPTION_REG,7"

тогда можно кнопку припаять пямо к выводу МК и к земле: нажал - 0, отпустил - 1.

Изменено пользователем yaroslav
Ссылка на комментарий
Поделиться на другие сайты

я по симулятору смотрел как оно все работает. регистры то меняются... сейчас попробую вложить его. А trisB я меняю из 1 го банка (после bsf Status,5). С путаницей надо бы разобраться... действительно

на прерывание от чего распространяется регистр INT из IntCon?

я его в программе тоже в 1 поставил

Ссылка на комментарий
Поделиться на другие сайты

хммм... заработало...

LIST p=16F84a

__CONFIG 03FF3H

#include <p16f84a.inc>

org 0 ;начало программы

goto START

org 4

movlw B'00001110'

movwf PORTB

bcf INTCON,0

nope nop

goto nope

retfie

START movlw b'10010000' ; ставим глобальное разрешение прерываний(7), и разрешение прерыванию по изменению INT (4)

movwf INTCON

bsf STATUS,RP0 ; выбираем банк 1

bcf 01h,6 ; это у нас регистр опшн, ибо по адресу 86h ассемблер не хочет обращаться, пишет не тот банк

bcf 01h,7 ; ставим подтягивающие резисторы на порты Б и выбираем фронт сигнала прерывания

movlw B'10000000' ; RB0 на вход, остальные на выход

movwf 06h

bcf STATUS,RP0 ; опять в банк 0

loop movlw B'00001010' ; загораются светодиоды RB1 RB3

movwf PORTB

movlw .255

movwf 0Eh

call delay ; тут у нас задержка формируется

movlw B'00000100' ; загорается RB2, RB1 RB3 гаснут

movwf PORTB

movlw .255

movwf 0Eh

call delay

goto loop

delay movlw .255

movwf 0Fh

lo decfsz 0Fh,1

goto lo

decfsz 0Eh,1

goto delay

return

end

при включении мигают светодиоды, замыкаем контакты первого диода остальные три перестают моргать. но тут прерывания устанавливается 4 битом INTCON'a а это только по изменению входа RB0, а по RB4 можно сделать? сейчас буду экспериментировать....

спаибо ярослав!!! без подтягивающий резисторов что то не работало....

Ссылка на комментарий
Поделиться на другие сайты

Так как раз прерывания по изменению RB4:RB7 не четвёртым битом INTCON (INTE) устанавливаются, а третьим (RBIE).

И ещё, чего ты явно адреса регистров прописываешь если #include <p16f84a.inc> уже написал? Там же всё уже проименовано и присвоено:

надо регистр опшн - пиши OPTION_REG, а не 86h

и биты тоже можно называть своими именами - INTE, RBIE, GIE и т.д.

А если ассемблер пишет что-то про банки, то это может быть просто предупреждение, а не ошибка - заботится, так сказать, чтоб программер не забыл банки переключать :D

Ссылка на комментарий
Поделиться на другие сайты

Вот эту часть твоей проги:

START movlw b'10010000'; ставим глобальное разрешение прерываний(7), и разрешение прерыванию по изменению INT (4)
movwf INTCON
bsf STATUS,RP0; выбираем банк 1
bcf 01h,6; это у нас регистр опшн, ибо по адресу 86h ассемблер не хочет обращаться, пишет не тот банк
bcf 01h,7; ставим подтягивающие резисторы на порты Б и выбираем фронт сигнала прерывания
movlw B'10000000'; RB0 на вход, остальные на выход
movwf 06h

я бы написал так:

START movlw b'10001000'; ставим глобальное разрешение прерываний (7), и разрешение прерываний по изменению RB4:RB7 (3)
movwf INTCON
bsf STATUS,RP0; выбираем банк 1
bcf OPTION_REG, NOT_RBPU; ставим подтягивающие резисторы
bcf OPTION_REG, INTEDG; выбираем фронт сигнала прерывания
movlw B'00010000'; RB4 на вход, остальные на выход
movwf TRISB

Ссылка на комментарий
Поделиться на другие сайты

ну да это предупреждения... как то чтобы перестраховаться решил уж. а то не переключая банк обращаешься к OPTION_REG (тоесть 81h) пишет что не тот банк или типа того, если переключишь банк, обратишься к 81h опять пишет не тот банк... а если переключишь и обратишься к 01h то все гладко... так как правильно то делать? :) а то зачем тогда OPTION_REG и TRISB прописывали в p16f84a.inc?

Ссылка на комментарий
Поделиться на другие сайты

Да не обращай внимания на эти предупреждения - это у компилятора паранойя :lol: (ну можно их вообще отключить, выставить более низкий уровень "заботливости" :D ). Если ты уверен, что не забыл переключить банк перед обращением к регистрам типа OPTION_REG или TRISB, то прога будет работать нормально ;)

А на 01h и не должен ругаться, потому что он в нулевом банке находится :)

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Задравствуйте, не поможете разобрать, а тоя я тоже немного запутался с прерываниями pic16f84a, значит я устанавливаю в INTCON биты GIE и INTE, в OPTION_REG не изменяю значение INTEDG (тоесть в intedg нахотится единица, тоесть прирывание по возрастанию напряжения), так вот после запуска основная программа работает, но если взять кусок провода и просто прикоснутся к ноге int (6 ного в DIP корпусе) то возникает прирывание, если нога не подключена или подключена на землю то прирывания не происходит. Так вот вопрос неужто те миливольты которые появляются как разница потенциалов на концах проволки, достаточны для прерывания ? я думал для возникновения прирывания там должно быть чтото около 5 вольт. Если INTEDG поменять на ноль тоесть прирывание должно возникать при падени напряженя, а 6 ножку подключить через резистор на 470 ом и кнопку на 5 вольт, то про запуске микроконтролера сразу вызывается прирывание, и начинает выполнятся постояно не зависимо от того нажата кнопка или нет. не подскажите в чем проблема ?

П.С А прирывания в очередь ставятся ? дрожание кнопки может привести что прирывание поаторяется многократно ?

Изменено пользователем geka134
Ссылка на комментарий
Поделиться на другие сайты

Задравствуйте, не поможете разобрать, а тоя я тоже немного запутался с прерываниями pic16f84a, значит я устанавливаю в INTCON биты GIE и INTE, в OPTION_REG не изменяю значение INTEDG (тоесть в intedg нахотится единица, тоесть прирывание по возрастанию напряжения), так вот после запуска основная программа работает, но если взять кусок провода и просто прикоснутся к ноге int (6 ного в DIP корпусе) то возникает прирывание, если нога не подключена или подключена на землю то прирывания не происходит. Так вот вопрос неужто те миливольты которые появляются как разница потенциалов на концах проволки, достаточны для прерывания ? я думал для возникновения прирывания там должно быть чтото около 5 вольт. Если INTEDG поменять на ноль тоесть прирывание должно возникать при падени напряженя, а 6 ножку подключить через резистор на 470 ом и кнопку на 5 вольт, то про запуске микроконтролера сразу вызывается прирывание, и начинает выполнятся постояно не зависимо от того нажата кнопка или нет. не подскажите в чем проблема ?

П.С А прирывания в очередь ставятся ? дрожание кнопки может привести что прирывание поаторяется многократно ?

6 нога(INT0) работает как прерывание по фронту (т.е во время изменения с 0 на 1 или наоборот). Так что если будешь водить проволочками, то вполне вероятно что будут возникать прерывания. Если тебе не нужно это прерывание можешь его отключить, выставив в регистре INTCON бит INTE в 0, тогда этот вывод будет работать как вывод общего назначения RB0. Если тебе нужны прерывания по уровню, то необходимо использовать другие выводы RB4-RB7, в регистре INCON необходимо выставить бит RBIE в 1 и затем определять прерывание по флагу RBIF находящемся в INTCON. Дребезг контактов приводит к многократному прерыванию. Если дребезг небольшой, то можно воспользоваться простой RC цепочкой для его устранения :)

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Сколько лет часам? Может просто батарейка сдохла и все проблемы. В аккумуляторе стоит контроллер, он и решает что и как делать, а здесь ваши домыслы без замеров и прочего.
    • Верно, сымитировать реальную ситуацию. И не от "Кроны", а от более мощного источника, способного дать 2-3А току (нагрузка 4 Ома). Также можно проверить и симисторную защиту, только вместо предохрана включите эл. лампу накаливания на 220В и подайте вольт 40 от усилителя (с шины питания). Фейерверки при тестах как бы не нужны, по понятным причинам.
    • Точило это ногами видимо крутить, оборотов до 200 в мин. А если шлифмашина или заточной станок с оборотами от 2000 и выше то не только разлетается но и травмирует не хило.
    • Правильней будет сказать: никто не видел, чтобы его били. Ещё подсветку проверьте - сильно ли нагревается экранчик от неё?
    • С каких пор микросхема стабилизатора напряжения, включенная по схеме стабилизатора же напряжения, стала работать ещё и ограничителем тока?
    • Ну вот, пока готовил эскиз, на все вопросы ответили :-) Действительно, в 3D моделях DipTrace нет (или не нашёл) модели корпуса ТО220 с распайкой с нижней стороны и креплением к радиатору - по этому и получился такой 3D-портрет платы. Задуманная конструкция выглядит примерно так:  По факту, для наладки, сейчас подключаю транзисторы, закрепленные на радиаторе, проводами.
    • Чтобы потом не допиливать паровоз до истребителя. Заводские варианты схемотехники куда более предсказуемы. Из "вольностей" в первую очередь как-то решать проблему коммутации, подходящий переключатель для режимов искать история долгая и грустная. Что-то там с реле. На диапазоны 6п4н вроде же ?  пг2 хрен найдёшь, п2г тугое неудобство(  Рассыпушный ацп делать, боже упаси. Ну разве что был грешен, побаловался когда-то пнч-ацп. С 1108пп1 и 155 серией
×
×
  • Создать...