Shiftout - shiftin

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
dummy
Chipgyilok
Hozzászólások: 264
Csatlakozott: 2008. május 24. szombat, 6:00

Shiftout - shiftin

Hozzászólás Szerző: dummy »

Adott két avr chip. Összekötöttem ezeket, majd naívan azt gondoltam, hogy a shiftout-shiftin utasításpárral át tudok küldeni egy bájtot (persze többet kellene) egyikből a másikba.
Természetesen nem sikerült. Miért nem?

A küldő program:

Kód: Egész kijelölése

$regfile = "m88def.dat"
$crystal = 7372800

Config Portd.6 = Output
Config Portd.7 = Output
Config Portb.0 = Output

Sh_clk Alias Pind.7
Sh_dat Alias Pinb.0
Megszak Alias Pind.6
Set Megszak

Dim Bk As Byte

Wait 1

Bk = 199

Do

Reset Megszak
Shiftout Sh_dat , Sh_clk , Bk , 0
Set Megszak

Wait 5

Loop

End
A fogadó program:

Kód: Egész kijelölése

$regfile = "m644def.dat"
$crystal = 7372800

$lib "glcdKS108.lib"
$include "my6_8.font"

Config Graphlcd = 128 * 64sed , Dataport = Porta , Controlport = Portc , Ce = 7 , Ce2 = 6 , Cd = 3 , Rd = 4 , Reset = 5 , Enable = 2

Cls

 Wait 2

Config Portd.2 = Input
Config Portd.5 = Input
Config Portd.6 = Input
M88clk Alias Pind.5
M88dat Alias Pind.6
M88sel Alias Pind.2

Dim Bk As Byte

Wait 1
Cls
Setfont My6_8

Do

While M88sel <> 0
Wend

Shiftin M88dat , M88clk , Bk , 0

 Lcdat 2 , 1 , "    "
 Lcdat 2 , 1 , Bk

Loop

End
Avatar
nobody_hun
Bitfaragó
Hozzászólások: 425
Csatlakozott: 2005. november 14. hétfő, 7:00

Hozzászólás Szerző: nobody_hun »

Csak ötletelek:
-Biztos M644-et használsz, nem 644P-t? Más a def, szívtam vele.
-Fogadó oldalon én megszakításba tenném a shiftin-t
-Ki- és bemenetek beállítása nem stimmel: Config PortX.N=Output, Config PinX.N=Input:

Kód: Egész kijelölése

Dataout Alias Portc.2
Datain Alias Pinc.3

Config Dataout = Output
Config Datain = Input
-Kiegészíteném a port irányok beállítását DDRX-szel
"Az IC-k füsttel működnek. Ha kijön belőlük a füst, nem működnek tovább." - ismeretlen szerző
"Az ID:FFFFFF egyenlő az Atmel még nem kiadott processzorával."
Avatar
dummy
Chipgyilok
Hozzászólások: 264
Csatlakozott: 2008. május 24. szombat, 6:00

Hozzászólás Szerző: dummy »

nobody_hun írta:-Biztos M644-et használsz, nem 644P-t? Más a def, szívtam vele.
Ha nem lenne jól megadva a def, "kiabálna" a program, amikor elindítom a Bascomban a programozást. (Nem egyezik a def és a proci id-je).
-Fogadó oldalon én megszakításba tenném a shiftin-t
Abba lesz téve, azt gondoltam, hogy momentán ezzel a pollingolással is megoldható.
-Ki- és bemenetek beállítása nem stimmel: Config PortX.N=Output, Config PinX.N=Input:
Éppen most nyitott valaki erről egy topikot. Robi ottani hozzászólásából kiindulva nem igazán egyezik a config az általad és az általa leírtakkal. Adatirányt tudtommal a port.x = input/output-tal kell belőni. Igaz, hogy a ddrx azért elegánsabb.

Kipróbálom, aztán megosztom a tapasztalatokat!
Köszi a tippeket!
Avatar
dummy
Chipgyilok
Hozzászólások: 264
Csatlakozott: 2008. május 24. szombat, 6:00

Hozzászólás Szerző: dummy »

Ez semmilyen variációban nem működik. Írtam a fogadó oldalra megszakítást, az működik, az lcd-n 199 helyett 255 jelenik meg. Bármilyen portbeállítás esetén. :?
Avatar
nobody_hun
Bitfaragó
Hozzászólások: 425
Csatlakozott: 2005. november 14. hétfő, 7:00

Hozzászólás Szerző: nobody_hun »

Def: én avrprog-ot használok, az beírja a 644-et a 644P-be... :)

A portokkal igazad van, miután válaszoltam, utána olvastam én is Robert írását.

Viszont találtam mást is a kódodban:

Ezt írod:

Kód: Egész kijelölése

Shiftout Sh_dat , Sh_clk , Bk , 0
Help-ből:

Kód: Egész kijelölése

SHIFTOUT pin , pclock , var , option [, bits , delay ]
Azaz, 0 bitet shift-elsz!

Próbáld ki ezzel:

Kód: Egész kijelölése

Shiftout Sh_dat , Sh_clk , Bk , 8, 0
Hátha... :wink:
"Az IC-k füsttel működnek. Ha kijön belőlük a füst, nem működnek tovább." - ismeretlen szerző
"Az ID:FFFFFF egyenlő az Atmel még nem kiadott processzorával."
Avatar
dummy
Chipgyilok
Hozzászólások: 264
Csatlakozott: 2008. május 24. szombat, 6:00

Hozzászólás Szerző: dummy »

