Elektroda.pl
Elektroda.pl
X
Relpol przekaźniki nadzorczeRelpol przekaźniki nadzorcze
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] czekanie programu na przycisk

08 Lip 2012 08:04 2877 19
  • Poziom 19  
    witam , nie wiem w jaki sposób rozwiązać zatrzymanie pętli programu do chwili naciśnięcia przycisku
    układ ma działać tak ze mamy 4 diody led , każda z nich zapala się po naciśnięciu przycisku jednoczenie gasząc poprzednią


    Kod: vb
    Zaloguj się, aby zobaczyć kod
    Darmowe szkolenie: Ethernet w przemyśle dziś i jutro. Zarejestruj się za darmo.
  • Relpol przekaźniki nadzorczeRelpol przekaźniki nadzorcze
  • Poziom 19  
    Najprościej (na początek), bo niezbyt elegancko w te miejsca gdzie napisałeś "oczekiwanie na przycisk wstawić instrukcje:

    While "przycisk nie naciśniety"
    wend
    wait 1

    Tyle ile przewidujesz przełączeń, tyle takich zestawów instrukcji.
    Oczywiście zamiast tekstu "przycisk nie naciśniety" wstaw warunek , który będzie spełniony gdy przycisk nie jest naciśniety. Oznacza to, że musisz zadeklarować wejście do którego podłączony jest przycisk , podciągnąć do 1 (set), nadać alias na przykład przycisk_nacisniety i wtedy instrukcje będą nastepujące:

    while przycisk_nacisniety = 1
    wend
    wait 1

    Instrukcja wait 1 jest po to abyś przy jednym naciśnięciu nie przełączył od razu kilku diód.
  • Poziom 19  
    tzn uklad z ledami jest tylko przykładowy zamiast przycisku będzie sygnał prostokątny , atmega będzie sterować cewkami zapłonowymi , mogłem zrobić to na np liczniku , zależnie od zliczonych impulsów ustawiać odpowiedni port , lecz chodzi tu o duża szybkość , wydaje mi sie ze oczekiwanie petli na przycisk będzie najszybszym rozwiązaniem
  • Poziom 19  
    Nie znam się na motoryzacji ale co to w tym przypadku znaczy "duża szybkość"? Ile razy na sekundę bedą się pojawiały impulsy?
  • Relpol przekaźniki nadzorczeRelpol przekaźniki nadzorcze
  • Poziom 19  
    sam impuls nie będzie miał jakiejś dużej szybkości maksymalnie 300 impulsów na sekunde , natomiast ważne jest możliwie najmniejsze opóźnienie pomiędzy "nacisnieciem przycisku " a "zapaleniem diody"
  • Poziom 19  
    W takim razie nie można wstawiać opóźnień. A w każdym razie nie takie duże jak podałem. Mozesz wypróbowac te instrukcje, które napisałem pod warunkiem przesunięcia instrukcji wait poza instrukcje
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    no i zmianić trzeba jej wartość.
    Zakładając częstotliwość 100 Hz otrzymujemy czas 10 milisekund. W takim razie możesz wstawić instrukcję
    Waitms 10

    Dodano po 1 [minuty]:

    No proszę. Ledwo co odpisałem a ty zmieniłeś częstotliwość impulsów z 80 na 300. To zmienia czas instrukcji Waitms z Waitms 10 na
    Waitms 3
  • Poziom 19  
    na tak nie wziolem pod uwage ze dopuki bedzie nacisniety przycisk program bedzie lecial caly czas

    w tej chwili widze dwa rozwiazania , dopisac kolejne polecenie while które czeka na puszczenie przycisku

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    itd

    lub zrobic to mimo wszystko na liczniku wyzwalanym zboczem narastajacym , licznik bedzie zliczal tylko do 4 , potem bedzie zerowany wiec taka ciagla petla moze bedzie dosc szybka
  • Pomocny post
    Poziom 19  
    Ten drugi pomysł jest moim zdaniem lepszy. Do tego możesz użyć końcówki przerwania INT - ma konfigurację zbocza, którym jest wyzwalane przerwanie.
  • Poziom 19  
    ok zrobilem cos takiego , wyjasnie jeszcze zasade dzialania

    mamy dwa sygnaly z silnika

    1. sygnal zaplonu ( 4 impulsy na cykl pracy)
    2 sygnal pierwszego cylindra ( jeden impuls na cykl pracy , pomiedzy impulsami zaplonu)

    program dziala tak ze zeruje licznik za kazdym razem wystapienia sygnalu 1cylindra , nastepnie przy kazdorazowym sygnale zaplonu , daje iskre na odpwiedni cylinder ( 4 porty podlaczone do 4 cewek)

    Kod: vb
    Zaloguj się, aby zobaczyć kod
  • Użytkownik usunął konto  
  • Poziom 19  
    portc.1 to wyjscie , wejsciem w programie oprócz timera jest pinc.1

    poprawilem , ale niemam pojecia czy o to chodzilo

    Kod: vb
    Zaloguj się, aby zobaczyć kod



    Proszę o poprawienie swoich postów - 3.1.13. Zabronione jest publikowanie wpisów naruszających zasady pisowni języka polskiego, niedbałych i niezrozumiałych.
    [zumek]
  • Poziom 19  
    Nie jest dobrze. Przy takim zapisie masz skonfigurowane jedynie wejście na końcówce C.1 co ustawiłeś rozkazem Config pinC.1 = Input
    Powinieneś mieć jeszcze jedno wejście jeśli piszesz: "mamy dwa sygnaly z silnika

    1. sygnal zaplonu ( 4 impulsy na cykl pracy)
    2 sygnal pierwszego cylindra ( jeden impuls na cykl pracy , pomiedzy impulsami zaplonu)

    program dziala tak ze zeruje licznik za kazdym razem wystapienia sygnalu 1cylindra , nastepnie przy kazdorazowym sygnale zaplonu , daje iskre na odpwiedni cylinder ( 4 porty podlaczone do 4 cewek)"
    No i nie widzę konfiguracji wyjść (chyba, ze tego nie uwidaczniasz choć zrobiłeś).
    Rozkazami
    Config PORTC.2= output
    Config PORTC.3= output
    Config PORTC.4= output
    Config PORTC.5= output
    Po takim skonfigurowaniu i podciągnięciu wyjść do 1 rozkazami SET dopiero możesz spróbowac sterowac przekaźniki.
  • Użytkownik usunął konto  
  • Poziom 19  
    ale co tu mówić do którego pinu co podłączam , sprawa hardware jest dla mnie jasna

    pinc.1 to wejście sygnału 1cylindra , portd.3 to wejście timera1 , potem mamy 4 wyjścia na portach C

    jeśli już tak wnikliwie pytasz , to atmega będzie "przylepiona" wewnątrz fabrycznego ecu , procesor będzie sterował fajkocewkami wyposażonymi już wewnątrz w moduły zapłonowe , będzie tez dostawać odfiltrowane sygnały bezpośrednio z przed uP w ECU

    czasu trwania impulsu zapłonu nie jestem w stanie teraz określić , makymalnie najkrótszy impuls 1cylinda to 600us

    mógłbyś wyjaśnić czemu " Próba "złapania" dokładnej wartości IFem przez porównanie z rejestrem timera to makabryczny pomysł"
    jestem otwarty na inne sugestie rozwiązania układu elektronicznego rozdzielacza zapłonu
  • Użytkownik usunął konto  
  • Poziom 19  
    wiec jesli sprawdzanie stanów timerów potrwa tak długo , wiec zliczanie impulsów w ten sposób mija się z celem

    wcześniej już określiłem jak program ma pracować , jego zasada jest prosta , nie wiem jak bardziej prosto mam to wytłumaczyć , próbowałem na przycisku i ledach , może wróćmy do takiego opisu

    wiec mamy 4ledy (cewki zaplonowe) , maja one byc zapalne pojedynczo przyciskiem (impulsem stanu niskiego z wyjscia zaplonu)

    czyli naciskam przycis 1 raz , zapala sie 1led , naciskam przycisk drugi raz zapala sie 2 led a gasnie 1 , itd az do 4 leda
  • Użytkownik usunął konto  
  • Poziom 19  
    1- nie nastąpi ponieważ miedzy 1-4 cylindrem jest sygnał resetujący 1cylindra
    2-sygnał ja wspomniałem wcześniej będzie brany tuz z wejść seryjnego procesora w ecu , jest tam już w formie prostokątnej i jest pozbawiony zakłóceń bo tak samo jak atmega , tak samo mylić mógłby się fabryczny procesor a to raczej jest niedopuszczalne

    nóżek w tej chwili nie mam określonych , bo nie mam już pojęcia jak obsłużyć to zadanie możliwie jak najszybszym i najprostszym kodem
  • Pomocny post
    Użytkownik usunął konto  
  • Poziom 19  
    faktycznie to w prosty i szybki sposób rozwiązuje problem , bez konieczności bawienia się w procesory

    sygnały z licznika wprowadzę najpierw na tranzystory npn , mimo ze prąd sterujący cewki jest rzędu kilku uA , zawsze to większa gwarancja niezawodności