Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

Помогите с PIC 16F873 и прерыванием по RB0

Непрочитано 20.09.2010, 18:37  
BorisVV
Прохожий
 
Регистрация: 29.07.2010
Сообщений: 6
Сказал спасибо: 2
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
BorisVV на пути к лучшему
Вопрос Помогите с PIC 16F873 и прерыванием по RB0

Доброго вам времени суток, товарищи форумчане. Столкнулся вот с чем:
Никак не реагирует PIC на прерывания в протеусе..И вообще как в протеусе несколько странно работает I2C странно работает, но об этом ниже..
Суть такая в двух словах. ЕСТЬ PIC 16f873 и 24С64а. Есть кнопка, присоединенная к RB0 и переключатель, присоединенный к RB1. При нажатии на кнопку(RB0) программа переходит в подпрограмму прерываний и оценивает положение переключателя, в зависимости от этого записывает во внешнюю EEPROM (24c64A) или 1, или 2. И собственно последовательно записывает это в ячейки памяти 24C64A. Но пик никак не реагирует на кнопку(прерывание не происходит)
Прилагаю схему, начерченную в протеусе( уж за кривизну линий простите -первый раз черчу)Вместо 24С64a использую 24lc64(так то вроде как в работе разницы быть не должно) и переключатели( вместо кнопки) одинаковые( так что тоже разницы вроде как нет). http://www.fayloobmennik.net/130065 - схема протеуса
И собственно исходник прошивки.
http://www.fayloobmennik.net/130058
Но дело не только в этом. Выше я писал что протеус как-то странно отображает работу. Вот пример:
Беру заведомо исправную программу из самоучителя Корабельникова Е.А. по пикам. Суть ее в том, что бы при включении питания пик последовательно записал цифры в адреса ЕЕПРОМ. Прошиваю этот виртуальный пик..И при моделировании выходит ошибка DATA written SSPBUF whilst MSSP (in I2C master mode) is active – data has been ignored. Соответсвенно в ЕЕПРОМ ничего не пишется((.
Исходник этой программки тоже прилагаю http://www.fayloobmennik.net/130064
За корявость написания прошу сильно не пинать- студент я, пока учусь только))
Реклама:
BorisVV вне форума  
Сказали "Спасибо" BorisVV
warel (27.06.2019)
Непрочитано 20.09.2010, 19:14  
BorisVV
Прохожий
 
Регистрация: 29.07.2010
Сообщений: 6
Сказал спасибо: 2
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
BorisVV на пути к лучшему
По умолчанию Re: Помогите с PIC 16F873 и прерыванием по RB0

;************************************************* **********************************************
; scan.asm
; PIC16F873 Кварц 4 мГц.
;================================================= ==============================================
LIST p=16F873 ; Установка типа микроконтроллера.
__CONFIG 3F71h ; Включено XT генератор ,PWRT, сброс BOR. Выключена защита ,WDT,LVP, Debug
;================================================= ==============================================
; Определение положения регистров специального назначения.
;================================================= ==============================================
Status equ 03h ; Регистр выбора банка.
TrisB equ 06h ; Регистр выбора направления работы В
TrisC equ 07h ; Регистр выбора направления работы выводов порта С.
PortB equ 06h ; Регистр управления защелками порта В.
OptionR equ 01h ; Регистр выбора работы прерываний по фронту, подключения подтягивающих резисторов
Intcon equ 0Bh ; Регистр разрешения прерываний
SSPStat equ 14h ; Регистр статуса модуля MSSP
SSPCon equ 14h ; Регистр управления модуля MSSP
SSPCon2 equ 11h ; Регистр управления модуля MSSP (б1)
SSPAdd equ 13h ; Регистр управления скоростью обмена (б1)
SSPBuf equ 13h ; Регистр передающего буфера
PIR1 equ 0Ch ; Регистр флагов прерываний от переферийных модулей

;================================================= ==============================================
; Определение названия и положения регистров общего назначения.
;================================================= ==============================================
Registr equ 21h ; Регистр сохранения данных перед записью в EEprom
W_Temp equ 22h ; Регистр сохранения W перед записью
Stat_Temp equ 23h ; Регистр сохранения данных Status перед записью
SecH equ 24h ; Старшый байт счетчика сканирования изменения уровня на R0
SecL equ 25h ; Младшый байт счетчика сканирования R0
Adr_L equ 26h ; Младший Регистр используемый для временной записи адреса записи
Adr_H equ 27h ; Старшый регистр записи адреса
CountPagL equ 28h ; Количестов байтов в одном блоке(256)
CountPagH equ 29h ; Количество блоков (32)
;================================================= ==============================================
; Определение места размещения результатов операций и бита выбора банка
;================================================= ==============================================
F equ 1 ; Результат направить в регистр
SSPIF equ 3 ; Флаг прерываний от модуля MSSP
SEN equ 0 ; Бит включения "старта"
PEN equ 2 ; Бит включения "стопа"
ACKSTAT equ 6 ; Бит подтверждения от ведомого
SMP equ 7 ; Бит управления длительностью фронта
W equ 0 ; Результат направить в W
RP0 equ 5 ; Поставить 5 биту регистра status название RP0(регстр смены банков)
;================================================= ==============================================
org 0 ; Начать выполнение программы с адреса 0 PC.
goto START ; Переход в ПП Start.

