Názorná ukázka přepínání stránek paměti 16f873A

Ta chyba musí být v tom nastavení registrů 1 banky protože když použiju-nepřímé adresování -reg.INDF a FSR tak to běhá vpohodě…nechápu proč tím banksel to nejde.
to: honza3 ten displej je jednobarevný -red,Ten vícebarevný musí být suprový.Ten můj byl vyhozený na skládce a řízení bylo KO no je vysvícený,ale na pokusy to stačí.

Tak jsem se na to koukal a našel jsem ještě jednu chybičku. Ale stejně když to teď pustím, tak se v registrech PISxx posunujou “data” a pak jsou tam jen samé 1 a nic se neděje.
POKUS2.asm (22.2 KB)

Kdzy uy jsme u toho prepinani, co delam spatne ?

	list p=16f877A, R=DEC
	include "p16f877A.inc"
	
;	include "D:\Standa\Jednocipy\MPLAB\AstroBOX\matematika.asm"
	
	__CONFIG  _BODEN_OFF & _CP_OFF & _WRT_OFF & _PWRTE_OFF & _WDT_OFF & _HS_OSC & _DEBUG_OFF & _CPD_OFF & _LVP_OFF

	errorlevel -302 ; Register in operand not in bank 0.  Ensure that bank bits are correct.
	errorlevel -306 ; Crossing page boundary -- ensure page bits are set.
	errorlevel -202 ; Argument out of range.  Least significant bits used.

	cblock	0x20
	;* promenne pro teplotni cidlo
	TMP0
	TMP1
	TMP2
	TMP3
	FLAG
	TEMP_MSB
	TEMP_LSB

	;* promenne pro casove smycky
	SM_AD1
	SM_AD2
	SM_AD3

	;* promenne pro LCD
	ZNAK
	T3
	T2
	T1
	T0

	;* promenne pro mereni z AD prevodniku
	xw0
	xw1
	ST
	SE
	f0
	f1
	SH
	SZ
	counter
	Fehler

	;* promenne ktera obrazovka se ma zobrazit
	scr1
	scr_alarm

	;* pracovni promenna
	wrks
	wrk1
	wrk2
	wrk3
	wrk4
	

	;* promenne pro matematicke vypocty
	mat_A1                	; LByte (dolní)
	mat_A2                	; MByte (střední)
	mat_A3                	; HByte (horní)
	mat_B1                	;
	mat_B2                	;
	mat_B3                	;
	mat_C1                	;
	mat_C2                	;
	mat_C3                	;
	mat_D1                	;
	mat_D2                	;
	mat_D3                	;
	mat_X1                	;
	mat_X2                	;
	mat_FL                	; Flag
	mat_work_A1				; pro docasne ulozeni mezivysledku 
	mat_work_A2				; pro docasne ulozeni mezivylsedku
	mat_work_B1				; pro docasne ulozeni mezivysledku 
	mat_work_B2				; pro docasne ulozeni mezivylsedku


	;* promenne kde ulozim aktualni namerene hodnoty
	act_u_f0				; aktualni vstupni napeti
	act_u_f1				; aktualni vstupni napeti
	max_u_f0				; maximalni vstupni napeti
	max_u_f1				; maximalni vstupni napeti
	min_u_f0				; minimalni vstupni napeti
	min_u_f1				; minimalni vstupni napeti

	act_i_f0				; aktualni celkovy odebirany proud
	act_i_f1				; aktualni celkovy odebirany proud
	max_i_f0				; maximalni aktualni celkovy odebirany proud
	max_i_f1				; maximalni aktualni celkovy odebirany proud
	min_i_f0				; minimalni aktualni celkovy odebirany proud
	min_i_f1				; minimalni aktualni celkovy odebirany proud

	act_temperature_f0		; aktualni teplota
	act_temperature_f1		; aktualni teplota
	max_temperature_f0		; maximalni aktualni teplota
	max_temperature_f1		; maximalni aktualni teplota
	min_temperature_f0		; minimalni aktualni teplota
	min_temperature_f1		; minimalni aktualni teplota
	temperature_flag		; zda se jedna o kladnou ci zapornenou hodnotu
