c: hi-tech 9,80, interrupt asm

Miroslav Draxal evik na volny.cz
Středa Duben 2 23:34:30 CEST 2014


Dobrý den, tak nakonec to dopadlo, ale nejsem s toho moudrý.

Ponejprv shrnutí. 

HIGH přerušení mi stále ukládalo a obnovovalo registry, které se v přerušení
nepoužívají

  5940  0009FA  CFEA F03B              movff  fsr0h,??_interrupt_high+3

  5941  0009FE  CFE1 F03C              movff  fsr1l,??_interrupt_high+4

  5942  000A02  CFE2 F03D              movff  fsr1h,??_interrupt_high+5

  5943  000A06  CFD9 F03E              movff  fsr2l,??_interrupt_high+6

  5944  000A0A  CFDA F03F              movff  fsr2h,??_interrupt_high+7

  5945  000A0E  CFF3 F040              movff  prodl,??_interrupt_high+8

  5946  000A12  CFF4 F041              movff  prodh,??_interrupt_high+9

  5947  000A16  CFF6 F042              movff  tblptrl,??_interrupt_high+10

  5948  000A1A  CFF7 F043              movff  tblptrh,??_interrupt_high+11

  5949  000A1E  CFF8 F044              movff  tblptru,??_interrupt_high+12

  5950  000A22  CFF5 F045              movff  tablat,??_interrupt_high+13

 

Po bližším rozboru názevProjektu.X.debug.lst jsem došel k poznání, že
překladač si určuje, s jakými registry funkce pracuje (přerušení) a podle
toho je ukládá. Takže jsem projekt zkopíroval, očesal pouze na prostá volání
procedur, těla vymazal a začal laborovat. 

-        STÁLE NESMYSLNÉ UKLÁDÁNÍ REGISTRU      

 

Po té jsem vymazal ze složky projektu vše, kromě zdrojových souborů a
vytvořil projekt znovu.

-        A HURÁ, při přerušení rovnou do rutiny obsluhy přerušení bez
ukládání nepoužívaných registrů.

 

Ovšem po přidání těl procedur obsluhy to zase začalo ukládat nepoužívané
registry.

Následně po laborování jsem zjistil, že pokud uložím podprogramy, které se
volají z hlavního programu přerušení před něj, je zase vše v pořádku.

 

Správná struktura

Podprogram_přerušení1

Podprogram_přerušení2

Program_přerušení

 

Špatná struktura

Program_přerušení

Podprogram_přerušení1

Podprogram_přerušení2

 

Zatím tohle chování neumím vysvětlit. Dělá to jak Hi-Tech 9,80 tak XC8 1,30.


 

 

 

 

From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Andrej
Jancura
Sent: Monday, March 31, 2014 10:50 PM
To: HW-news
Subject: Re: c: hi-tech 9,80, interrupt asm

 

Pozrite, co som Vam vedel a mohol poradit, to som urobil. Netusim ako Vam
inak pomoct. Zial je to tak a je mi to luto, ze sa problem nepodarilo
vyriesit. Este by som skusil napisat na support a spytal sa tam.

 

A.

 

2014-03-31 22:42 GMT+02:00 Miroslav Draxal <evik na volny.cz>:

 

Myslim si, ze operator @ funguje az vo verzii xc8, preto Vam to nejde.

Ne toto funguje už v Hi-tech. Ovšem do adresy 0x10 nějak nekorektně. Buďto
je to chyba nebo úmysl, který jsem nepochopil. 

Jaksi jsem přišel na jeden dosti závažný problém. Pokud bych napsal obsluhu
přerušení "nesystémově" potom by nejspíš následně nechodilo ICD3. Což by při
odlaďování byl problém. Opět tedy na začátku. Nemůže to být nic nesystémové.

 

m.

 

 

From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Andrej
Jancura
Sent: Monday, March 31, 2014 10:21 PM


To: HW-news
Subject: Re: c: hi-tech 9,80, interrupt asm

 

Dobry vecer,

skusim to komentovat vo Vasej reakcii, teda v texte a na konci.

A.

 

2014-03-31 21:27 GMT+02:00 Miroslav Draxal <evik na volny.cz>:

Ne neuzavřeli. Jenom pátrám dál. O tom bootloaderovi v examles vím, koukal
jsem. Problém je v tom, že tohle přesouvání je všechno "systémové". Já chci
nesystémově podstrčit kompilátoru mnou napsanou obsluhu přerušení.  Kompiler
si udělá "systémově" začátek rutiny přerušení tj, uklidí registry, pak předá
řízení do

void interrupt low_priority interrupt_low (void)

a po návratu z funkce přerušení zase systémově obnoví registry. Těch
registrů ukládá a obnovuje cca 13, což je pro mě moc. V přerušení používám
jenom W reg a potřebuji "fofr". Nemusím ukládat registry.

Takže řešení je:

1/ buďto nějak systémově přesvědčit kompilátor, aby místo své obsluhy
přerušení použil mou

2/ nebo nesystémově použít 

Void MeInterrupt(void)@0x08

 

Pokud použuji 2/ v hi-tech 9,80 tak to místo na adresu 0x08 přeloží na 0x00,
což je chyba

Pokud použiji 2/ v xc8, tak se to přeloží OK

 

Myslim si, ze operator @ funguje az vo verzii xc8, preto Vam to nejde.

 

 

Problém je, že 9,80 mám legálně ve verzi PRO, a pokud použiji XC8, tak tam
jedu ve verzi Lite a už se do pice nevejdu. Ten projekt musí být i nadále
živý, čili nemohu ho jednorázově přeložit ve zkušební verzi XC8  PRO.

 

A na upgrade na XC8 ste neuvazoval?  :)

 

 

Dnes mě napadlo, že bych využil toho, že funguje 

Void MeReset (void)@0x00

#asm

Goto _picInit

Nop

Nop

Goto _MeHigInterrupt

#endasm

 

Což funguje, vše se uloží jak má, ale problém je, že zas nevím jak zapsat to
_picInit. Je to inicializační rutina procesoru, kde se nuluje RAM atd. To
zase dodá kompiler. Adresa počátku rutiny se mění po rekompilaci (přidání
dalšího kódu). Nevím jak se na ten pic Init odkázat, aby tomu kompiler
rozuměl.

 

M.

 

 

Pozrite, myslim, ze zaklad je ten, ze v zdrojaku nenapisete void interrupt
my_isr() {}. Ked napisete tento riadok, tak prekladac automaticky generuje
celu rutinu ukladania a obnovy registrov v preruseni, aj ked je prazdna. Pak
by som sa pozrel ako to generuje ten mnou zmienovany startup . as, ja mam
toto:

--chip=16f690 -M -P -N31 \
--warn=0 \
--mode=pro \
--opt=all,+asm,+asmfile,9 \
--addrqual=ignore \
--runtime=default,+clear,+init,+keep,+osccal,+resetbits,-download,-stackcall
,+stackwarn,+clib \
--summary=default,-psect,-class,+mem,-hex \
--double=24 \
--float=24 \
-G \
--asmlist \
--output=default,-inhx032 \

rx_tx_debug.c

A pozrite si ako je rieseny ten startup a vas main v C. Potom Vam neostane
uz nic ine, iba sa vrhnut do toho asembleru a manualu a naprogramovat si tu
obsluhu sam. Ako som uz pisal, princip som pochopil na 90%, ale prakticky mi
to nikdy moc nechodilo. Ine riesenie v tych starych verziach kompilatora nie
je. Snad len to, ze si pozrite este kapitolu o uzivatelskom startup file a
jeho prilinkovani.

Viacej Vam k tomu naozaj neviem poradit. 

A.


_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list

 

------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20140402/89ccae68/attachment-0001.html>


Další informace o konferenci Hw-list