Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Помощ ПИК16Ф88. Прогр.памет над 2048 не мога да ползвам.
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=13384
Страница 1 от 1

Автор:  excitron [ Пет Ное 28, 2014 8:51 pm ]
Заглавие:  Помощ ПИК16Ф88. Прогр.памет над 2048 не мога да ползвам.

Здр., колеги.Тук помагайте в асемблер за инициализация и правилни съвети за подредба на осн.програма и подпрограми, че над 2048 от паметта с записването в банка 2 и 3 от матлаба ,програмата не работи в протеус.По долу по подробно.

Работя по един проект свързан с писане на софтуер на асемблер за пик16ф88, като работата по програмата вървеше добре, докато програмната памет стигна 2048 виждайки го от матлаба. Но поради факта ,че базата от константи и нарастването на основната програма от ред добавки от ъпдейтването в последствие вътре измежду основната програма, се оказа че края от програмните редове премина в памет от 2049 нагоре. От тук просто не знам какво да правя.Гледах документация на пик16ф88, и въпреки че гледам тази памет е в 4 ри банки и две страници ,не ми е ясно как да ползвам повечето памет над 2048.Какво ли не пробвах ,явно имам и проблем с инициализацията в началото.
Проблема с компилирането нямам ,но като симулирам в протеуса,става прекъсване на връзка в програмата ,тя забива в началото и се появяват редове с надписи

..0X0012-Stack overflow executing RETLW instruction..;
..0X02D0-Stack overflow executing CALL instruction..;
0X02D7-Stack overflow executing CALL instruction..
,,,и така редуващи ,както на снимката по долу...
т.е всичко работи докато паметта не се увеличи над 2048 .
А така започва инициализацията ,която мисля ,че там липсва нещо : има редове,които са коментар и незнам дали
да ги пускам в инициализацията.П

list p=16F88 ; list directive to define processor
#include <p16F88.inc> ; processor specific variable definitions
__CONFIG _CONFIG1, _INTRC_IO & _CP_ALL & _CPD_ON & _BODEN_ON & _CCP1_RB3 & _MCLR_ON & _DEBUG_OFF & _WRT_PROTECT_OFF & _LVP_OFF & _PWRTE_ON & _WDT_OFF
OSCTUNE_MNL EQU .0 ;Central frequency min .32 - .63 0 .1 - .31 max


#DEFINE BUTON_OFF_SONY PORTA,4
#DEFINE LED_INDICATOR PORTA,2
#DEFINE LED_CHANGE_CD PORTA,3
#DEFINE CtlPort PORTB,2
#DEFINE BUTTON_PROG PORTA,6;3
#DEFINE RESISTOR_ADC_5V PORTA,7; ADC TO +5V (log.0-to mosfet -changed-620ohm; log.1-to mosfet -changed-3600ohm)
;WIRE EQU GP5

#define WPAGE PCLATH,3 ;0- Work. Page0 1- Work. Page1
#define FSRBANK STATUS,IRP ;0- Bank1,2 1- Bank2,3 Има значение само за FSR.
...
...
;OPTIONMEM EQU 0xA0

ORG 0x0000 ; Вектор сброса.
goto Main ; Переход к началу программы.

..


Main

; Калибровка внутреннего тактового RC-генератора.

; call 0x3FF ; Берем значение заводской калибровки.
; bsf STATUS,RP0 ; Банк 1.
; movwf OSCCAL ; Загружаем значение калибровки.
; bcf STATUS,RP0 ; Банк 0.

; Первоначальная настройка регистров.

; clrf GPIO ; Обнуляем все порты.
; bsf STATUS,RP0 ; Банк 1.
; movlw b'010000' ; Значение для установки портов
; movwf TRISIO ; загружаем в регистр.
; bcf STATUS,RP0 ; Банк 0.

; Инициализация модуля АЦП.

; bcf ADCON0,ADFM ; Левое выравнивание.
; bcf ADCON0,VCFG ; Опорное напряжение Vdd.
; bsf ADCON0,CHS1 ; Аналоговый
; bsf ADCON0,CHS0 ; канал AN3.
; bcf ADCON0,GO ; Преобразование не выполняется.
; bsf ADCON0,ADON ; Включить модуль АЦП.