;	old_temperature_flag	; zda se jedna o kladnou ci zapornenou hodnotu (hodnota z predchazejiciho mereni)

	vyhr1_procenta_f0		; nastaveny procentualni vykon vyhrivani c.1
	vyhr1_procenta_f1		; nastaveny procentualni vykon vyhrivani c.1
	vyhr1_i_f0				; odebirany proud vyhrivani c.1
	vyhr1_i_f1				; odebirany proud vyhrivani c.1

	vyhr2_procenta_f0		; nastaveny procentualni vykon vyhrivani c.2 
	vyhr2_procenta_f1		; nastaveny procentualni vykon vyhrivani c.2 
	vyhr2_i_f0				; odebirany proud vyhrivani c.2
	vyhr2_i_f1				; odebirany proud vyhrivani c.2

	vyhr3_procenta_f0		; nastaveny procentualni vykon vyhrivani c.3 
	vyhr3_procenta_f1		; nastaveny procentualni vykon vyhrivani c.3 
	vyhr3_i_f0				; odebirany proud vyhrivani c.3
	vyhr3_i_f1				; odebirany proud vyhrivani c.3
	
	;* promenne pro porovnani dvou 16bitovych cisel (if a1 > a2 ... else ... endif)
	xalo
	xahi
	xylo
	xyhi
	compare_work
	compare_resault

	resault_compare_u		; vysledek porovnani 16bitovych cisel - U
	resault_compare_i		; vysledek porovnani 16bitovych cisle - I
	resault_compare_t		; vysledek porovnani 16bitovych cisel - Temperature
	
	bargraph_blink			;* promenna pro blikani udaju bargrafu

	view_binary_data

	endc

	cblock	0xA0
	
	;* promenne pro definici bargraphu napajeciho U
	alo5

	endc




	#define		Azn				mat_FL,7	;matematicke vypocty - znaménko A, 0=kladné 1=záporné
	#define		Bzn				mat_FL,6	;matematicke vypocty - znaménko B, 0=kladné 1=záporné

	#define		ds				PORTC,0
	#define		RS				PORTD,1
	#define		E				PORTD,0
	#define		LCD_PORT		PORTD
	#define		PLUS			FLAG,0

LCDout	macro	_LCDout
	movlw	_LCDout
	call	WR_LCD 
	endm
LCDw	macro	
	call	WR_LCD 
	endm

;* vypocet vykonu vyhrivani, U*I=W
power_calculation macro mu_f0, mu_f1, mi_f0,mi_f1
	;* posunu desetinne misto o 1 mista doleva (U=12.23 V a ja pocitam vykon z 12.2 V)
	movf	mu_f0,0
	movwf	mat_A1
	movf	mu_f1,0
	movwf	mat_A2

	movlw	0x0A
	movwf	mat_B1
	movlw	0x00
	movwf	mat_B2

	call	mat_LOMENO			; posunu desetinnou tecku o 1 misto doleva

	;* vysledek ulozim do docasne promenne
	movf	mat_C1,0
	movwf	mat_work_A1
	movf	mat_C2,0
	movwf	mat_work_A2


	;* posunu desetinne misto o 1 misto doleva (I=03.46 A a ja pocitam vykon z 3.4 A)
	movf	mi_f0,0
	movwf	mat_A1
	movf	mi_f1,0
	movwf	mat_A2

	movlw	0x0A
	movwf	mat_B1
	movlw	0x00
	movwf	mat_B2

	call	mat_LOMENO			; posunu desetinnou tecku o 1 misto doleva

	;* vysledek ulozim do docasne promenne
	movf	mat_C1,0
	movwf	mat_work_B1
	movf	mat_C2,0
	movwf	mat_work_B2


	;* z docasnych promennych ulozim do promennych urcenych pro matematicke vypocty
	movf	mat_work_A1,0
	movwf	mat_A1
	movf	mat_work_A2,0
	movwf	mat_A2

	movf	mat_work_B1,0
	movwf	mat_B1
	movf	mat_work_B2,0
	movwf	mat_B2

	call	mat_KRAT

	movf	mat_C1,0
	movwf	f0
	movf	mat_C2,0
	movwf	f1

	call	B2D					; Prevedu f0,f1 do desitkove soustavy ST, SH, SZ, SE
	endm




;*************************************************************************
;*************************************************************************
;***																   ***
;***						Z A C A T E K							   ***
;***																   ***
;*************************************************************************
;*************************************************************************
	org		0x00

	pagesel	memory_page3
	call	INIT				; inicializace procesoru
	pagesel	memory_page0
	goto	START



memory_page0:
START
	pagesel	memory_page1
	call	INI_LCD				; inicializace LCD display
	pagesel	memory_page0

	clrf	TEMP_LSB			; promenna pro teplotni cidlo
	clrf	TEMP_MSB			; promenna pro teplotni cidlo


;*************************************************************************
; Po zapnuti napajeni zobrazim uvodni info
	pagesel	memory_page1
;	call	view_screen_start
	pagesel	memory_page0

;*************************************************************************
;* Po zaponuti zobrazim prvni obrazovku s udaji, pro zobrazeni dalsich obrazovek stlacenim tlacitka
	movlw	b'00000001'
	movwf	scr1



	movlw	b'00000000'
	movwf	alo5

	pagesel memory_page1		; obsluha LCD, vypis dat na LCD		

	call	LINE1

	movf	alo5,W
	movwf	view_binary_data
	call	view_binary

	pagesel	memory_page0
	goto	aaa