;================================================= ==============================================
org 4 ; Назначение вектора прерываний

;************************************************* **********************************************
; Текст рабочей части программы.
;************************************************* **********************************************
INT movwf W_Temp ; стандартные процедуры сохранения регистров W и Status
movf Status,W
movwf Stat_Temp

Proverk btfss PortB,1 ; Если на 2 ноге 0, то в регистр Reristr записывается число 1
goto ONE
movlw .2 ; Если нет ,то в Registr Записывается число 2
movwf Registr
goto WRITE ; Собственно переходим к записи во внешний еепром
ONE movlw .1
movwf Registr
goto WRITE
WRITE bcf PIR1,SSPIF ; Сброс флага прерываний от модуля MSSP
bsf Status,RP0 ; Переход в первый банк
bsf SSPCon2,SEN ; Начало формирования условия "Старт"
bcf Status,RP0 ; Переход в нулевой банк
btfss PIR1,SSPIF ; Формирование условия старт завершено или нет?
goto $-1 ; Если нет-то ожидание, если да-то далее
;*************************Режимный байт**********************************
movlw b'10100000' ; Режимный байт 1010 код функциональности 000 адрес микрухи,0 режим записи
call WR_I2C
;*****************************Старшый байт адреса**************************
movf Adr_H,W ; Записываем в W первый(старшый байт адреса)
call WR_I2C
;***********************Младшый байт адреса********************************
movf Adr_L,W ; Записываем в W младший байт адреса
call WR_I2C
;*************************Байт данных**************************************
movf Registr,W ; Записываем в W содержание Registr
call WR_I2C
;*********************Стоп условие****************************
bcf PIR1,SSPIF ; Сброс флага прерываний от модуля MSSP
bsf Status,RP0 ; Переход в 1 банк
bsf SSPCon2,PEN ; начало формирования условия стоп
bcf Status,RP0 ; переход в 0 банк
btfss PIR1,SSPIF ; Формирование условия завершено??
goto $-1 ; Нет-снова проверяем флаг, да- далее
;******************Изменнеие битов адреса************************
incf Adr_L,F ; Увеличиваем младший бит адреса на 1
decfsz CountPagL ; Уменьшаем кол-во байтов в блоке на 1 , если результат не 0, то на завершение пррывания (EndInt)
goto EndInt
clrf Adr_L ; Если 0 (блок записан), то обнуляем младший счетчик адресов.
movlw .255 ; Записываем 255 в счетчик кол-ва байт в блоке
movwf CountPagL
incf Adr_H,F ; Увеличиваем старшый адресс на 1
decfsz CountPagH,F ; Уменьшаем на 1 кол-во блоков
goto EndInt ; Если не 0, то на завершение ПП Прерывания
goto $ ; Если 0-вечное кольцо
;*******************Выход из ПП прерываний*****************************
EndInt bcf Intcon,1 ; Сброс флага прерываний
movf Stat_Temp,W ; Стандартная процедура возврата содержимого
movwf Status
swapf W_Temp,F
swapf W_Temp,W
retfie
POVTOR bcf Status,RP0
WR_I2C movwf SSPBuf ; Закрузка в буфер байта для записи
bcf PIR1,SSPIF ; Сброс флага прерываний
btfss PIR1,SSPIF ; Флаг поднялся(запись окончена)?
goto $-1 ;Нет-ожидание, да- дальше
;*************************анализ АСК*************************
bsf Status,RP0 ; Первый банк
btfsc SSPCon2,ACKSTAT ; Подтверждение от ведомого принято?
goto POVTOR ; Нет- повтор, да -далее
bcf Status,RP0 ; Переход в 0 банк
return ; возврат по стеку

START clrf Intcon ; Запрещаем все прерывания
bsf Status,RP0 ; Первый банк
movlw .7 ; записываем в W число 0000 0111
movwf TrisB ; Соответсвенно RB0, RB1, RB2 работают на вход.
movlw .255 ; Записываем в W число 1111 1111
movwf TrisC ; Все порты С на вход (можно не писать по умолчанию все стоят на вход)
movlw .128 ; Записываем в W 0100 0000
movwf OptionR ; !!Преывания по переднему фронту 0/1 включены!!
movlw .9 ; Установка стандартной скорости обмена
movwf SSPAdd ; Скрость равна 100 Кгц
bsf SSPStat,SMP ; управление длительностью фронта выключено
bcf Status,RP0 ; переход в нулевой банк
movlw b'00101000' ; Включение модуля MSSP
movwf SSPCon ; ---!!---
movlw .255 ; Задание колличества битов в блоке
movwf CountPagL
movlw .32 ; Задание кол-ва блоков
movwf CountPagH
clrf Adr_L ; Очистить младший байт адреса ( с нулевого начнется запись)
clrf Adr_H ; Очистить старшый байт адреса ( с нулевого начнется запись)
Pause movlw .1 ; закладываю паузы для ожидания прерываний. Все взял из программы Евгения Александровича
movwf SecH
movlw .255
movwf SecL
;************************************************* ***********************************************
movlw .144
movwf Intcon ; Записываю число 1001 0000( разрешаю глобальные и прерывания по RB0)
Pause1 decfsz SecL,F ; Собственно ожидаю этого прерывания
goto Pause1
Pause2 incfsz SecH,F
goto Pause2
goto Pause ; Если прерывания не произошло то снова закладываем паузы и ждем
end
BorisVV вне форума  
Сказали "Спасибо" BorisVV
warel (27.06.2019)
Непрочитано 20.09.2010, 19:49  
picavr
Почётный гражданин KAZUS.RUN
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,815
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию Re: Помогите с PIC 16F873 и прерыванием по RB0

