[SharpMZ] Upraveny FDC Horava - BUG

Hynek Sladky econf na centrum.cz
Středa Červenec 9 16:28:09 CEST 2014


Toto:
    GPIOB->ODR &= ~( 1 << 9 ); // nastavenim 0 na pinu PB9 aktivujeme 
SharpINT
je potencialne nebezpecna operace, protoze neni atomicka. Muze se stat, 
ze mezi ctenim a zapisem se zmeni hodnota portu v preruseni... 
Doporucoval bych pouziti BSRR registru.
Dale by se mozna dal pouzit rezim open-drain (OTYPER registr).

Mimochodem, co to je za registr CRH? V RM0090 pro STM32F4xx jsem ho 
nenasel...

Hynek Sladky


Dne 9.7.2014 15:46, Michal Hucik - ORDOZ napsal(a):
>
>
> Mate pravdu. Podle DS je 74LS03 skutecne open-collector. V tom pripade 
> se musim omluvit autorum HD patche.
>
> Ovsem potom je zahadou, proc kdyz je na sbernici soucasne s Horavou 
> pripojena i Unikarta, ktera ma switchem posunute FDC porty, tak obcas 
> zkolabuje cp/m 4.1.
>
> Detailneji jsem to zacal zkoumat, kdyz mi Horava nepravidelne vratil 
> chybu pri formatovani stopy:
>
>         ld c,#__FDC_DATA
>
>         im 1
>         ei
>
>         out (#__FDC_CMD),a  ; WRITE_TRACK
>
>         4$:
>         in a,(#__FDC_STS)
>         rra
>         jr c,4$                 ; cekame, dokud nezacne byt BUSY
>
>         5$:
>         in a,(#__FDC_STS)
>         rra
>         jr nc,5$                ; cekame, dokud neprestane byt BUSY
>
>         di
>
>         rla
>
>
> Pomerne casto, avsak naprosto nepravidelne se mi stava, ze tato cekaci 
> rutina skonci, ale Sharp pritom nezaznamenal ani jeden prichozi 
> interrupt. Nasledne mam vsak ve statusu hned za tim "rla" priznaky 
> LOST_DATA a DRQ.
>
> Z unikarty si nechavam z STM32 vypsat na terminal info kdykoliv je v 
> hal.c volana funkce pro nastaveni, ci resetovani /INT. Po celou dobu, 
> kdy pracuji s Horavou je interrupt z Unikarty v klidovem stavu, 
> nicmene firmware Unikarty v tomto klidovem stavu neustale vola 
> hal_ResetSharpINT(), cimz nastavuje ten pin do input rezimu.
> Je to jedine misto, kde se v Unikarte saha na GPIOB->CHR.
>
> Zkusil jsem tedy upravit firmware Unikarty tak, aby si pamatoval 
> predchozi stav /INT signalu a aby nesahal na nastaveni toho portu ve 
> chvili, kdy se pozadovany stav nezmenil. Je to zajimave, ale po teto 
> uprave se mi zatim nepodarilo zreprodukovat tu chybu s Horavou. Zatim 
> bych vsak nejasal, protoze moc nerozumim tomu, jak by opakovane volani 
> toho hal_ResetSharpINT() melo ovlivnit signal, ktery jde z Horavy.
>
>
> /*
>  *
>  * Zrusit /INT signal na sbernici MZ-800
>  *
>  *
>  */
> void hal_ResetSharpINT ( void )
> {
>    GPIOB->CRH = 0xB8B33444;  // prepneme pin /INT do input rezimu
> }
>
> /*
>  *
>  * Poslat /INT signal na sbernici MZ-800
>  *
>  *
>  */
> void hal_SetSharpINT ( void )
> {
>    GPIOB->ODR &= ~( 1 << 9 ); // nastavenim 0 na pinu PB9 aktivujeme 
> SharpINT
>    GPIOB->CRH = 0xB8B33434;  // prepneme pin /INT do output rezimu
> }
>
>

------------- další část ---------------
HTML příloha byla odstraněna...
URL: http://mail.ordoz.com/pipermail/sharpmz/attachments/20140709/1ea766e4/attachment-0001.html 


Další informace o konferenci SharpMZ