Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
 Аватар для Antu
0 / 0 / 0
Регистрация: 02.03.2013
Сообщений: 22

PIC18F14K22. MPLab. Выбор источника прерывания

03.02.2014, 19:27. Показов 2892. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток.
Имеется микроконтроллер pic18f14k22, нужно настроить прерывания по изменению логического уровня на одном из входов. Это возможно для любого из выводов PORTA и PORTB. Для настройки необходимо установить бит RABIE в регистре INTCON. Как написано в документации: "RABIE: RA and RB Port Change Interrupt Enable bit".
После соответствующей настройки портов ввода - вывода, регистра INTCON и симуляции работы в mplab 8.92 прерывания действительно срабатывают при изменении уровня любого (!) из входов PORTA и PORTB.
Теперь встала другая задача: установить по каким входам портов разрешить прерывания, а по каким запретить. В документации сказано: "RA and RB port change interrupts also require the individual pin IOCA and IOCB enable".
При настройке IOCA всё работает - прерывания не происходят по изменению уровню на отключенных входах, однако что касается IOCB совсем другая история. Настройка этого регистра не влияет ни на что. Даже если "отключить" все входы PORTB, прерывания всё равно происходят. Флаг прерывания по уровню устанавливается, изменения уровня мониторил также с помощью logic analyzer в mplab. Хотелось бы узнать в чём дело, почему так происходит.
На всякий случай привожу исходный код целиком:
Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
LIST    p=18F14k22
    #include    p18f14k22.inc
    #define tfov    .219    ; Time for timer overflow
    #define atsfrb  0x010   ; Adress to save first received byte
    #define in_pin  RA0
    #define in_port PORTA
 
    CONFIG  FOSC = HS
    CONFIG  PLLEN = OFF
    ;CONFIG PCLKEN = ON ; Primary Clock Enable bit
    ;CONFIG IESO = ON   ; Internal/External Oscillator switchover bit
    CONFIG  PWRTEN = OFF
    CONFIG  WDTEN = OFF ; Watchdog Timer Enable bit
    ;CONFIG HFOFST = OFF    ; HFINTOSC Fast Start-up bit
    CONFIG  MCLRE = OFF
    CONFIG  STVREN = OFF    ; Stack full/underflow will not cause Reset
 
    num         equ 01h 
    time_value  equ 02h ; Need for keeping tfov
    res_stat    equ 04h ; Received status
    byte_point  equ 05h ; Point to byte to write
    start_bit   equ 0
    fbr     equ 1   ; Indicator: first byte have received
 
    ORG     0x0
    GOTO        main
 
; ------------------MAIN INTERRUPT, CLEAR TIMER-------------------
    ORG     0x8
    MOVFF       time_value, TMR0L
; Need for clear RABIF flag ------------------
    MOVF        PORTB, W,  ACCESS
    BCF     INTCON, RABIF
; -------------------------------------------------------
    RETFIE
; ------------------------------------------------------------------------------------
 
; ------------------SECONDARY INTERRUPT, WRITING -------------
    ORG 0x18        ; Secondary interrupt, output
    BTFSS   res_stat, start_bit ; Check the start bit, skip if set
    GOTO    set_start
    GOTO    write_byte
 
set_start
    BTFSC   in_port, in_pin ; If in_pin=0 skip start_bit clear
    BSF res_stat, start_bit
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    GOTO    exit
 
; Begin writing byte
write_byte
    BTFSS   in_port, in_pin
    GOTO    set_0
    GOTO    set_1
set_0
    BCF INDF0, 0
    MOVLW   6
    CPFSGT  num     ; Compare f with WREG, skip >
    GOTO    shift_value ; Shift out value if the last bit not written
    GOTO    lbw     ; Last bit have written
set_1
    BSF INDF0, 0
    MOVLW   6
    CPFSGT  num     ; Compare f with WREG, skip >
    GOTO    shift_value ; Shift out_value if the last bit not written
    GOTO    lbw     ; Last bit have written
shift_value
    RLNCF   INDF0       ; Rotate Left f (No Carry)
    INCF    num
    GOTO    exit
lbw ; Last bit writing
    CLRF    num
    BCF res_stat, start_bit
    BSF res_stat, fbr   ; With this instruction time to exec on 1 cycles more
    GOTO    exit
; End writing byte
 
