Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
28.02.2010, 20:23
|
#1
|
Прохожий
Регистрация: 07.09.2009
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Косвенная адресация данных в PIC16F690
Ситуация такая , при косвенной записи в регистры банка 2 , pic16f690 работает неустойчиво, ( динамическая индикация на 4 индикатора ) высвечиваются лишние сегменты , могут три индикатора погаснуть. При записи в банки 0 и 1 работает отлично.
|
|
|
|
28.02.2010, 20:35
|
#2
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,530
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
|
Re: косвенная адресация данных в PIC16F690
Приведите код. Телепаты в отпуске.
|
|
|
|
28.02.2010, 20:36
|
#3
|
Почётный гражданин KAZUS.RU
Регистрация: 05.08.2007
Адрес: Болгария Перник
Сообщений: 1,771
Сказал спасибо: 74
Сказали Спасибо 357 раз(а) в 245 сообщении(ях)
|
Re: косвенная адресация данных в PIC16F690
Давайте код. При так поставленом вопросе ответить затруднительно.
__________________
Мыслю, следовательно существую
|
|
|
|
28.02.2010, 22:20
|
#4
|
Прохожий
Регистрация: 07.09.2009
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Косвенная адресация данных в PIC16F690
Вот фрагмент кода записи 0x03FF в регистры 1 и 2 банка
;+++++++++++ ПРОВЕРКА РАБОТЫ ++++++
;++++++++++++++++++++++++++++++++++++++++++++++++
clrf temp_cp
movlw 0x20
movwf temp_cp
movlw 0xB0 ; начало блока банк 1
movwf FSR
bcf STATUS , IRP ; == 0,1 банки
_aa_
movlw 0x03 ; ADRESH
movwf INDF ; старший байт
incf FSR
BANK1
movlw 0xFF ; ADRESL
BANK0
movwf INDF ; младший байт
incf FSR
decfsz temp_cp
goto _aa_
movlw 0x32
movwf FSR
movlw 0x20
movwf temp_cp
_bb_
BANK0
movlw 0x03 ; ADRESH ;
bsf STATUS , IRP ; ==2,3 банки
movwf INDF
bcf STATUS , IRP
incf FSR
BANK1
movlw 0xFF ; ADRESL ;
BANK0
bsf STATUS , IRP ; ==2,3 банки
movwf INDF
bcf STATUS , IRP ; bank 0 , 1
incf FSR
decfsz temp_cp
goto _bb_
;+++ выводим на индикатор первые два регистра второго банка
bsf STATUS , RP1 ; bank 2
movfw 0x32
bcf STATUS , RP1 ;bank 0
movwf NumH
bsf STATUS , RP1 ; bank 2
movfw 0x33
bcf STATUS , RP1 ; bank 0
movwf NumL
далее переводим в десятичное число и в прерывании выводим на
индикатор 1023 , регистр temp_cp отображён во всех банках,
работает крайне нестабильно ( подсветка сегментов ) , если
убрать строки bsf STATUS , IRP ; ==2,3 банки и
bcf STATUS , IRP ; bank 0 , 1 и произвести запись в банк 0
то работает отлично . спасибо
|
|
|
|
01.03.2010, 01:49
|
#5
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: Косвенная адресация данных в PIC16F690
Сообщение от sasha_popov
|
Вот фрагмент кода записи 0x03FF в регистры 1 и 2 банка
далее переводим в десятичное число и в прерывании выводим на
индикатор 1023 , регистр temp_cp отображён во всех банках,
работает крайне нестабильно ( подсветка сегментов ) , если
убрать строки bsf STATUS , IRP ; ==2,3 банки и
bcf STATUS , IRP ; bank 0 , 1 и произвести запись в банк 0
то работает отлично . спасибо
|
Где то вы ошибаетесь с битами банков, не пользуйтесь таким методом, это приводит к частым ошибкам.
Пользуйтесь специальными командами выбора банков.
Код:
|
BANKSEL 0
BANKSEL 80
BANKSEL 100
BANKSEL 180
BANKISEL 00
BANKISEL 100 |
Компилятор сам подставит необходимые биты для данного МК. А вы можете где то пропустить.
моно сделать и так:
Код:
|
#define BANK0 BANKSEL 0
#define BANK1 BANKSEL 80
#define BANK2 BANKSEL 100
#define BANK3 BANKSEL 180
#define BANKI0 BANKISEL 00
#define BANKI1 BANKISEL 00
#define BANKI2 BANKISEL 100
#define BANKI3 BANKISEL 100 |
а в тексте программы писать:
BANK0
или
BANKI1
здесь у вас лишние переключения, не нужно переключать банки для записи в FSR и INDF.
посмотрите в даташите распределение памяти, эти регистпы доступны ИЗ ЛЮБОГО БАНКА.
Код:
|
BANKSEL 0 ;выбор 0 банка
clrf temp_cp
movlw 0x20
movwf temp_cp
movlw 0xB0 ; начало блока банк 1
movwf FSR
; bcf STATUS , IRP ; bank 0 , 1 ;переключение банков здесь ЛИШНЕЕ
_aa_
movlw 0x03 ; ADRESH
movwf INDF ; старший байт
incf FSR
; BANK1 ;переключение банков здесь ЛИШНЕЕ
movlw 0xFF ; ADRESL
; BANK0 ;переключение банков здесь ЛИШНЕЕ
movwf INDF ; младший байт
incf FSR
decfsz temp_cp
goto _aa_ |
здесь то же самое, для загрузки W не еужно переключать банки, он так же доступен из любого банка
Код:
|
movlw 0x32
movwf FSR
movlw 0x20
movwf temp_cp
_bb_
; BANK0 ;переключение банков здесь ЛИШНЕЕ
movlw 0x03 ; ADRESH ;
; bsf STATUS , IRP ; ==2,3 банки ;переключение банков здесь ЛИШНЕЕ
movwf INDF
; bcf STATUS , IRP ; bank 0 , 1 ;переключение банков здесь ЛИШНЕЕ
incf FSR
; BANK1 ;переключение банков здесь ЛИШНЕЕ
movlw 0xFF ; ADRESL ;
; BANK0 ;переключение банков здесь ЛИШНЕЕ
; bsf STATUS , IRP ; ==2,3 банки ;переключение банков здесь ЛИШНЕЕ
movwf INDF
; bcf STATUS , IRP ; bank 0 , 1 ;переключение банков здесь ЛИШНЕЕ
incf FSR
decfsz temp_cp
goto _bb_ |
Код:
|
;+++ выводим на индикатор первые два регистра второго банка
;bsf STATUS , RP1 ; bank 2 ;бита два(RP0 и RP1) , а вы переключаете всего один
BANKSEL 100 или BANK2
movfw 0x32
;bcf STATUS , RP1 ;bank 0 ;бита два(RP0 и RP1) , а вы переключаете всего один
BANKSEL 00 или BANK0
movwf NumH
;bsf STATUS , RP1 ; bank 2 ;бита два(RP0 и RP1) , а вы переключаете всего один
BANKSEL 100 или BANK2
movfw 0x33
;bcf STATUS , RP1 ; bank 0 ;бита два(RP0 и RP1) , а вы переключаете всего один
BANKSEL 00 или BANK0
movwf NumL |
|
|
|
|
01.03.2010, 14:40
|
#6
|
Почётный гражданин KAZUS.RU
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
|
Re: Косвенная адресация данных в PIC16F690
Вместо цифровых значений в BANKSEL можно указывать имя переменной, так может быть проще.
|
|
|
|
01.03.2010, 19:14
|
#7
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,530
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
|
Re: Косвенная адресация данных в PIC16F690
Сообщение от MisterDi
|
Вместо цифровых значений в BANKSEL можно указывать имя переменной, так может быть проще.
|
Так оно будет правильней.
|
|
|
|
01.03.2010, 22:05
|
#8
|
Прохожий
Регистрация: 07.09.2009
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Косвенная адресация данных в PIC16F690
Директиву BANKSEL я не использовал , сейчас попробую , но мало верится так как косвенная запись даже одного регистра в банке номер-2 сбивает работу мк. Спасибо
|
|
|
|
02.03.2010, 16:26
|
#9
|
Временная регистрация
Регистрация: 10.10.2009
Сообщений: 54
Сказал спасибо: 10
Сказали Спасибо 26 раз(а) в 10 сообщении(ях)
|
Re: Косвенная адресация данных в PIC16F690
Я в Пиках далеко не спец, ну так баловался когда-то, изучил по даташиту все эти "банки" и пр. …. Ой я намучился, с отладкой. Смотрю ну простые шаги, всё должно работать, а оно ….."такое сякое" то пишется но не читается, то читается но не пишется, то вроде как читается из ОЗУ но непонятно что там вычитывает. Эти косяки были с ячейками ОЗУ как бы доступными из любого банка. ( 16f628 ) Психанул, переписал прожку. Стало сложнее но работало ![Улыбка](images/smilies/icon_smile.gif) зачем они вообще зашифровали ОЗУ с этими банками я так и не понял, что нельзя было сделать одним массивом? Кто бы объяснил.
Вопрос к picavr :
А где можно почитать, так чтоб для чайника было понятно про это чудо: BANKSEL
|
|
|
|
02.03.2010, 17:53
|
#10
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: Косвенная адресация данных в PIC16F690
Сообщение от realid
|
Так оно будет правильней.
|
Сообщение от MisterDi
|
Вместо цифровых значений в BANKSEL можно указывать имя переменной, так может быть проще.
|
Если честно не совсем понял о переменных, это ведь директивы препроцессора.
объёвляем
Код:
|
#define BANK0 BANKSEL 0
#define BANK1 BANKSEL 80
#define BANK2 BANKSEL 100
#define BANK3 BANKSEL 180
#define BANKI0 BANKISEL 00
#define BANKI1 BANKISEL 00
#define BANKI2 BANKISEL 100
#define BANKI3 BANKISEL 100 |
и пользуем имена банков
Код:
|
BANK0
BANK1
BANK2
BANK3 |
Сообщение от Paveel
|
А где можно почитать, так чтоб для чайника было понятно про это чудо: BANKSEL
|
В документе Mpasm, есть у меня на русском.
Применение директив позволяет не думать о том в каких банках располагается переменная.
Код:
|
BANKSEL EEDATA
MOVWF EEDATA |
для PIC12F629 компилируется:
Код:
|
BSF STATUS,RP0
MOVWF EEDATA |
а для PIC16F877 компилируется:
Код:
|
BSF STATUS,RP0
BСF STATUS,RP1 |
таким образом при смене процессора асмемблер сам меняет команды выбора банков и программа работает в обоих процесорах без изменения кода. Так же можно использовать и для своих переменных:
Код:
|
#define TEMP 0x30;0 банк
#define TEMP_CUNTER 0xA7;1 банк
#define SAVE_CUNTER 0xA7;2 банк
BANK0
MOVLW 10
MOVWF TEMP
BANKSEL TEMP_CUNTER
DECFSZ TEMP_CUNTER
GOTO LABEL1
GOTO LABEL2
LABEL1
MOVF TEMP_CUNTER,W
BANKSEL SAVE_CUNTER
MOVWF SAVE_CUNTER
LABEL2
BANK0
;код далее |
Таким образом не задумываемся о битах переключения банков и сколько их в нужном нам процессоре....
в 1,2,3 банках обычно располгагаются переменные к которы обращаемся очень редко, всякие счётчики секунд минут итд, или буферы, например буфер УСАРТ буфер АЦП к которым обращаемся через INDF не требующие переключения банков.
Страницы програмной памяти я переключаю макросами:
Код:
|
PAGESEL000 MACRO
CLRF PCLATH
ENDM
PAGESEL400 MACRO
CLRF PCLATH
BSF PCLATH,2
ENDM
PAGESEL800 MACRO
CLRF PCLATH
BSF PCLATH,3
ENDM
PAGESEL1400 MACRO
PAGESEL400
BSF PCLATH,4
ENDM
;вызов в 1 страницу
PAGESEL800
CALL CUNTER_TIME
RETURN_ADRES_PAGE0
;переход на 1 страницу
PAGESEL800
GOTO CUNTER_TIME
;задание адреса страницы
RUTIN_PAGE_800 CODE 0x800
CUNTER_TIME
;исполняемый код
;возврат в 0 страницу
RETURN_FROM_PAGE1_TO_PAGE0
PAGESEL000
RETURN
;переход в 0 страницу
PAGESEL000
GOTO RETURN_ADRES_PAGE0 |
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:37.
|
|