; bsf STATUS,RP0 ; Банк 1.
; bsf ANSEL,ADCS2 ; Выбраем источник
; bcf ANSEL,ADCS1 ; тактового сигнала
; bsf ANSEL,ADCS0 ; Fosc/16.
; bsf ANSEL,ANS3 ; Определяем канал AN0 как аналоговый,
; bcf ANSEL,ANS2 ; остальные
; bcf ANSEL,ANS1 ; нам не
; bcf ANSEL,ANS0 ; нужны.
; bcf STATUS,RP0 ; Банк 0.

BCF STATUS,RP1 ;Bank0
BCF STATUS,RP0 ;

BCF FSRBANK ;0- Bank1,2 1- Bank2,3 Има значение само за FSR.
BCF WPAGE ;0- Work. Page0 1- Work. Page1


CLRF PORTA
CLRF PORTB


BCF STATUS,RP0 ;Select Bank0.
MOVLW B'01100000' ;Internal oscillator 4MHz

; CALL SET_OSC ;Oscillator configuration!
SET_OSC ;Oscillator configuration.
BCF STATUS,RP1;
BSF STATUS,RP0 ;Bank1
MOVWF OSCCON ;
BCF OSCCON,SCS1 ;0 - Oscillator Mode Defined By h'2007'
BCF OSCCON,SCS0 ;0
MOVLW OSCTUNE_MNL ;Central frequency
MOVWF OSCTUNE ;
BCF STATUS,RP0 ;Bank0

BSF STATUS,RP0 ;Select Bank1.
BSF OPTION_REG,NOT_RBPU ;1 - Pull-ups Disabled
BSF OPTION_REG,INTEDG ;1 - Rising RB0 Interrupt
BCF STATUS,RP0 ;Select Bank0.

BSF STATUS,RP0 ;Select Bank1.
MOVLW B'01100011' ;
MOVWF TRISA ;PortA
MOVLW B'00000000' ;
MOVWF TRISB ;PortB
BCF STATUS,RP0 ;Select Bank0.


MOVLW B'00000001' ;0 - Digital I/O 1 - Analog Input RA0,RA1,Vref+(RA3)
; CALL SET_ADC ;ADC configuration!
;CALL SET_TMR0 ;
;CALL SET_TMR1 ;
;CALL SET_WDT

BSF STATUS,RP0 ;Bank1
MOVWF ANSEL ;Analog Select Register
BCF ADCON1,VCFG1 ;A/D Voltage Reference Configuration, ve4e e 5volta zahranvane
BcF ADCON1,VCFG0 ;
bcf ADCON1,ADFM ;x x / X X X X X X X X !!!
BSF ADCON1,ADCS2 ;Select A/D Conversion Clock 16xTosc = 4uS at 4MHz!!!
BCF STATUS,RP0 ;Bank0
BcF ADCON0,ADCS1 ;Select A/D Conversion Clock
BsF ADCON0,ADCS0 ;-//-

BCF ADCON0,CHS2 ;Select A/D Input Chennel: RA0
BCF ADCON0,CHS1 ;
BCF ADCON0,CHS0 ;
BSF ADCON0,ADON ;1 = A/D converter module is operating
MOVLW .10 ;.10 Fosc=4MHz .20 Fosc=8MHz
MOVWF ACQT ;Acquisition Time 20uS.
NAGORE DECFSZ ACQT,F ;-
GOTO NAGORE ;-^

movlw 0x01 ; После инициализации АЦП
call PNms ; выдерживаем паузу 1 миллисекунду.
CLRF IMPULS ;ZADYLJITELNO
CLRF BIT_SHIFT_ON;ZADYLJITELNO

CLRF PORTA

Прикачени файлове:
proteus1.jpg
proteus1.jpg [ 91.67 KiB | Прегледано 1619 пъти ]

Автор:  CarBeta [ Пет Ное 28, 2014 9:41 pm ]
Заглавие:  Re: Помощ ПИК16Ф88. Прогр.памет над 2048 не мога да ползва

Не ти е проблема в инициализирането. 14 битовите команди позволяват максимум 11 бита за адрес т.е. максималния адрес е 2048. За да прескочиш на друга страница трябва да сетнеш още няколко бита по други регистри, които формират горните адреси. Ако имаш подпрограма, която започва в края на първата страница и преминава в следващата страница, то тая подпрограма ще работи само в частта от първата страница и после ще отиде на нулевия адрес т.е. в началото. За да не стават такива магарии най-лесно е да си маркираш началото на горната страница с ORG 0x800 и от там нататък всичко е във втората страница. Ако имаш CALL или GOTO от едната страница към другата трябва да използваш PAGESEL.

...
...
PAGESEL PODPROGRAMA_10
CALL PODPROGRAMA_10
...
...