exit
    MOVFF   time_value, TMR0L
    BCF INTCON, TMR0IF  ; Clear interrupt flag (TMR0)
    RETFIE
; ------------------------------------------------------------------------------------
 
main
    BCF INTCON, GIE ; Disable all interrupts
; I/O setting
    CLRF    ANSEL       ; Set PORTA as digital
    CLRF    ANSELH      ; Set PORTB as digital  
    MOVLW   0xFF
    MOVWF   TRISA       ; Set PORTA on input
    MOVWF   TRISB       ; Set PORTB on input
    CLRF    TRISC       ; Set PORTC on output
; Interrupt settings
    BSF RCON, IPEN  ; Enable priority levels on interrupts
    MOVLW   b'01101000' ; Interrupt on change PORTA/B and TMR0
    MOVWF   INTCON
    MOVLW   b'10000001' ; bit-7 -  PORTA and PORTB pull-ups are disabled
                                                                           ; bit-2 = 0 - Low priority of TMR0 Overflow Interrupt
    MOVWF   INTCON2     ; bit-0 - High priority RA and RB Port Change Interrupt
    MOVLW   0xFF    
    MOVWF   IOCA        ; Interrupt-on-change enabled for PORTA
    CLRF    IOCB        ; Interrupt-on-change disabled for PORTB
; Timer0 settings
    MOVLW   b'01001000' ; bit-7 - TMR0ON=0 - Stops Timer0
    MOVWF   T0CON       ; bit-6 - T08BIT=1 - Configured as an 8-bit timer
                ; bit-5 - T0CS=0 - Internal instruction cycle clock
                ; bit-4 - T0SE=1 - Increment on l-h transition on T0CKI
                ; bit-3 - PSA=0 - Timer0 prescaler is NOT assigned
                ; bit-2:0 - Timer0 Prescaler Select bits
; Initialization
    CLRF    num
    CLRF    res_stat
    CLRF    byte_point
    MOVLW   tfov
    MOVWF   time_value
    MOVFF   time_value, TMR0L
    MOVLW   atsfrb      ; Adress to save first received byte
    MOVWF   FSR0L
 
    BSF T0CON, TMR0ON   ; Enables Timer0
    BSF INTCON, GIE ; Enable all interrupts
 
loop
    BTFSC   res_stat, fbr   ; Skip is first bit haven't received
    MOVFF   INDF0, LATC ; Send received byte on PORTC
    GOTO    loop
END
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.02.2014, 19:27
Ответы с готовыми решениями:

Механизм обработки прерывания от внешнего источника
Заранее прошу прощения за банальный(наверное) вопрос.. Я программирую микроконтроллеры и у нас это все просто и понятно... Появляется...

Выбор источника тактирования
Что лучше всего использовать в схемах с МК? Выбор таков - стандартный кварц в корпусе HC-49, SMD-кварц (мелкие корпуса 3225 и 2520) или...

Выбор источника в зависимости от радиокнопки
Здравствуйте. Есть форма, на ней 3 едит формы, в каждой форме, указан линк на архив. Тоисть адрес к русскому патчу, английскому и...

6
61 / 186 / 31
Регистрация: 14.02.2013
Сообщений: 1,695
03.02.2014, 22:58
Особо с этим не разбирался но флаги внешнего прерывания в регистрах INTCON срабатывают всегда когда порты настроены на ввод.
Если вы хотите контролировать прерывание по изменению уровня на отдельном выводе порта B0 к примеру, то используйте проверку флагов внешнего прерывания.
0
 Аватар для Antu
0 / 0 / 0
Регистрация: 02.03.2013
Сообщений: 22
04.02.2014, 01:26  [ТС]
Цитата Сообщение от VladimirU Посмотреть сообщение
Особо с этим не разбирался но флаги внешнего прерывания в регистрах INTCON срабатывают всегда когда порты настроены на ввод.
Если вы хотите контролировать прерывание по изменению уровня на отдельном выводе порта B0 к примеру, то используйте проверку флагов внешнего прерывания.
Спасибо за ответ, однако, если честно, не совсем понял что вы имели ввиду и имели ли что-то. Для того, чтобы флаг по изменению уровня установился (который единственный для случая изменения по уровню), недостаточно соответствующей настройки регистра INTCON и INTCON2. В документации также есть замечание "RA and RB port change interrupts also require the individual pin IOCA and IOCB enable", что означает что эти два регистра указывают на то, по каким выводам устанавливать флаг, а по каким нет. Так вот суть проблемы в том, что на PORTA устанавливается, а на PORTB настройка игнорируется.
0
61 / 186 / 31
Регистрация: 14.02.2013
Сообщений: 1,695
04.02.2014, 18:03
По даташиту похоже только можно по трём портам получать внешнее прерывание это RA0,RA1,RA2.
По остальным нет такой возможности.
0
 Аватар для Antu
