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.

[atmega8] [bascom] czekanie programu na przycisk

przema72 08 Lip 2012 08:04 2757 19
  • #1 08 Lip 2012 08:04
    przema72
    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

    0 19
  • #2 08 Lip 2012 08:26
    MArSTER_1
    Poziom 18  

    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.

    0
  • #3 08 Lip 2012 08:32
    przema72
    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

    0
  • #4 08 Lip 2012 08:36
    MArSTER_1
    Poziom 18  

    Nie znam się na motoryzacji ale co to w tym przypadku znaczy "duża szybkość"? Ile razy na sekundę bedą się pojawiały impulsy?

    0
  • #5 08 Lip 2012 08:43
    przema72
    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"

    0
  • #6 08 Lip 2012 08:51
    MArSTER_1
    Poziom 18  

    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

    0
  • #7 08 Lip 2012 08:57
    przema72
    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

    0
  • Pomocny post
    #8 08 Lip 2012 09:00
    MArSTER_1
    Poziom 18  

    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.

    0
  • #9 08 Lip 2012 10:53
    przema72
    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

    0
  • #10 08 Lip 2012 11:02
    30402
    Użytkownik usunął konto  
  • #11 08 Lip 2012 11:18
    przema72
    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]

    0
  • #12 08 Lip 2012 12:02
    MArSTER_1
    Poziom 18  

    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.

    0
  • #13 08 Lip 2012 13:37
    30402
    Użytkownik usunął konto  
  • #14 08 Lip 2012 16:18
    przema72
    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

    0
  • #15 08 Lip 2012 19:20
    30402
    Użytkownik usunął konto  
  • #16 08 Lip 2012 20:21
    przema72
    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

    0
  • #17 08 Lip 2012 20:32
    30402
    Użytkownik usunął konto  
  • #18 08 Lip 2012 20:41
    przema72
    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

    0
  • Pomocny post
    #19 08 Lip 2012 21:23
    30402
    Użytkownik usunął konto  
  • #20 09 Lip 2012 08:10
    przema72
    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

    0