Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопросы по PIC16
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры
asp
Добрый день!

Помогите разобраться:

Собрал простую схему на PIC16F84A, которая должна иметь три состояния:
ожидания WITE, START и STOP.
Светодиоды подключены к вывоводам RA0 и RA1
WITE - светятся два светодиода (HL2 и HL3)
START - гаснет светодиод HL2
STOP - гаснет светодиод HL3

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

Ниже исходный текст подскажите где я торможу :-)

При компиляции программы МПлаб выдает:
(причем если установить в качестве девайса PIC16F84 а не PIC16F84A, такого сообщения не появляется)

Message[302] C:\NEW_DOC\EMB\NEW\SWITCH.ASM 97 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\NEW_DOC\EMB\NEW\SWITCH.ASM 107 : Register in operand not in bank 0. Ensure that bank bits are correct.
Loaded C:\New_doc\emb\NEW\switch.COD.
BUILD SUCCEEDED: Thu Jan 12 21:44:02 2006



LIST P=PIC16F84A ; list directive to define processor
#include <p16F84A.inc> ; processor specific variable definitions

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_OFF & _HS_OSC

; '__CONFIG' directive is used to embed configuration data within .asm file.
; The lables following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.

TRISA EQU H'0085'
TRISB EQU H'0086'

DELAY_VAR EQU 0Eh ; переменная для хранения значения
; задержки




;**********************************************************************
ORG 0

goto start ; go to beginning of program



;------------------------------------------------------------------------------
SCAN ; подпрограмма сканирования порта
SCAN_1 BTFSC PORTB, 7 ; проверить состояние бита 0 PORTB
; пропустить если 7
GOTO SCAN_1 ; перейти на метку SCAN
BTFSC PORTB, 7 ; проверить состояние бита 7 PORTB
; пропустить если 0
GOTO SCAN_1 ; перейти на метку SCAN
BTFSC PORTB, 7 ; проверить состояние бита 7 PORTB
; пропустить если 0
GOTO SCAN_1 ; перейти на метку SCAN
RETURN
;------------------------------------------------------------------------------
DELAY ; подпрограмма задержки
MOVLW .2 ; загрузка в рабочий регистр числа 25
MOVWF DELAY_VAR ; загрузка в переменную числа 25 из регистра
DELAY_1 DECFSZ DELAY_VAR, 1 ; вычесть 1 из переменной, пропустить если 0
GOTO DELAY_1 ; перейти на метку DELAY_1
RETURN
;-----------------------------------------------------------------------------

start
CLRF PORTA ; очистить порт А
BSF STATUS, RP0 ; включаем первый банк памяти
MOVLW b'00010000' ; загрузка в рабочий регистр слова инициализации
; регистра А
MOVWF TRISA ; разряды RA0-RA3 порта А настроены на вывод,
; RA4 на вход, остальные не задействованы
; (игнорируются)
BCF STATUS,RP0 ; переходим в нулевой банк памяти

CLRF PORTB ; очистить порт B
BSF STATUS,RP0 ; включаем первый банк памяти
NOP
MOVLW b'11111111' ; загрузка в рабочий регистр слова инициализации
; регистра В
MOVWF TRISB ; разряды RB0-RB7 порта B настроены на вход,
; RB0-RB6 не задействованы (необходимо заземлить)

BCF STATUS,RP0 ; переходим в нулевой банк памяти




MOVLW b'00000000' ; загружаем в рабочий регистр слово инициализации
; состояния порта A в состояние WITE
MOVWF PORTA ; пересылка из рабочего регистра в порт А
;------------------------------------------------------------------------------
CALL SCAN ; вызов подпрограммы SCAN
MOVLW b'00000001' ; загружаем в рабочий регистр слово инициализации
MOVWF PORTA ; пересылка из рабочего регистра в порт А
;------------------------------------------------------------------------------

CALL DELAY ; вызов подпрограммы задержки
-------------------------------------------------------------------------------
CALL SCAN ; вызов подпрограммы SCAN
MOVLW b'00000011' ; загружаем в рабочий регистр слово инициализации
MOVWF PORTA ; пересылка из рабочего регистра в порт А