0 / 0 / 0
Регистрация: 02.03.2013
Сообщений: 22
04.02.2014, 20:26  [ТС]
Можете привести цитату из даташита, где про это написано?
Возможно, путаете с External Interrupt, где прерывания действительно могут быть только по этим трём ногам, причём по изменению фронта, а не уровня
0
61 / 186 / 31
Регистрация: 14.02.2013
Сообщений: 1,695
04.02.2014, 22:08
Лучший ответ Сообщение было отмечено Antu как решение

Решение

Все настраивается отдельно.
Проверял в Протеусе норм работает.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
_main:
 
;3333.c,1 ::                 void main(void) {
;3333.c,2 ::                 ANSELH=0;
        CLRF        ANSELH+0 
;3333.c,3 ::                 TRISC=0;
        CLRF        TRISC+0 
;3333.c,4 ::                 LATC=0;
        CLRF        LATC+0 
;3333.c,5 ::                 TRISB=0XFF;
        MOVLW       255
        MOVWF       TRISB+0 
;3333.c,6 ::                 WPUB=0;
        CLRF        WPUB+0 
;3333.c,7 ::                 INTCON=0XC8;
        MOVLW       200
        MOVWF       INTCON+0 
;3333.c,8 ::                 IOCB=0XA0;    //настроены на прерывание только B7 и B5
        MOVLW       160
        MOVWF       IOCB+0 
;3333.c,9 ::                 }
        GOTO        $+0
; end of _main
 
_interrupt:
 
;3333.c,10 ::                 void interrupt(void)
;3333.c,12 ::                 if(INTCON.RABIF)
        BTFSS       INTCON+0, 0 
        GOTO        L_interrupt0
;3333.c,14 ::                 LATC++;               //при изменение лог. уровня инкремент портов С
        MOVF        LATC+0, 0 
        ADDLW       1
        MOVWF       R0 
        MOVF        R0, 0 
        MOVWF       LATC+0 
;3333.c,15 ::                 INTCON.RABIF=0;
        BCF         INTCON+0, 0 
;3333.c,16 ::                 PORTB.F=0;            //это не знаю почему так
        BCF         PORTB+0, 1 
;3333.c,17 ::                 }}
L_interrupt0:
L__interrupt1:
        RETFIE      1
; end of _interrupt
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void main(void) {
ANSELH=0;
TRISC=0;
LATC=0;
TRISB=0XFF;
WPUB=0;
INTCON=0XC8;
IOCB=0XA0;    //настроены на прерывание только B7 и B5
}
void interrupt(void)
{
if(INTCON.RABIF)
{
LATC++;               //при изменение лог. уровня инкремент портов С
INTCON.RABIF=0;
PORTB.F=0;            //это не знаю почему так
}}
1
 Аватар для Antu
0 / 0 / 0
Регистрация: 02.03.2013
Сообщений: 22
04.02.2014, 22:32  [ТС]
Видимо, косяк mplab. Спасибо за проверку.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.02.2014, 22:32
Помогаю со студенческими работами здесь

Выбор лабораторного источника питания
Собираюсь приобрести лабораторный источник питания. Пока что остановился на ATTEN TPR3005T-3C DC и MASTECH HY3005D-3. В связи с этим...

Ошибка. Выбор источника данных
При добавлении нового источника данных возникает ошибка после диалога "Сохранить строку подключения". Ошибка более чем непонятная,...

Выбор источника для отчета
Форумчане, помогите с кодом: вывод отчета в формате PDF осуществляется кодом: DoCmd.OutputTo acReport, "O_Podr1_Month",...

Выбор источника для подключения
Кто сталкивался с подобными задачами? Как из одного приложения подключаться к разным БД (конкретно access), с возможностью выбора. ...

Выбор типа источника данных
Работаю в Visual Studio 2008. При попытке выбрать тип источника данных на вкладке "Data Source Configuration Wizard" отсутствуют ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru