c: hi-tech 9,80, interrupt asm

Miroslav Draxal evik na volny.cz
Pondělí Březen 31 22:42:46 CEST 2014


 

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.

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


Další informace o konferenci Hw-list