Отговори на тема  [ 4 мнения ] 
Помощ ПИК16Ф88. Прогр.памет над 2048 не мога да ползвам. 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Яну 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


Прикачени файлове:
proteus1.jpg
proteus1.jpg [ 91.67 KiB | Прегледано 1624 пъти ]
Пет Ное 28, 2014 8:51 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Май 01, 2009 4:01 pm
Мнения: 1438
Мнение Re: Помощ ПИК16Ф88. Прогр.памет над 2048 не мога да ползва
Не ти е проблема в инициализирането. 14 битовите команди позволяват максимум 11 бита за адрес т.е. максималния адрес е 2048. За да прескочиш на друга страница трябва да сетнеш още няколко бита по други регистри, които формират горните адреси. Ако имаш подпрограма, която започва в края на първата страница и преминава в следващата страница, то тая подпрограма ще работи само в частта от първата страница и после ще отиде на нулевия адрес т.е. в началото. За да не стават такива магарии най-лесно е да си маркираш началото на горната страница с ORG 0x800 и от там нататък всичко е във втората страница. Ако имаш CALL или GOTO от едната страница към другата трябва да използваш PAGESEL.

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


Пет Ное 28, 2014 9:41 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Яну 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 ; Переход к началу программы.


Пет Ное 28, 2014 10:25 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Май 01, 2009 4:01 pm
Мнения: 1438
Мнение Re: Помощ ПИК16Ф88. Прогр.памет над 2048 не мога да ползва
Не знам защо ги цитираш тия променливи, които нямат нищо общо с темата. Това са декларации на променливи от програма за 12Ф629 за управление на авто радио от бутоните на волана.

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

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


Съб Ное 29, 2014 10:01 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 4 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни