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

Atmega8, Bascom, licznik -

01 Sie 2015 23:44 921 8
  • Poziom 6  
    Cześć. Mój problem polega na tym, iż muszę oprogramować stosunkowo prosty układ.
    Na jego wejściu pojawiają się impulsy dodatnie, które przez rezystor i tranzystor npn zwierają nogę procesora do masy. Oczywiście ta noga jest programowo podciągnięta do plusa. Teraz do rzeczy - muszę w głównej pętli programu zawrzeć następujący warunek:

    - gdy podam jeden sygnał na wejście i w ciągu 2s układ nie dostatnie drugiego impulsu, wysteruję pierwszy przekaźnik, powiedzmy na sekundę.
    - gdy w ciągu dwóch sekund od podania pierwszego sygnału, do układu dotrze drugi sygnał, procesor poczeka jeszcze 1,5-2s na podanie trzeciego impulsu i jeśli go nie otrzyma - włączy przekaźnik 2 na określony czas.
    - Jeśli w ciągu np. 5s dotrą trzy impulsy, procesor włączy trzeci przekaźnik na określony czas

    Po wszystkim układ się zresetuje.

    Czego już próbowałem - Select case i zliczanie impulsów (niestety to zawodzi, bo uklad od razu po pierwszym naciśnięciu przyjmuje stan licznika = 1 i realizuje komendę, zamiast czekać na drugi impuls). Odpalałem też timer procesora, lecz widocznie robię to źle. Teraz próbuję na If'ach jakoś to zrobić, ale tak szczerze powiedziawszy - ktoś, kto programuje na co dzień, zrobi to pewnie w kilka minut:) Ja niestety siedzę już długo i średnio mi idzie, a układ naprawdę jest prosty... Z góry Wam dziękuję:)
  • Relpol przekaźniki
  • Poziom 34  
    Po pierwsze pochwal się jakimś listingiem z tego co napisałeś i nie działa , gdzieś mi się już przewinął przed oczami taki projekt na elektrodzie i jak pamiętam autor również próbował wymusić napisanie programu . Między szukaniem pomocy a wyręczaniem się innymi jest cienka granica . Tym bardziej zastanawia mnie to ,że cały układ można przetestować na symulatorze bez budowy układu .
    Samo zadanie jest banalnie proste i można je zrealizować na najmniejszym mikrokontrolerze nawet na tiny4 . Jedyny problem jaki możesz spotkać to drgania styków ,które trzeba wyeliminować reszta to umiejętne wykorzystanie licznika i np. przerwania zewnętrznego od przycisku . Z resztą tego typu program można napisać bez użycia jakichkolwiek liczników i przerwań tworząc pętlę która ciągle testuje stan portu dwa wskaźniki jeden od czasu i drugi od ilości przyciśnięć .
  • Relpol przekaźniki
  • Poziom 6  
    Doceniam Twoje doświadczenie. Proszę jednak, byś nie sugerował mi, że próbowałem już uzyskać pomoc w jakimś innym temacie, jak również próbuję przekraczać granicę między pomocą, a wyręczaniem. Nie musisz mi przecież pomagać, jeśli tego nie chcesz:) Proszę Cię tylko o jedno - bądź bardziej ostrożny i mniej pochopny w swojej opinii, ponieważ spędziłem sporo czasu nad programem i kombinowałem na różne sposoby.
  • Poziom 31  
    kill_dj napisał:
    .. spędziłem sporo czasu nad programem i kombinowałem na różne sposoby.

    kamyczek napisał:
    ..pochwal się jakimś listingiem z tego co napisałeś i nie działa ..
  • Poziom 6  
    $regfile = "m8def.dat"
    $crystal = 800000
    Config Timer0 = Timer , Prescale = 64
    Dim Licz8ms As Byte
    Enable Interrupts
    Dim A As Byte
    'Enable Timer0

    'On Timer0 Procedura
    Load Timer0 = 250

    Reset Portc.5
    Reset Portc.4
    Reset Portc.3
    Set Portc.0
    Set Portd.4

    Config Watchdog = 2048

    Config Portc.5 = Output
    Config Portc.4 = Output
    Config Portc.3 = Output
    Config Portc.0 = Input
    Config Pind.4 = Input
    Dim Licznik As Byte
    Licznik = 0


    A = 0

    Zamykanie Alias Portc.4
    Otwieranie Alias Portc.5
    Bagaznik Alias Portc.3
    Wejscie Alias Pind.4


    Do


    If Wejscie = 0 Then
    Waitms 100
    If Wejscie = 0 Then
    Enable Timer0

    Start Watchdog

    Incr Licznik

    ' If Licznik > 0 Then
    'If Wejscie = 0 Then
    'waitms 600
    'If Wejscie = 1 Then
    'Incr Licznik
    'End If
    'End If
    'End If


    End If
    End If

    Select Case Licznik

    Case 1 : Set Bagaznik
    Waitms 500
    Reset Bagaznik

    Case 2:

    Set Otwieranie
    Waitms 400
    Reset Otwieranie

    Case 3:
    Set Zamykanie
    Waitms 400
    Reset Zamykanie

    End Select




    'On Timer0 Procedura















    Loop



    End




    Procedura:

    Select Case Licznik
    Case 3 : Set Bagaznik

    Waitms 200
    Reset Bagaznik


    Case 2 : Set Otwieranie

    Waitms 200
    Reset Otwieranie


    Case 1 :

    Set Zamykanie
    Waitms 200
    Reset Zamykanie



    End Select




    Load Timer0 = 250
    Incr Licz8ms
    If Licz8ms = 120 Then
    Toggle Zamykanie
    waitms 200

    End If









    Return


    Próbowałem na tej zasadzie. Ktoś wspominał jeszcze o watchdogu - można go w sumie wykorzystać, ale chyba timer będzie lepszy. Przepraszam za bałagan w kodzie, ale jak człowiek się wkurza, to i nie myśli dobrze;]
  • Poziom 36  
    kill_dj napisał:

    Próbowałem na tej zasadzie. Ktoś wspominał jeszcze o watchdogu - można go w sumie wykorzystać, ale chyba timer będzie lepszy. Przepraszam za bałagan w kodzie, ale jak człowiek się wkurza, to i nie myśli dobrze;]


    Dlaczego czas odmierzasz w tak małych odcinkach (rzędu milisekund), gdy tymczasem obserwowane zdarzenia występują w odstępach sekundowych.
    Łatwiej byłoby zastosowac timer1 w trybie CTC z ustawieniem podstawowego interwału 1 sec i zliczac ilośc tych interwałów do jakiejś zmiennej. Drugą istotną zmienną byłaby ilośc naciśnięc na push-btn.
    W programie uwarunkowac zmiany wyjśc od wymaganych wydarzeń./
    Nie napiszę ci całego kodu, ale dam przykład zawierający pierwszy i częściowo drugi warunek:


    - gdy podam jeden sygnał na wejście i w ciągu 2s układ nie dostatnie drugiego impulsu, wysteruję pierwszy przekaźnik, powiedzmy na sekundę.
    - gdy w ciągu dwóch sekund od podania pierwszego sygnału, do układu dotrze drugi sygnał, procesor poczeka jeszcze 2s na podanie trzeciego impulsu i jeśli go nie otrzyma - włączy przekaźnik 2


    oto przykład:
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Przeanalizuj, zmień/uzupełnij wg twoich potrzeb.
    Jeżeli nie pasuje ci ta metoda to zastosuj inną....

    e marcus
  • Użytkownik usunął konto  
  • Poziom 28  
    Witam.
    Myślę, iż jednak piwko przeszkodziło w obliczeniach bo aby uzyskać interwał 100ms
    to wartość Compare1a powinno mieć wartość 3124.

    Compare1a = F_CP / presc / F_mcz
    100ms = 10Hz
    Ocr1a = (8000000/256/10)-1 = 3124

    No chyba, że ja się teraz pomyliłem.
  • Użytkownik usunął konto