logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

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

karol1996 16 Mar 2012 23:47 2144 8
REKLAMA
  • #1 10686823
    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/topic2136125.html
    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: text
    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: text
    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
  • REKLAMA
  • #2 10687396
    excray
    Poziom 41  
    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.
  • REKLAMA
  • #3 10687996
    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/topic2136125.html (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
  • REKLAMA
  • #4 10688040
    excray
    Poziom 41  
    karol1996 napisał:
    Według teko linku:
    https://www.elektroda.pl/rtvforum/topic2136125.html (post 3)

    impuls na step należy podawać w momencie, kiedy logiczne zero jest na INDEX.

    Powielasz cudze błędy.
    Bascoma nie znam więc kodu nie sprawdzę ale zobacz czy dobrze operujesz sygnałem DIRECTION.
  • REKLAMA
  • #5 10688357
    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
  • #6 10689437
    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
  • #7 10689567
    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: text
    Zaloguj się, aby zobaczyć kod
  • #8 10689615
    karol1996
    Poziom 19  
    Witam
    Napisałem trochę prostszy program uwzględniając czasy:
    Kod: text
    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: text
    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
  • #9 10871675
    karol1996
    Poziom 19  
    Witam
    Teraz wszystko działa.
    Miałem po prostu uszkodzoną stację dyskietek.

    Temat zamykam.

    Pozdrawiam,
    Karol
REKLAMA