|
excitron
Ранг: Минаващ
Регистриран на: Нед Яну 14, 2007 5:58 pm Мнения: 67
|
 Помощ ПИК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
|
|
excitron
Ранг: Минаващ
Регистриран на: Нед Яну 14, 2007 5:58 pm Мнения: 67
|
 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 ; Переход к началу программы.
|