( bucko | 2020. 11. 08., v – 10:39 )

A bit field nagyon jó gondolat!

Az STM8 memory mapped io-val rendelkezik. Csak egy jó header kell, és készen vagy.

Nézegetem a fenti C fordítmány ajánlásokat és egyre jobban értem, miért nem programozok C-ben mikrokontrollert. :-D

Az STM8-nak van egy BCCM utasítása, amivel a CARRY értékét írja a portra.

Az alábbi pszeudokód egész biztosan megírható soronként 1 db ASM utasítással.

data16 - a kiírandó 16 bit

ciklus - ciklusszámláló

clock - a 74164 clock bemenete

data - a 74164 data bemenete

Ha valahol nem jó az időzítés a 74164 specifikációjához, akkor elegendő NOP utasítást kell beilleszteni.

	load(data16)

	ciklus=16
loop:

	clock=0

	lshiftC(data16)

	data=carry

	clock=1

	dec_jump_if_nz(ciklus) -> loop

	clock=0

Mit kell tudnia ilyenkor a C-nek?

  • a clock és data bitfieldben van
  • a clock=1 a megfelelő bit set utasításra fordul (BSET, BRES)
  • az lshiftC = data16<<1, de megőrzi a CARRY értékét (RLCW)
  • a data=carry pszeudokód az előző utasítás eredményét másolja a bit field-be (BCCM)
  • a dec_jump_if_nz pszeudokód -> if (--ciklus) goto loop vagy while(--ciklus) egy utasításra fordul*

*Ennél a processzornál nincs ilyen utasítás (?), ezét egy DEC és egy JRNE utasítás kell.

A C ennél a 9 utasításnál sokkal hosszabra fordulhat. Hardver programozásnál érdemes először pontosan megfogalmazni mi is a feladat, és csak utána okoskodni a C-vel. Az eredményt esetleg ellenőrizni/mérni kell az időzítések miatt.

Annak idején a 8085 (~8080) mellé 74LS259-ből készítettem 8 bites bit set/reset és impulzus(!) protot. Meg lehet oldani vele, hogy az adat íródjon ki, vagy külön címen legyen a set és a reset. Ezzel rögtön két új fajta utasítása keletkezett az általános processzornak.