logo elektroda
logo elektroda
X
logo elektroda

Atmega8535 AVR MCU: Controlling IDE CD-ROM Tray Eject, Program in Basic, Troubleshooting

Benji01992 5736 8
ADVERTISEMENT
  • #1 11359205
    Benji01992
    Level 10  
    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:
    
    $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
  • ADVERTISEMENT
  • #2 11362659
    And!
    Admin of Design group
    Is the signal actually appear on the microcontroller ports during program execution ?
    Is the microcontroller ports are connected to the appropriate ports on CD-rom?
  • ADVERTISEMENT
  • #3 11362838
    Benji01992
    Level 10  
    I checked the connection repeatedly. It's ok! I don't know check the signal but I think this okay.
  • #4 11362915
    And!
    Admin of Design group
    It is worth checking whether signals actually leave the microcontroller.
  • ADVERTISEMENT
  • #5 11364007
    Benji01992
    Level 10  
    Have you any idea how can I this check?
  • #6 11364190
    And!
    Admin of Design group
    Check for pulses in selected (eg _ior) or all of the pins.
    You can use logic analyzer or oscilloscope.
  • ADVERTISEMENT
  • #7 11376004
    Benji01992
    Level 10  
    I checked the signals. All is ok. Have somebody any idea to the cd tray opening algorithm. I don't know what can I send to the cdrom.
  • #8 12044742
    john118
    Level 1  
    Some of the problems we can't identify at once; check once again, maybe you can find out.
  • #9 12108056
    yizhifrank
    Level 1  
    Is the signal actually appearing on the microcontroller ports during program execution ? Atmega8535 AVR MCU: Controlling IDE CD-ROM Tray Eject, Program in Basic, Troubleshooting

Topic summary

The discussion revolves around controlling a CD-ROM tray eject mechanism using the Atmega8535 AVR microcontroller programmed in Basic. The user reports issues with their program not functioning as intended. Initial troubleshooting steps include verifying connections between the microcontroller and the CD-ROM, as well as checking for signal output on the microcontroller ports. Suggestions include using a logic analyzer or oscilloscope to monitor signal pulses. Despite confirming that signals are present, the user seeks guidance on the specific commands or algorithms required to successfully open the CD tray.
Summary generated by the language model.
ADVERTISEMENT