END ; directive 'end of program'
beer_warrior
Тут явная ошибка с выбором банка.
Можно ли точно указать строки 97 и 107?
Adviser
Так это просто предупреждение, что выбран другой банк. Если Вас раздражают эти предупреждения,
вставьте директиву
errorlevel -302
и их в листинге не будет.
Lagman
Насколько я понял, программа начинает выполнятся сначала, т.е. после первого выполнения она бежит опять на инициализацию с 0 адреса, ее необходимо зациклить в нужном вам месте.
asp
Hi All!

Создаю проект в MPLAB 7.10 с помощью project wizard, как описано в help.

после команды Build All выдает такое сообщение:

MPLINK 3.92, Linker
Copyright © 2005 Microchip Technology Inc.
Error - section 'INT_VECTOR' can not fit the absolute section. Section 'INT_VECTOR' start=0x00000004, length=0x00000010
Errors : 1

BUILD FAILED: Tue Jan 17 09:36:11 2006

Что сие значит? И как с ним бороться :-).


Исходный файл (взятый из MPLAB) такой:


list p=16F84A ; list directive to define processor
#include <p16F84A.inc> ; processor specific variable definitions

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_OFF & _HS_OSC

; '__CONFIG' directive is used to embed configuration data within .asm file.
; The lables following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.




;***** VARIABLE DEFINITIONS (examples)

; example of using Uninitialized Data Section
INT_VAR UDATA 0x0C
w_temp RES 1 ; variable used for context saving
status_temp RES 1 ; variable used for context saving

; example of using Overlayed Uninitialized Data Section
; in this example both variables are assigned the same GPR location by linker
G_DATA UDATA_OVR ; explicit address can be specified
flag RES 2 ; temporary variable (shared locations - G_DATA)

G_DATA UDATA_OVR
count RES 2 ; temporary variable (shared locations - G_DATA)




;**********************************************************************
RESET_VECTOR CODE 0x000 ; processor reset vector
goto start ; go to beginning of program


INT_VECTOR CODE 0x004 ; interrupt vector location
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register


; isr code can go here or be located as a call subroutine elsewhere


movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt

MAIN CODE
start

nop ; code starts here (example)
banksel flag ; example
clrf flag ; example
; remaining code goes here


END ; directive 'end of program'
0xFF
Цитата
Hi All!

Создаю проект в MPLAB 7.10 с помощью project wizard, как описано в help.

после команды Build All выдает такое сообщение:

MPLINK 3.92, Linker
Copyright © 2005 Microchip Technology Inc.
Error - section 'INT_VECTOR' can not fit the absolute section. Section 'INT_VECTOR' start=0x00000004, length=0x00000010
Errors : 1


Проблема вот в чём, Вам необходимо
Цитата
;***** VARIABLE DEFINITIONS (examples)

; example of using Uninitialized Data Section
INT_VAR UDATA 0x0C
w_temp RES 1 ; variable used for context saving
status_temp RES 1 ; variable used for context saving

; example of using Overlayed Uninitialized Data Section
; in this example both variables are assigned the same GPR location by linker
G_DATA UDATA_OVR ; explicit address can be specified
flag RES 2 ; temporary variable (shared locations - G_DATA)

G_DATA UDATA_OVR
count RES 2 ; temporary variable (shared locations - G_DATA)



в строке

Цитата
INT_VAR UDATA 0x0C


Подставаить вместо 0х0С значение больше либо вообще убрать этот кусок кода либо переместить его сразу за меткой start. Беда в том что подпрограмма обработки прерывания накладывается на вектор адреса программ, и из за этого, на мой взгляд, и возникает ошибка
asp
Большое спасибо!

Подскажите пожалуйста где можно почитать об организации прерываний для PIC16Fxx.


в строке

[quote]
INT_VAR UDATA 0x0C
[/quote]

Подставаить вместо 0х0С значение больше либо вообще убрать этот кусок кода либо переместить его сразу за меткой start. Беда в том что подпрограмма обработки прерывания накладывается на вектор адреса программ, и из за этого, на мой взгляд, и возникает ошибка
[/quote]
0xFF
Цитата
Подскажите пожалуйста где можно почитать об организации прерываний для PIC16Fxx.


На сайте microchip.ru Вы сможете найти некоторую информацию о прерываниях для PIC16Fxx.

http://www.microchip.ru/lit/?mid=1x0

От себя добавлю, что семейство pic16 обладает только одним Вектрором для всех прерываний (0х0004), как внутренних так и внешних. Поэтому при работе с несколькими прерываниями Вам необходимо обратить внимание как определяется их источник.

Успехов.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.