aaa

	goto	aaa





  




;****************************************************************************
;* Prvni pametova banka procesoru											*
;****************************************************************************
	org	0x0800
memory_page1:
	include	"memory_page1.inc"


;****************************************************************************
;* Druha pametova banka procesoru											*
;****************************************************************************
	org	0x1100
memory_page2:
	include	"memory_page2.inc"

;****************************************************************************
;* Treti pametova banka procesoru											*
;****************************************************************************
	org	0x1800
memory_page3:
;INIT
;************************ Inicializace procesoru  *************************
	include	"memory_page3.inc"	; nastaveni PICu



	end

Kdyz ulozim do promenne alo5 ‘00000000’, tak pri vypisu na LCD mi da hodnotu ‘00001001’. Pes je nekde zakopany v pametovych bankach, predpokladam. Ja si tu promennou dal do rozsahu cblock 0xA0 a nevim jak ji mam spravne obslouzit (cblock 0x20 uz mam prakticky vycerpany). Pomuze mi nekdo s nazornym prikladem (viz zde mij script ) ?
pagesel mi nepomohl a banksel jsem taky nevedel jak mam spravne pouzit. Dekuji.

Dej sem soubory memory_pagex.inc, bez nich to nevyzkouším :frowning:

Zdravím.
Objavil som na Microchipáckom fóre zaujímavý a užitočný príkaz “lcall”
Je to skok na rutinu ale v inej programovej stránke.Pripájam overený testovací program.
list p=16f877A, R=DEC
include “p16f877A.inc”

TMP0 equ 0x20
TMP1 equ 0x21

org 00h
banksel TRISB
movlw .0
movwf TRISB
banksel 0

start bsf PORTB,0

lcall delay
PAGESEL $

bcf PORTB,0

lcall delay
PAGESEL $
goto start

;stránka 2
org 800h

delay nop
MOVLW 0x00 ;0 DEC
MOVWF TMP1
MOVLW 0x00 ;0 DEC
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1
DECFSZ TMP1,F
GOTO $-5
return

end

Neviem či je to veľký prínos ale ušetrí jeden riadok z “PAGESEL”
Relatko.

Když se koukneš na vyslednej HEX, tak zjistíš, že je to to samé jako pagesel a, aspoň teda já, zdůvodu přehlednosti, zůstanu u pagesel.
A ještě, pokud budeš používat lcall tak před každým skokem ti nastaví page, což ti o něco zvětší program.

Můžete mi prosím někdo shlédnout ten asm? Je to do komerční záležitosti, tak jsem musel podstané věci vyjmout. Koukám do toho už dva dni a nic. Jedná se mi o funkce při volání do první stránky (zkoušel jsem i druhou). Na začátku zavolám TEST_POKUS v první či druhé stránce (zkoušel jsem obě). Proběhnou nějaké věci, avšak z podprogramu XXXX na řádku MOVWF TEST_KAMERA mi to skočí zpět na GOTO XXXX o několik řádků nahoru. V podprogramu XXXX se načítají dva registry ze stránky 0 do jiných registrů v aktuální stránce. Označil jsem, kde se to děje. V error logu to sice píše chyby, ale překladač to přeloží.
Ještě mám dotaz, zda je někde na spodní řádku MPLABu vidět aktuální stránka? Banku to píše, ale u mého zdrojáku v podprogramu XXXX u prvních 4 řádků je t obank0 a dále pak bank1. Toto nějak nechápu???

To si oprav. Teď MOVWF TEST_KAMERA přepisuješ PCL. A jestli chceš mít registry i jinde, ohlidej si to BANKSEL.

Myslíš tu hodnotu od adresy 0xA00 ? Zadal jsem to schválně, protože od 0x800 sice začíná první stránka, ale dle datasheetu je od 0x800 do 0x9F0 obsazeno registry procesoru.
Ale zkusil jsem tedy zadat od 0x800 a vypadá to dobře.
Díky!!!

Vymezuješ paměťovej prostor. Dej tam 0xA0 a bude to šlapat.

je něco jiného jak

To ten PIC ani nema a bere adresu od 0 a zrovna jsi se trefil při štestí do PCLATH

TOTO je nesmysl

Zkusil jsem tam dát tu hodnotu ORG 0xA0 , ale překladač mi to nevezme. Ale ORG 0xA00 funguje. Taktéž ORG 0x800.

Reš ten **CBLOCK **

CBLOCK BANK0 0x020 - 0x07F, BANK1 0x0A0 - 0x0FF, BANK2 0x120 - 0x17F, BANK3 0x1A0 - 0x1FF

Tvoje CBLOCK 0xA00 reší BANK0 a přepisuješ