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ő:
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?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.
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