Hy!
I would like a controll cd-rom with avr mcu.In one hungaryan forum i find a description about this. I follow this description and write the program in Basic.
I would like cd-rom tray eject. My program is not work.
Have someone any idea how can I the tray eject?
My program is here:
The hungaryan description is here:
Thanks the answers.
Benji
I would like a controll cd-rom with avr mcu.In one hungaryan forum i find a description about this. I follow this description and write the program in Basic.
I would like cd-rom tray eject. My program is not work.
Have someone any idea how can I the tray eject?
My program is here:
$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
The hungaryan description is here:
Quote:
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.
Thanks the answers.
Benji