IDE CD-Rom kezelése

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
Benji01992
DrótVégénSzéndarab
Hozzászólások: 19
Csatlakozott: 2011. június 6. hétfő, 6:00

IDE CD-Rom kezelése

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

Sziasztok!
Egy IDE CD-Rom ot szeretnék működésre bírni egy atmega8515 vezérlővel. Az elsődleges célom hogy kiadja a tálcát. Találtam egy leírás hobbielektronikán elméleti megvalósításra ami a következő:
Nem megyek a program részleteibe, mert nem tudom mit használnál mikrovezérnek, és milyen nyelven programozol.

Szóval a lemeztálca...
1. Bekapcsolásnál nyomj egy hardveres rezetet (IDE 1-es láb logikai 0-ra). Kb. 200ms a rezet idő és ugyanennyi ideig hagyd magához térni.

2. A Státus regiszterben figyeld BSY és DRQ biteket, várd meg míg logikai 0 lesz.
A státusz regisztert a következőképp címezheted: DA0=1, DA1=1, DA2=1, CS0=0, CS1=1.
Olvasáskor ez a státusz regiszter címe, íráskor pedig itt találod Control regisztert. Szóval kiküldöd a címet (IOR és IOW lábak logikai 1 szinten legyenek), majd IOR lábat 0-ra húzod, és beolvasod a regiszter tartalmát. A beolvasáshoz 10us bőven elég, vagyis IOR 0-ra 10us-ot vársz, közben beolvasol, majd IOR 1-re.

3. Ha DRQ=0 és BSY=0 jöhet egy szoftveres rezet. Ehhez a a Control regiszter kell, tehát a cím ugyanaz, mint a Státusz regiszternél, csak most az IOW lábbal kell eljátszani a dolgot. A regiszterbe írj be egy 08h értéket, majd várakozz ~100ms-ot.

4. Most jön a Start Unit, de előtte ki kell küldened a Control regiszterbe egy A0h értéket, hogy a meghajtó tudja azt, hogy Command Packet fog jönni (nemes egyszerűséggel ).
A Start Unit felel a lemeztálca működtetéséért és a lemez beolvasásáért.
Szóval Control regiszterbe A0h érték küldése, majd az alsó 8bájtra 1Bh-t küldesz, a felső 8bájtra 00h-t... ezzel kész is van az első szó beírása. A második szó két bájtja 00h. A következő szó alsó bájtjának, alsó két bitje a lényeg, a bájtba írj be 02h-t. Ez leállítja a lemezt, majd kiadja. A maradék szavak mindegyike 00h, vagyis nem használt.
Tehát valami ilyesmi:
0.byte=0x1B // OPCODE
1.byte=0x00

2.byte=0x00
3.byte=0x00

4.byte=0x02 // Load/Unload
5.byte=0x00

6.byte=0x00
és így tovább egésszen 11-ig

a 0-1, 2-3, stb. bájtokat párhuzamosan kell beírni a megfelelő IDE vonalakon (szavas beírás).
Érdemes mindkét bájtot kitenni a mikrovezér portjaira és ha kint van akkor kezdeni a küldést (IOW=0).

Az még kimaradt, hogy a A0h Control regiszterbe írása után, de még a parancs kiadása előtt érdemes megnézni a Státusz regiszterben DRQ-t, és csak akkor küldeni a csomagot, ha DRQ=1.

Ha jól programozod, akkor ki fogja nyitni a lemeztálcát.
Persze a dolog szépséghibája, hogy SEEK-et most nem nézzük (az egy bonyolultabb történet, nekem is csak most sikerült tökéletesen megoldani), ezért a szoftveres rezet után várakoztasd a programot legalább 10 másodpercig... ennyi idő alatt elvileg végez.
Ez alapján írtam meg a programomat de sajnos nem adja ki a tálcát. A program végigfut nem akad meg sehol ezt visszajelző ledekkel ellenőriztem. Tudnátok segíteni megtalálni a hibát?
A programom a következő:

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

$regfile = "m8535.dat"
$crystal = 4000000

Dim Bsy As Bit , Drq As Bit