Автор:  excitron [ Пет Ное 28, 2014 10:25 pm ]
Заглавие:  Re: Помощ ПИК16Ф88. Прогр.памет над 2048 не мога да ползва

За написаното до тук колега много благодаря и затова на част от изречението ви добавям моите регистри.Тях ли трябва да сетна и как за пример ,ако е това.Освен това разбрах че трябва да маркирам мястото за втора страница
като оглеждам всеки път преди компилирането ми къде е началото на втора страница.
И последно да не ползвам call i goto когато правя преход към страниците .А да пиша: pagesel
или да поставям това всеки път над call i goto.
И за съвет намерих и това пак за: pagesel , какво означава това :
movlw high(tableaddr)
movwf PCLATH

Моля потвърдете ми ако съм разбрал по горе нещата ,как да сетна регистрите .

Не ти е проблема в инициализирането. 14 битовите команди позволяват максимум 11 бита за адрес т.е. максималния адрес е 2048. За да прескочиш на друга страница трябва да сетнеш още няколко бита по други регистри, които формират горните адреси.

; Определение регистров.

CLen EQU 0x20 ; Количество периодов несущей
; (определяет длину импульса несущей).
CLenV EQU 0x21 ; Переменная цикла для длины импульса.
IrCmd EQU 0x24 ; Байт команды протокола.
SendB EQU 0x25 ; Байт, посылаемый процедурой SendByte.
Btn EQU 0x26 ; Результат опроса кнопок
; (0-4 или 5 - не нажата).
BtnPrev EQU 0x27 ; Предыдущий результат опроса кнопок.
BtnTmp EQU 0x28 ; Временный результат опроса кнопок.
ADCRes EQU 0x29 ; Результат АЦП.
P1msV EQU 0x30 ; Переменная цикла для процедуры паузы.
PNmsV EQU 0x31 ; Переменная цикла для процедуры паузы.
CfrmLoopV EQU 0x32 ; Переменная цикла CfrmLoop.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SHIFT_FUNC EQU 0X33
btnshift EQU 0X34
BIT_SHIFT_ON EQU 0X35
IMPULS EQU 0X36
Btn_shift_temp EQU 0X37
COUNTER EQU 0X19
ACQT EQU 0X38
;*******************************************************************************
TIMER_1SEC EQU 0X39
CIKAL_MIGANE EQU 0X40
CIKAL_MIGANE_1 EQU 0X41

Btn0 EQU 0x42 ; Порог кнопки mute.
Btn1 EQU 0x43 ; Порог кнопки Vol-.
Btn2 EQU 0x44 ; Порог кнопки Vol+.
Btn3 EQU 0x45 ; Порог кнопки Seek+.
Btn4 EQU 0x46 ; Порог кнопки Seek-.
Btn5 EQU 0x47 ; Порог кнопки MODE
Btn6 EQU 0x48

BUTON_ZA_SHIFT EQU 0X49
INTCONMEM EQU 0x7A ;Bank 0,1,2,3
REEADR EQU 0x7B ;Bank 0,1
REEDATA EQU 0x7C ;Bank 0,1
BUTON_KOMBINIRAN EQU 0x4A
CHANGE_CD EQU 0X4B
CHANGE_CD_1 EQU 0X4C
POVTORI_CODE EQU 0X4D
;*******************************************************************************
Btn_VE4E_SUMIRAN equ 0X4E
btnshift1 equ 0x4F
;ADCRes1 equ 0x7D

;OPTIONMEM EQU 0xA0

ORG 0x0000 ; Вектор сброса.
goto Main ; Переход к началу программы.

Автор:  CarBeta [ Съб Ное 29, 2014 10:01 am ]
Заглавие:  Re: Помощ ПИК16Ф88. Прогр.памет над 2048 не мога да ползва

Не знам защо ги цитираш тия променливи, които нямат нищо общо с темата. Това са декларации на променливи от програма за 12Ф629 за управление на авто радио от бутоните на волана.

Регистъра, който те интересува е PCLATH. Там се пише горната част от адреса.
Код:
movlw high(tableaddr)
movwf PCLATH

Горното е абсолютно същото, като PAGESEL, но си прецакваш работния регистър и не можеш да го ползваш да пренесе данни във функциата, към която се обръщаш. За преход към втората страница е достатъчно и само BSF PCLATH, 3 Това го пишеш преди CALL или GOTO. След CALL трябва да имаш PAGESELL $ или BCF PCLATH, 3 за да продължи от там програмата след RETURN

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/