Сообщение от BorisVV Посмотреть сообщение
Никак не реагирует PIC на прерывания в протеусе.
Отлаживайте в железе и не будете вылавливать глюки Протеуса.
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
picavr вне форума  
Эти 2 пользователя(ей) сказали Спасибо picavr за это сообщение:
BorisVV (02.10.2010), warel (27.06.2019)
Непрочитано 20.09.2010, 19:52  
BorisVV
Прохожий
 
Регистрация: 29.07.2010
Сообщений: 6
Сказал спасибо: 2
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
BorisVV на пути к лучшему
По умолчанию Re: Помогите с PIC 16F873 и прерыванием по RB0

Все с прерыванием разобрался.(Надо было на кнопку и на переключатель по резистору 1К и на питание) Теперь все нормально и в ЕЕпРОМ пишется. А вот со второй проблемой ( Протеус выдает ошибку на программе корабельникова Е.А. я так и не разобрался((
BorisVV вне форума  
Сказали "Спасибо" BorisVV
warel (27.06.2019)
Непрочитано 20.09.2010, 20:38  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: Помогите с PIC 16F873 и прерыванием по RB0

Сообщение от BorisVV Посмотреть сообщение
А вот со второй проблемой ( Протеус выдает ошибку на программе корабельникова Е.А. я так и не разобрался((
Да нет это не Proteus виноват .
У него крышу сносит от писанины пастера .
Перепиши код без беллетристических говновставок (коментов) и все заработает.

И вот эти х..и зачем?
Код:
goto $(хрен знает куда)
Если есть метки ...
__________________
Осторожно , злой кот

Последний раз редактировалось dosikus; 20.09.2010 в 20:41.
dosikus вне форума  
Эти 2 пользователя(ей) сказали Спасибо dosikus за это сообщение:
BorisVV (02.10.2010), warel (27.06.2019)
Непрочитано 02.10.2010, 19:14  
BorisVV
Прохожий
 
Регистрация: 29.07.2010
Сообщений: 6
Сказал спасибо: 2
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
BorisVV на пути к лучшему
По умолчанию Re: Помогите с PIC 16F873 и прерыванием по RB0

Все ..С протеусом понятно. Все сделал как написали- заработало..А вот в реальном железе пока никак((.Спасибо за помощь
BorisVV вне форума  
Сказали "Спасибо" BorisVV
warel (27.06.2019)
Непрочитано 02.10.2010, 19:42  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: Помогите с PIC 16F873 и прерыванием по RB0

BorisVV, В реальности может быть что угодно.
Сопли пайки , не подключенный MCLR , фузы .
Внимательность и еще рез внимательность - спешка нужна только при ловли блох...
Аааа , поймал.
__________________
Осторожно , злой кот
dosikus вне форума  
Сказали "Спасибо" dosikus
warel (27.06.2019)
Непрочитано 02.10.2010, 23:22  
realid
Супер-модератор
 
Аватар для realid
 
Регистрация: 15.10.2007
Сообщений: 3,578
Сказал спасибо: 175
Сказали Спасибо 1,567 раз(а) в 810 сообщении(ях)
realid на пути к лучшему
По умолчанию Re: Помогите с PIC 16F873 и прерыванием по RB0

Сообщение от dosikus Посмотреть сообщение
спешка нужна только при ловле блох...
и при поносе!
realid вне форума  
Сказали "Спасибо" realid
warel (27.06.2019)
Непрочитано 02.10.2010, 23:38  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Помогите с PIC 16F873 и прерыванием по RB0

Сообщение от realid Посмотреть сообщение
и при поносе!
еще когда ты в постели с женой, а муж в дверь стучится
Easyrider83 вне форума  
Сказали "Спасибо" Easyrider83
warel (27.06.2019)
Непрочитано 02.10.2010, 23:58  
urry
Почётный гражданин KAZUS.RUN
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию Re: Помогите с PIC 16F873 и прерыванием по RB0

то вообще кошмар...
__________________
warez
urry вне форума  
Сказали "Спасибо" urry
warel (27.06.2019)
 
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книги dosikus Электронная библиотека 11242 29.12.2015 23:45
Помогите разобраться с PIC 10 box0356 Микроконтроллеры, АЦП, память и т.д 4 21.04.2010 10:11


Часовой пояс GMT +4, время: 13:03.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.