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
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š