_reset Alias Portb.0
_iow Alias Portb.1
_ior Alias Portb.2
_cs0 Alias Portb.3
_cs1 Alias Portb.4
_da0 Alias Porta.0
_da1 Alias Porta.1
_da2 Alias Porta.2

_bsyled Alias Porta.3
_drqled Alias Porta.4

_data0 Alias Portd.0
_data1 Alias Portd.1
_data2 Alias Portd.2
_data3 Alias Portd.3
_data4 Alias Portd.4
_data5 Alias Portd.5
_data6 Alias Portd.6
_data7 Alias Portd.7
_data8 Alias Portc.0
_data9 Alias Portc.1
_data10 Alias Portc.2
_data11 Alias Portc.3
_data12 Alias Portc.4
_data13 Alias Portc.5
_data14 Alias Portc.6
_data15 Alias Portc.7

_bsy Alias Portd.7
_drq Alias Portd.5

Config _reset = Output
Config _bsyled = Output
Config _drqled = Output

_reset = 1


'Főprogram

'Hardware reset
Waitms 200
_reset = 0
Waitms 200
_reset = 1
wait 5

'Státusz regiszter címzése
_da0 = 1
_da1 = 1
_da2 = 1
_cs0 = 0
_cs1 = 1

'Olvasás
_ior = 1
_iow = 1
Config Portd=Input
Config Portc=Input
_ior=0
Waitms 1
_ior=1
'Bsy és Drq bitek ellenőrzése
Do
_ior=0
Waitms 1
_ior=1
If _bsy = 0 And _drq = 0 Then
Exit Do
End if
Loop
_bsyled = 1
Config Portd=Output
Config Portc=Output
_ior=1
_iow=1
Portd=&H08
_iow=0
Waitms 100
_iow=1
'Várakozás
Do
_ior=0
Waitms 1
_ior=1
If _bsy = 0 And _drq = 0 Then
Exit Do
End if
Loop
_drqled = 1
'Start unit
_ior=1
_iow=1
Portd=&ha0
_iow=0
Waitms 100
_iow=1
Config Portd=Input
Config Portd=Input
_ior=0
Waitms 1
_ior=1
Do
_ior=0
Waitms 1
_ior=1
If _drq=1 Then
Exit Do
End if
Loop
_bsyled = 0
Config Portd=Output
Config Portc=Output
'Szo 1-2
_iow=1
Portd=&h1b
Portc=&h00
_iow=0
Waitms 100
'Szo 2-3
_iow=1
Portd=&h00
Portc=&h00
_iow=0
Waitms 100
'Szo 4-5
_iow=1
Portd=&h02
Portc=&h00
_iow=0
Waitms 100
'Szo 6-7
_iow=1
Portd=&h00
Portc=&h00
_iow=0
Waitms 100
'Szo 8-9
_iow=1
Portd=&h00
Portc=&h00
_iow=0
Waitms 100
'Szo 10-11
_iow=1
Portd=&h00
Portc=&h00
_iow=0
Waitms 100
_iow=1
 _drqled = 0
End
Előre is köszönöm! Üdv. Benji
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

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

Szerintem:

Do 
 _ior=0 			olvasás láb aktív
 Waitms 1 		vársz idáig OK
 _ior=1 			nem olvasol be semmit? Lekapcsolod az olvasást.
 If _bsy = 0 And _drq = 0 Then		Itt mér nem élnek a vizsgált bitek!
Exit Do 
 End if 
 Loop
Avatar
Benji01992
DrótVégénSzéndarab
Hozzászólások: 19
Csatlakozott: 2011. június 6. hétfő, 6:00

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

kapu48 írta:

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

Szerintem:

Do 
 _ior=0 			olvasás láb aktív
 Waitms 1 		vársz idáig OK
 _ior=1 			nem olvasol be semmit? Lekapcsolod az olvasást.
 If _bsy = 0 And _drq = 0 Then		Itt mér nem élnek a vizsgált bitek!
Exit Do 
 End if 
 Loop
Így gondoltad?

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

Config Portd=Input
Config Portc = Input
Do
_ior = 0
Waitms 1
_bsyled = 1
_drqled = 1
Loop Until _bsy = 0 And _drq = 0
_ior=1
jelen álláspont szerint miután a d portra kiküldöm az &h08 at az utána lévől do loop ciklusból nem lép ki...drq=1 talán..
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Nem Wordot kel írni?

