Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Stacja fdd -[Bascom][ATmega 32] kontrola głowicy poprzez

karol1996 16 Mar 2012 23:47 1847 8
  • #1 16 Mar 2012 23:47
    karol1996
    Poziom 19  

    Witam
    Posiadam starą FDD (3,5") i chcę poprzez atmegę 32 sterować ruchem głowicy stacji.
    Znalazłem stronę ze znaczeniami pinów:

    https://www.elektroda.pl/rtvforum/viewtopic.ph...+fdd&sid=1a2c9852d8c16d1af0616ddc99a27849
    Wiem, że jak zewrę pin 16 do masy zasilania, to silnik dyskietki rusza.
    Zasada sterowania ruchem głowicy jest taka:
    W momencie kiedy pojawia się logiczne zero na pinie INDEX należy podać logiczne zero na STEP i DIR. Takich powtórzeń należy wykonać 80.
    Po 80 krokach należy podawać na DIR logiczną jedynkę i podawać na STEP logiczne zero, do momentu kiedy na pinie TRACK00 nie pojawi się logiczne zero. W tym momencie proces rozpoczyna się od początku.
    Dołączam program:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    $regfile = "m32def.dat"
    $crystal = 16000000
    Config Porta = Output
    Config Portb = Input

    Config Pinb.1 = Input
    Set Portb.1
    Config Pinb.2 = Input
    Set Portb.2
    Config Pinb.3 = Input
    Set Portb.3


    Dim A As Byte

    Dim C As Byte
    Config Lcd = 16 * 2
    'wyświetlacz 16*2
    Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7
    'konfiguracja pinów
    Cls

    If Pinb.1 = 0 Then Lcd "Stacja gotwa."
    If Pinb.1 = 1 Then Lcd "Dawaj dyskietke!"
    Do

    For A = 0 To 80
    If Pinb.2 = 0 Then Reset Porta.1
    If Pinb.2 = 1 Then Set Porta.1
    Next A

    If A = 80 Then Do
    If Pinb.2 = 0 Then Reset Porta.1
    If Pinb.2 = 1 Then Set Porta.1
    Loop Until Pinb.3 = 0


    Loop

    If Pinb.3 = 0 Then A = 0
    If A = 80 Then C = 0
    If C = 0 Then Set Porta.0
    If A <= 79 Then C = 1
    If C = 1 Then Reset Porta.0

    End 'end program
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Piny 16 i 12 sa zwarte bezpośrednio do masy zasilania.
    Po skompilowaniu i wgraniu do procesora, nic się nie dzieje oprócz obracania dyskietką (pin16)
    Czy ktoś wie na czym polega mój błąd?
    Pozdrawiam,
    Karol

    0 8
  • #2 17 Mar 2012 10:01
    excray
    Poziom 39  

    karol1996 napisał:
    Zasada sterowania ruchem głowicy jest taka:
    W momencie kiedy pojawia się logiczne zero na pinie INDEX należy podać logiczne zero na STEP i DIR

    Pin INDEX nie ma tutaj nic do rzeczy. Sygnał STEP możesz podawać wtedy kiedy Ci się to żywnie podoba. INDEX to jedynie informacja że dyskietka wykonała jeden pełny obrót i znajduje się w obszarze początku zapisu danych na ścieżce. Do sterowania pozycją głowicy potrzebujesz tylko DIR i STEP.
    karol1996 napisał:
    Czy ktoś wie na czym polega mój błąd?

    Twój błąd polega na tym że sprawdzasz stan linii wyjściowych a nawet nie sprawdziłeś czy te linie są w stanie wystawić logiczne 1. A nie są, bo wszystkie wyjścia ze stacji dyskietek są NPN i wymagają rezystorów podciągających.

    0
  • #3 17 Mar 2012 13:49
    karol1996
    Poziom 19  

    Witam

    excray napisał:
    Pin INDEX nie ma tutaj nic do rzeczy. Sygnał STEP możesz podawać wtedy kiedy Ci się to żywnie podoba. INDEX to jedynie informacja że dyskietka wykonała jeden pełny obrót i znajduje się w obszarze początku zapisu danych na ścieżce. Do sterowania pozycją głowicy potrzebujesz tylko DIR i STEP.


    Według teko linku:
    https://www.elektroda.pl/rtvforum/viewtopic.ph...anie+fdd&sid=1a2c9852d8c16d1af0616ddc99a27849 (post 3)

    impuls na step należy podawać w momencie, kiedy logiczne zero jest na INDEX.
    Piny wyjściowe generują logiczne zero, a w programie rezystory podciągające są włączone.
    Działanie pinów wyjściowych sprawdziłem na diodach zwarych do plusa - diody migają prawidłowo.

    Pozdrawiam,
    Karol

    0
  • #5 17 Mar 2012 16:02
    Mundi1970
    Poziom 24  

    Tak jak kolega wcześniej pisał do przesuwania głowicy sygnał INDEX jest niepotrzebny. Sygnał INDEX jest informacją - znacznikiem "początku danych na ścieżce". Warto przeglądnąć jakąś specyfikacje do FDD. Wszystko ładnie opisane jak sterować stacją dyskietek ;). Tak ma wyglądać sygnał wykonujący krok głowicy:

    Stacja fdd -[Bascom][ATmega 32] kontrola głowicy poprzez

    0
  • #6 17 Mar 2012 20:45
    karol1996
    Poziom 19  

    Witam
    Rozumiem, że jeżeli głowica ma się przesuwać w stronę środka dyskietki (oddalać się od czujnika TRACK00) to na DIR podaję logiczne zero i logicznym zerem impulsuję STEP, a kiedy głowica ma się oddalać od środka dyskietki (zbliżać się do czujnika TRACK00), to na DIR podaję logiczną jedynkę i logicznym zerem impulsuję STEP. Dobrze rozumiem?

    Pozdrawiam,
    Karol

    0
  • #7 17 Mar 2012 21:13
    Mundi1970
    Poziom 24  

    Tak, tylko jeszcze muszą być odpowiednie czasy. Stan niski przez minimum 0.8 us i powrót do stanu wysokiego, oczekiwanie minimum 3ms.


    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #8 17 Mar 2012 21:24
    karol1996
    Poziom 19  

    Witam
    Napisałem trochę prostszy program uwzględniając czasy:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    $regfile = "m32def.dat"
    $crystal = 16000000
    Config Porta = Output
    Config Portb = Input

    Config Pinb.1 = Input
    Set Portb.1

    Config Pinb.3 = Input
    Set Portb.3


    Dim A As Byte

    Dim C As Byte
    Config Lcd = 16 * 2
    'wyświetlacz 16*2
    Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7
    'konfiguracja pinów
    Cls

    If Pinb.1 = 0 Then Lcd "Stacja gotwa."
    If Pinb.1 = 1 Then Lcd "Dawaj dyskietke!"
    Do

    For A = 0 To 80
    Reset Porta.0
    Waitms 3
    Set Porta.0
    Waitus 2
    Next A

    If A = 80 Then Do
    Reset Porta.0
    Waitms 3
    Set Porta.0
    Waitus 2
    Loop Until Pinb.3 = 0


    Loop

    If Pinb.3 = 0 Then A = 0
    If A = 80 Then C = 0
    If C = 0 Then Set Porta.0
    If A <= 79 Then C = 1
    If C = 1 Then Reset Porta.0

    End 'end program
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Obecnie mam problem z wgraniem jakiegokolwiek programu do atmegi
    Korzystam z płytki EvB 4.3 v4 i programatora And tech. Natychmiast po rozpoczęciu programowania wyskakuje programming fail.

    Pozdrawiam,
    Karol

    0
  • #9 07 Maj 2012 19:53
    karol1996
    Poziom 19  

    Witam
    Teraz wszystko działa.
    Miałem po prostu uszkodzoną stację dyskietek.

    Temat zamykam.

    Pozdrawiam,
    Karol

    0