Kipróbáltam úgy is, de nem jártam sikerrel.
Sanszos, hogy SPI-vel fogom összekötni a két procit, ez a shiftin-shiftout nem akar összejönni.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Az spi-re a bascom/samples alatt ott a kesz megoldas:)
Avatar
dummy
Chipgyilok
Hozzászólások: 264
Csatlakozott: 2008. május 24. szombat, 6:00

Hozzászólás Szerző: dummy »

Melyik? Az spi-slave.bas? "Csodás" lesz megvalósítani, mert mindkét uC SPI portján már lóg egy-egy eszköz (FlashRam, és egy RF eszköz), melyeknél a /SS-et én kezelem (NOSS = 1), abban a sample kódban meg az /SS-t a proci kezeli. Lesz itt akkora szívás már megint, érzem. :(
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Az SS ha a slave eszközben lóg, az nem baj! Sőt!
A Masterrel azon keresztül mondod meg, hogy mit küldesz, az neki megy e vagy a buszokon levő másik eszköz(ök)nek....
Avatar
dummy
Chipgyilok
Hozzászólások: 264
Csatlakozott: 2008. május 24. szombat, 6:00

Hozzászólás Szerző: dummy »

Kipróbáltam, működik az spi-slave.

Az alábbi programmal próbáltam ki:

Kód: Egész kijelölése

$regfile = "m644def.dat"
$crystal = 7372800
$lib "glcdKS108.lib"
$include "my6_8.font"

Config Graphlcd = 128 * 64sed , Dataport = Porta , _
Controlport = Portc , Ce = 7 , Ce2 = 6 , Cd = 3 , _
Rd = 4 , Reset = 5 , Enable = 2

Cls
Setfont My6_8
Wait 2

Dim B As Byte , Rbit As Bit , Bsend As Byte

Config Spi = Hard , Interrupt = On , Data Order = Msb , Master = No , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 1
Spiinit

Lcdat 1 , 1 , "wait..."

On Spi Spi_isr Nosave
Enable Interrupts

Spdr = 0                                                    

Do

  If Rbit = 1 Then
       Cls
          Wait 1
    Lcdat 2 , 1 , "received : " ; B
    Reset Rbit
    Bsend = Bsend + 1 : Spdr = Bsend
  End If

Loop

End

Spi_isr:
  push r24   
  in r24,sreg 
  push r24
  B = Spdr
  Set Rbit                                               
  pop r24
  !out sreg,r24 
  pop r24       
Return
Egyetlen kérdésem lenne. Ha az alkalmazásban többféle megszakítást akarok használni, az spi interruptot hogyan tudom külön kikapcsolni? Int0/1-nél tudom (pl. Disable Int0), ezt meg lehet tenni az spi-nél is? Hogyan?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Disable spi ?


Az m644def.dat interrupts része alapján :) ...
Avatar
dummy
Chipgyilok
Hozzászólások: 264
Csatlakozott: 2008. május 24. szombat, 6:00

Hozzászólás Szerző: dummy »

Az lesz. :)

Mivel azonban más eszközök is lógnak az spi-n, ez a megszakításos dolog mégsem az igazi, hiszen így minden spi forgalomra elindul a megszakítás, jön a "szemét".

Az M644 Int0-ját tudom az M88-cal vezérelni. Azaz, az M644 csak akkor figyelje az spi-t, ha az M88 "jelzi neki". De ezzel meg nem igazán boldogulok. Az Int0 mehet akár megszakításban is. Tudsz ebben segíteni?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

A kliens akkor is jelez, ha az SS nem aktiválja?
Avatar
dummy
Chipgyilok
Hozzászólások: 264
Csatlakozott: 2008. május 24. szombat, 6:00

Hozzászólás Szerző: dummy »

No, akkor picit részletesebben:

M88 spi-n egyszer ott van az m644, és egy rfm12b modul. Utóbbinak szoftveresen kezelem az /SS lábát. Az m644 és az m88 között nincs /SS vezeték, a kommunikációhoz egyébként sem kell. De mivel az m88 folyamatosan pollingolja az rfm12b-t az spi-n keresztül, így az m644-en is állandóan megszakítás generálódik.
Az m644-nél úgy tudom ezt kiküszöbölni, hogy az m88 az m644 Int0-ját logikai 0-ra állítja ("falling"), ez megy is, azaz ha küldeni kell az adatokat, az m644 megáll, és várja az adatokat. Ekkor engedélyezem az m644-nél az spi interruptot, aztán nem történik semmi. Pedig az m88-nál van egy mp-es wait az interrupt kiváltása és az adatküldés között. Na, itt akadtam el.

Bár, ha jobban belegondolok, így viszont teljesen felesleges az spi interrupt is. :oops:
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

hülye tipp:
SS=0 eseten aktiv a vevod:


SS - megegyezik az INT labaddal:

Kód: Egész kijelölése

config int1=change 'H->L

on in1 SSrutin
enable interrupts 
disable spi
enable INT1

do

ez a foprogramod es az SPI veteled....


loop

ssrutin:
if pinINT1=0 then enable SPI '0aktiv
if pinINT1=1 then disable SPI '0aktiv
return
Illetve ha nem tud az INT change-t, akkor a rg:

Kód: Egész kijelölése

config int1=falling 'H->L - magas alapban

on in1 SSrutin
enable interrupts 
disable spi
enable INT1

do

ez a foprogramod es az SPI veteled....


loop

ssrutin:
if pinINT1=0 then 
    enable SPI '0aktiv
    config int1=rising'atvalthato!
endif
if pinINT1=1 then 
    disable SPI '0aktiv
    config INT1=falling
endif 
return
Válasz küldése