Portd=&h08
Portc=&h00
:?:
Avatar
Benji01992
DrótVégénSzéndarab
Hozzászólások: 19
Csatlakozott: 2011. június 6. hétfő, 6:00

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

kapu48 írta:Nem Wordot kel írni?

Portd=&h08
Portc=&h00
:?:
A leírásba nincs meghatározva ezért kipróbáltam úgyis de nem jó sajnos. A teljes program most így néz ki:

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

$regfile = "m8535.dat"
$crystal = 4000000

Dim Bsy As Bit , Drq As Bit

_reset Alias Portb.0
_iow Alias Portb.1
_ior Alias Portb.2
_cs0 Alias Portb.3
_cs1 Alias Portb.4
_da0 Alias Porta.0
_da1 Alias Porta.1
_da2 Alias Porta.2

_bsyled Alias Porta.3
_drqled Alias Porta.4

_data0 Alias Portd.0
_data1 Alias Portd.1
_data2 Alias Portd.2
_data3 Alias Portd.3
_data4 Alias Portd.4
_data5 Alias Portd.5
_data6 Alias Portd.6
_data7 Alias Portd.7
_data8 Alias Portc.0
_data9 Alias Portc.1
_data10 Alias Portc.2
_data11 Alias Portc.3
_data12 Alias Portc.4
_data13 Alias Portc.5
_data14 Alias Portc.6
_data15 Alias Portc.7

_bsy Alias Portd.7
_drq Alias Portd.3

Config _reset = Output
Config _bsyled = Output
Config _drqled = Output
Config _da0 = Output
Config _da1 = Output
Config _da2 = Output
Config _cs0 = Output
Config _cs1 = Output

_reset = 1


'Főprogram

'Hardware reset
Waitms 200
_reset = 0
Waitms 200
_reset = 1
Wait 5


'Státusz regiszter címzése
_da0 = 1
_da1 = 1
_da2 = 1
_cs0 = 0
_cs1 = 1

'Olvasás
_ior = 1
_iow = 1
Config Portd=Input
Config Portc = Input
Do
_ior = 0
Waitms 1
_bsyled = 1
_drqled = 1
Loop Until _bsy = 0 And _drq = 0
_ior=1
'Bsy és Drq bitek ellenőrzése
_bsyled = 0
_drqled = 0
Config Portd=Output
Config Portc=Output
_ior=1
_iow=1
Portd = &H08
Portc = &H00
Waitms 10
_iow=0
Waitms 100
_iow=1
'Várakozás a szoftweres reszet után
Config Portd=Input
Config Portc=Input
Do
_ior=0
Waitms 1
_bsyled = 1
_drqled = 1
Loop Until _bsy = 0 And _drq = 0
_ior = 1
_bsyled = 0
_drqled = 0
Config Portd=Output
Config Portc=Output
_drqled = 0
'Start unit
_ior=1
_iow=1
Portd = &HA0
Portc = &H00
Waitms 10
_iow=0
Waitms 100
_iow=1
Config Portd=Input
Config Portd = Input
Do
_ior=0
Waitms 1
_drqled = 0
Loop Until _drq = 1
_ior = 1
_drqled = 1
Config Portd=Output
Config Portc=Output
'Szo 1-2
_iow=1
Portd = &H1B
Portc = &H00
Waitms 10
_iow=0
Waitms 100
'Szo 2-3
_iow=1
Portd = &H00
Portc = &H00
Waitms 10
_iow=0
Waitms 100
'Szo 4-5
_iow=1
Portd = &H02
Portc = &H00
Waitms 10
_iow=0
Waitms 100
'Szo 6-7
_iow=1
Portd = &H00
Portc = &H00
Waitms 10
_iow=0
Waitms 100
'Szo 8-9
_iow=1
Portd = &H00
Portc = &H00
Waitms 10
_iow=0
Waitms 100
'Szo 10-11
_iow=1
Portd = &H00
Portc = &H00
Waitms 10
_iow=0
Waitms 100
_iow=1
_drqled = 0
_bsyled = 0
End
Válasz küldése