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

Bascom, przyciski-błąd w rozumowaniu

12 Sty 2010 22:07 3942 33
  • Poziom 38  
    Zrobiłem taki programik:
    Code:

    'Program do sterowania małych silników krokowych za pomocą ATMega8 i układu L6219 lub LB1845
    'sterowanie ćwierćrokowe, zasilanie 30V
    'set i reset zastosowałem w celach poglądowych- można- a nawet należy zastąpić to np.PortB=&B00001100 itp.

    $regfile "m8def.dat"
    $crystal = 4915200
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db7 = Portc.0 , Db6 = Portc.1 , Db5 = Portc.2 , Db4 = Portc.3 , E = Portc.4 , Rs = Portc.5
    Ddrb = &HFF
    sei

    Config Timer0 = Timer , Prescale = 8       ' teraz da ok. 0.417us- ale może skrócić
    Enable Ovf0
    On Ovf0 Step_delay
    Config Pind.2 = Input
    Set Portd.2
    Config Pind.4 = Output
    Dim Kier As Byte
    Dim Temp0 As Byte
    Dim Opoznienie_odczytu As Byte


    Ph1 Alias Portb.0   'kierunek przepływu prądu w uzwojeniu Ph1
    Ph2 Alias Portb.1   'kierunek przepływu prądu w uzwojeniu Ph2
    I01 Alias Portb.2   'napięcie dostarczane do uzwojeń- 1 , 2/3 lub 1/3 Imax
    I11 Alias Portb.3
    I02 Alias Portb.4
    I12 Alias Portb.5

    Set I01             ' na początek ustawiamy mały prąd
    Set I11
    Set I02
    Set I12

    Dim Next_step As Byte
    Next_step = 0
    Dim Flaga As Byte
    Flaga = 0
    'Dim Liczba_krokow As Byte    'to może służyć do zaprogramowania rampy- później
    'Liczba_krokow = 0
    Kier = 0
    Cls
    Cursor Off
    Locate 1 , 1
    Lcd "ustal kierunek "



    Do

       If Flaga = 1 Then       'gdy jest przerwanie od Timer0- co 237us
         If Pind.2 = 0 Then       'i jest wciśnięty przycisk PIND.2
             Incr Opoznienie_odczytu       'no bo przycisk ma drgania dłużej niż 237us- niech zwiększy
                                            'to sprawdzanie powtórne do 17ms

             If Opoznienie_odczytu >= 70 Then       'dajmy mu na wygaszenie drgań 17ms

                If Temp0 = 0 Then       ' i jest zezwolenie na zmianę stanu
                   Gosub Ustawianie
                   Temp0 = 1       ' zablokuj zezwolenie na zmianę stanu
                End If

                Opoznienie_odczytu = 0       'Jak już ustawił kierunek to pozwolimy mu liczyć od początku-
                                              'po powtórnym naciśnięciu PIND.2
              End If

          Else
             Temp0 = 0  'zezwalaj na zmiany
          End If

          If Kier = 1 Then
             Gosub Kier_prawo
          End If

          If Kier = 2 Or Kier = 0 Then
             Gosub Kier_stop
          End If

          If Kier = 3 Then
             Gosub Kier_lewo
          End If

          Flaga = 0
          Toggle Portd.4       'to jest tylko do pomiaru

       End If

    Loop
    End


    Step_delay:
       Timer0 = 110     'no to skracamy- ten silnik się jeszcze kręci- ale na jakimś innym moze to trzeba zmienić
                         'tu jest ok.237us obliczone a 248us zmierzone- procesor jednak coś wolno liczy
       Flaga = 1
          Incr Next_step
             If Next_step >= 16 Then
                Next_step = 0
          End If

    Return


    Ustawianie:

          Select Case Kier
             Case 0
               Locate 1 , 1
               Lcd "kierunek- lewo " ; Kier
             Case 1
               Locate 1 , 1
               Lcd "kierunek- stop " ; Kier
             Case 2
               Locate 1 , 1
               Lcd "kierunek- praw " ; Kier
             Case 3
               Locate 1 , 1
               Lcd "kierunek- stop " ; Kier

           End Select

        Incr Kier
         If Kier >= 4 Then
           Kier = 0
         End If

    Return


    Kier_prawo:
       'Incr Liczba_krokow

        Select Case Next_step

             Case 0
                Reset Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Set I02
             Case 1
                Reset Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Reset I02
             Case 2
                Reset Ph1 : Reset I11 : Set I01 : Reset Ph2 : Reset I12 : Set I02
             Case 3
                Reset Ph1 : Set I11 : Reset I01 : Reset Ph2 : Reset I12 : Reset I02
             Case 4
                Set Ph1 : Set I11 : Set I01 : Reset Ph2 : Reset I12 : Reset I02
             Case 5
                Set Ph1 : Set I11 : Reset I01 : Reset Ph2 : Reset I12 : Reset I02
             Case 6
                Set Ph1 : Reset I11 : Set I01 : Reset Ph2 : Reset I12 : Set I02
             Case 7
                Set Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Reset I02
             Case 8
                Set Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Set I02
             Case 9
                Set Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Reset I02
             Case 10
                Set Ph1 : Reset I11 : Set I01 : Set Ph2 : Reset I12 : Set I02
             Case 11
                Set Ph1 : Set I11 : Reset I01 : Set Ph2 : Reset I12 : Reset I02
             Case 12
                Reset Ph1 : Set I11 : Set I01 : Set Ph2 : Reset I12 : Reset I02
             Case 13
                Reset Ph1 : Set I11 : Reset I01 : Set Ph2 : Reset I12 : Reset I02
             Case 14
                Reset Ph1 : Reset I11 : Set I01 : Set Ph2 : Reset I12 : Set I02
             Case 15
                Reset Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Reset I02


          End Select

    Return

    Kier_lewo:
      'Incr Liczba_krokow

          Select Case Next_step

             Case 0
                Reset Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Set I02
             Case 1
                Reset Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Reset I02
             Case 2
                Reset Ph1 : Reset I11 : Set I01 : Set Ph2 : Reset I12 : Set I02
             Case 3
                Reset Ph1 : Set I11 : Reset I01 : Set Ph2 : Reset I12 : Reset I02
             Case 4
                Set Ph1 : Set I11 : Set I01 : Set Ph2 : Reset I12 : Reset I02
             Case 5
                Set Ph1 : Set I11 : Reset I01 : Set Ph2 : Reset I12 : Reset I02
             Case 6
                Set Ph1 : Reset I11 : Set I01 : Set Ph2 : Reset I12 : Set I02
             Case 7
                Set Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Reset I02
             Case 8
                Set Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Set I02
             Case 9
                Set Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Reset I02
             Case 10
                Set Ph1 : Reset I11 : Set I01 : Reset Ph2 : Reset I12 : Set I02
             Case 11
                Set Ph1 : Set I11 : Reset I01 : Reset Ph2 : Reset I12 : Reset I02
             Case 12
                Reset Ph1 : Set I11 : Set I01 : Reset Ph2 : Reset I12 : Reset I02
             Case 13
                Reset Ph1 : Set I11 : Reset I01 : Reset Ph2 : Reset I12 : Reset I02
             Case 14
                Reset Ph1 : Reset I11 : Set I01 : Reset Ph2 : Reset I12 : Set I02
             Case 15
                Reset Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Reset I02


          End Select

    Return

    Kier_stop:          'stop ma zachować aktualne położenie wirnika

    Return

    No i w zasadzie działa.
    Ale przycisk działa nie zawsze pewnie- czasem trzeba dwa razy nacisnąć a czasem przeskakuje.
    Podejrzewam że coś sknociłem- ale nie wiem co.
    Może ktoś znajdzie?
  • Pomocny post
    Poziom 43  
    Może zrób tak:
    Code:

         If Pind.2 = 0 Then       'i jest wciśnięty przycisk PIND.2
             Incr Opoznienie_odczytu       'no bo przycisk ma drgania dłużej niż 237us- niech zwiększy
                                            'to sprawdzanie powtórne do 17ms

             If Opoznienie_odczytu >= 70 Then       'dajmy mu na wygaszenie drgań 17ms

                If Temp0 = 0 Then       ' i jest zezwolenie na zmianę stanu
                   Gosub Ustawianie
                   Temp0 = 1       ' zablokuj zezwolenie na zmianę stanu
                End If

                Opoznienie_odczytu = 0       'Jak już ustawił kierunek to pozwolimy mu liczyć od początku-
                                              'po powtórnym naciśnięciu PIND.2
              End If

          Else
             Temp0 = 0  'zezwalaj na zmiany
             Opoznienie_odczytu = 0    '<---------------------------------------------------
          End If
  • Poziom 38  
    No dobrze- działa dużo lepiej- może nawet zupełnie dobrze.
    Przycisk już chyba zrównałem z płytką.
    Ale gdzie był mój błąd w rozumowaniu?
  • Pomocny post
    Poziom 43  
    Gdy przycisnąłeś przycisk ale trzymałeś go mniej niż 70 okresów to zmienna Opoznienie_odczytu dochodziła do powiedzmy 65.
    Ale po puszczeniu przycisku nie resetowałeś zmiennej.
    Czyli miała ona dalej 65.
    I kolejne przyciśnięcie było obsługiwane za 5 cykli, a nie za 70 cykli tak jak chciałeś. Bo zmienna musiała doliczyć do 70 a już miała 65 czyli brakowało jej tylko 5.
    Tak samo podczas puszczania przycisku. Zmienna była resetowana podczas obsługiwania naciśnięcia, ale podczas puszczania przycisk także generuje zakłócenia i zmienna także była naliczana a już więcej nic jej nie resetowało.
  • Poziom 38  
    No tak podejrzewałem- co będzie jak przycisk puszczę wcześniej.
    Jak dawałem np. Opoznienie_odczytu =20 to było pewniej.
    Ale powiedz mi czy Twoje rozwiązanie jest "łataniem" moich pomysłów czy należy to zrobić inaczej?
  • Pomocny post
    Poziom 43  
    Jest to łatanie, ale już powinno działać.
    Czy należy to zrobić lepiej? Nie wiem. Mam pomysł ale czy on będzie lepszy to nie wiadomo.
    Ja bym przefiltrował wyniki średnią ruchową i wprowadził histerezę.
    Powiedzmy sumujesz 64 próbki i jak średnia przekroczy 40 to uznajesz że przycisk jest wciśnięty a jak spadnie poniżej 30 to że jest puszczony.
    Tyle że to wymaga dużej ilości RAMu.
    Lepiej zostań przy tym co jest.
  • Poziom 41  
    Kolego janbernat

    Kod wykrywający naciśnięcie przycisku
    Code:
    If Pind.2 = 0 Then                              'jeśli przyciśnięty switch_0
    
     M1 = 1                                           'ustaw bit pomocniczy
      If M1 = 1 And M2 = 0 Then                       'jeśli nadal wciśnięty
          '  COŚ DO ZROBIENIA .......

                If Temp0 = 0 Then       ' i jest zezwolenie na zmianę stanu
                   Gosub Ustawianie
                   Temp0 = 1       ' zablokuj zezwolenie na zmianę stanu
                End If

              M2 = 1                                  'zablokuj dalsze zmiany do czasu
                                                      'zwolnienia switch_0
           Else
            M1 = 0 : M2 = 0                  'kasuj bity pomocnicze
         End If
       End If
  • Poziom 43  
    "Wykrywany kod naciśniętego przycisku"? Chyba kod wykrywający naciśnięcie przycisku.

    Nie bardzo rozumiem jak to ma działać.
    Są 3 zmienne pomocnicze. Temp0, M1 i M2. I z tego co widzę to jedynie gwarantuje jednorazowe wykonanie się Gosuba podczas trzymania przycisku. A do tego wystarczy jedna zmienna.
    Ale to nie ma zabezpieczenia przed drganiami przycisków.
    Do tego wciśnięcie przycisku na jeden okres spowoduje ustawienie zmiennej M1 ale już jej nie skasuje. A zmiennej M2 w ogóle nic nie ustawia. Tylko ją kasuje.
    Jendym słowem: co do za Bascom, przyciski-błąd w rozumowaniu * patent?

    *„wulgaryzmy” usunięte.
  • Poziom 41  
    Czy ty napewno zrozumiałeś ten kod ,bo chyba żle rozumujesz .
    Przecież napisałem
    ' COŚ DO ZROBIENIA .......
    A wkleiłem część twojego kodu byś zobaczył że w tym miejscu możesz robić co chcesz .
    To w takim razie czysty kod wykrywania naciśniętego przycisku przy naciskaniu .

    Code:
    If Pind.2 = 0 Then                              'jeśli przyciśnięty switch_0
    
     M1 = 1                                           'ustaw bit pomocniczy
      If M1 = 1 And M2 = 0 Then                       'jeśli nadal wciśnięty
          '  COŚ DO ZROBIENIA .......

              M2 = 1                                  'zablokuj dalsze zmiany do czasu
                                                      'zwolnienia switch_0
           Else
            M1 = 0 : M2 = 0                  'kasuj bity pomocnicze
         End If
       End If


    Wystarczy zmienić kolejność zmiennych by zadziałał na puszczenie przycisku
  • Poziom 43  
    marco47 napisał:
    przeproś

    Czy Ty aby nie przesadzasz?
    Nie przeproszę, bo to ze zmiennymi M1 i M2 nadal obowiązuje. Widzę że zedytowałeś post, ale nadal nie wiadomo co do czego i nie ma zabezpieczenia przed zakłóceniami od przycisku. Tak więc zapodałeś kod który będzie działał gorzej niż oryginał janbernata.

    Zresztą:
    marco47 napisał:
    Przecież napisałem
    ' COŚ DO ZROBIENIA .......

    No właśnie. Coś do zrobienia ma być tam gdzie pisze "' COŚ DO ZROBIENIA ......."
    A to co wkleiłeś z mojego* programu jest później więc nic dziwnego że zarzuciłem Ci nadmiarowość zmiennej Temp0. A wystarczyło napisać że to jest przykładowa (i bezsensowna) cześć programu umieszczona tam jedynie dla przykładu.

    W odpowiedzi na polepszanie Twojego kodu które co raz wprowadzasz mogę jedynie usunąć to co napisałem, ale na przeprosiny nie licz.

    *który to wcale nie jest mój.
  • Poziom 43  
    Teraz tylko zmienna M1 jest nadmiarowa. Można ją usunąć a działanie kodu nie zmieni się.
    Ale zostanie jeszcze jeden mankament.
    Zauważ że wciśnięcie przycisku na jedne okres ustawi zmienną M1 na 1 i M2 też na 1.
    „COŚ DO ZROBIENIA .......” zostanie wykonane.
    Ale jeżeli przycisk zostanie szybko puszczony to kolejne sprawdzenie da wynik taki że przycisk jest puszczony i nawet pierwszy If się nie wykona. Tak więc zmienne M1 i M2 nie zostaną wyzerowane.
    I kolejne przyciśnięcie natrafi na ustawione zmienne M1 i M2 a więc program nie zareaguje na kolejne przyciśnięcie. Usunięcie zmiennej M1 nic nie da bo nadal M2 będzie blokowała.
    Trzeba by zrobić tak:
    Code:

    If Pind.2 = 0 Then                          'jeśli przyciśnięty switch_0
        If M2 = 0 Then                          'jeśli wcześniej był puszczony
            'COŚ DO ZROBIENIA .......

            M2 = 1                                 'zablokuj dalsze zmiany do czasu puszczenia przycisku
        End If
    Else
        M2 = 0                                    'puszczony przycisk więc odblokuj zmiany
    End If

    Ale taki kod nadal nie ma zabezpieczenia przed drganiami przycisku.
  • Poziom 43  
    Działa bo zawsze zdarza Ci się wcisnąć przycisk na dłużej niż 1 okres.
    A patent z ADC dobry. Ale podłączając to w klasyczny sposób nie da się podłączyć 1023 przycisków, bo charakterystyka nie jest liniowa (wychodzi dzielnik napięcia a potrzeba by było sumator).
    Masz rezystory 1, 2, 4k i tak dalej? A musi być jeszcze jeden wspólny (który na pewno masz tylko nie wiem jaki) do VCC (jeżeli te od przycisków idą do masy). I właśnie stąd wychodzi dzielnik napięcia i nieliniowa charakterystyka. Kiedyś to liczyłem.
  • Poziom 41  
    Napisałem że teoretycznie 1023 , w rzeczywistości testowałem z dobrym skutkiem do 100 przycisków a używam max 20 . Rezystory nie muszą być dobrane dokładnie takie jak wychodzą z wyliczeń . Różnicę ustawiam programowo.
  • Poziom 43  
    marco47 napisał:
    Napisałem że teoretycznie 1023

    Wiem, ale mi chodzi o to że nawet teoretycznie nie może ich być 1023 bo niektóre wartości napięcia nie trafią dokładnie w próbki ADC. Powiedzmy dwa napięcia zostaną odczytane jako 432 a kolejne jako 434 (ze względu na nieliniowość). Czyli masz dwa nierozróżnialne przyciski a potem jedną próbkę 433 która nigdy się nie pojawi.
    I ja mówię o teorii a nie o tym że rezystory nieprecyzyjne czy coś.
    No chyba że każdy przycisk ma osobny rezystor większy o jeden od poprzedniego i wtedy może ich być 1023. Ale nie będzie można sumować wciśnięcia przycisków. Można by jak by były rezystory 1, 2, 4, 8k itd.
    Ale chyba coś mi się pomyliło bo wtedy może być tylko 10 przycisków (każdy będzie wpływał na 1 bit a ADC). Czyli zwracam honor z tymi 1023 przyciskami.
  • Poziom 43  
    Ja też nie stosuję, ale wolę mieć obsługę naciśnięcia dwóch lubnawet wszystkich przycisków na wypadek jak ktoś tak je naciśnie.
    U ciebie gdy się naciśnie dwa przyciski to to może zostać rozpoznane jako naciśnięcie jakiegoś tam jednego innego przycisku jak się domyślam. Tak?
    Jeżeli program czeka na naciśniecie S1, a nacisnę S1 i S2 to on uzna to za naciśnięcie S1 mimo że nacisnąłem też S2. Czyli nie sprawdzi tego że coś jeszcze zostało naciśnięte.
    Ale przynajmniej nie będę miał takiej sytuacji że naciskając S2 i S3 zostanie to odczytane jako naciśniecie S1.
    Ja właśnie przed czymś takim się zawsze zabezpieczam.

    Nie ma to jak dobry Offtop.
  • Poziom 38  
    Cały czas są to wariacje na temat przerzutnika T.
    To co podał marco47- to jest prawie tak jak z książki P. Góreckiego- kod C009e do ściągnięcia ze strony EdW.
    Z tym że jest tam waitms5 a ten fragment jest wykonywany co 4 przejścia- czyli co 20ms.
    I tylko wtedy to może działać- a marco47 nic o tym nie wspomina.
    Ja też zacząłem od programowego przerzutnika (i z tej samej książki)- ale w moim wypadku cykl jest określony przez częstotliwość impulsów sterujących silnikiem- dla tego silnika jest 237us a dla innego może być inny.
    Dlatego wprowadziłem "Opoznienie_odczytu" aby móc inkrementować to do 15-30ms- bo wtedy powtórne sprawdzanie stanu pinu dopiero ma sens.
    Poprawka podana przez atom1477 sprawia że przycisk chodzi tak że nie jestem w stanie go "oszukać"- może za wolne mam palce.
    Atom napisał: "Jest to łatanie, ale już powinno działać."
    No i działa- dzięki wielkie.
    Ale nie wiem czy jest to optymalne.
    Jak będę miał "moce przerobowe" to spróbuję zrobić to w kilku wersjach.
    P.S.
    Zwłaszcza że ten L6219 i ten przycisk jest zrobiony "przy okazji" nieco innego projektu z którym dopiero się namęczę.
    A ten program może mi oszczędzi pytań "dlaczego silnik krokowy się nie kręci"
  • Pomocny post
    Poziom 43  
    No właśnie jest to prawie ten sam kod co z książki. Else jednego z Ifów jest w niewłaściwym miejscu i wystąpi ten błąd o którym wspomniałem.
    A tak z ciekawości: dlaczego nie zastosujesz klasycznego Debounce?
  • Poziom 38  
    Apage Satanas!!!
    A jak wsadzę pustą pętlę to jak silnik (w zasadzie L6219) ma dostawać impulsy co 237us?
  • Poziom 41  
    Sprawdzałem w realu że naciśnięcie dwóch lub więcej przycisków w moim programie wykona tylko kod przycisku naciśniętego jako pierwszy, a reszta jest blokowana do czasu puszczenia tego przycisku . Więc nie ma możliwości wykonania złego kodu (działania).
    Mała część kodu dla przycisku dwu funkcyjnego
    Naciśnięcie wykonuje włącz/wyłącz urządzenia a przytrzymanie przejście do innego menu
    Code:
    '*********************  Globalny licznik opóznienia  ******************         0.014ms
    
      If Przycisk < 10 Then Incr Licz_opoznienie      'zwiększ licznik opóznienia
           If Licz_opoznienie > 400 Then Licz_opoznienie = 0       'ustaw licznik opóznienia


    '***********************  Przyciski ON_OFF  ************************************
    '-----------------  Wyłącznik Zasilacza +35V / Generator   ---------------------

    If Przycisk = 7 Then                              'jeśli przyciśnięty switch_7
      M1 = 1                                          'ustaw bit pomocniczy
       If M1 = 1 And M2 = 0 And Licz_opoznienie = 0 Then       'jeśli wystąpi warunek
          Toggle Menu_1                               'zmień bit kolejności menu
           If Menu_1 = 0 Then Menu = 0                'przypisanie kolejności do menu Zsilacz
            If Menu_1 = 1 Then Menu = 1               'przypisanie kolejności do menu Generator
              Menu_2 = 1
               M2 = 1                                 'zablokuj dalsze zmiany do czasu zwolnienia switch_7
           End If
       Else
         If M1 = 1 And M2 = 0 Then                    'jeśli wciśnięty
          If Menu = 0 Then Toggle Portb.4             'zmień stan wyjścia na przeciwny
           M1 = 0                                     'zeruj bit pomocniczy
       End If
    End If
    ..........
    ..........
    ..........
    '-------------------------------------------------------------------------------
    If Przycisk = 10 Then                             'jeśli nie naciśnięto przycisku
       Licz_opoznienie = 0                            'zerowanie globalnego licznika opóznienia
        M1 = 0 : M2 = 0                               'zeruj bity pomocnicze
         N1 = 0 : N2 = 0                              'zeruj bity pomocnicze
          L1 = 0 : L2 = 0                             'zeruj bity pomocniczy

           If Lut_ustaw = 1 Then Incr Licznik_ustaw   'jesli ustawiano temperaturę zwiększ licznik
            If Licznik_ustaw > 4000 Then              'po 5 sekundach
             Licznik_ustaw = 0                        'zeruj licznik
              Lut_ustaw = 0                           'przełącz na wyświetlanie temp. mierzonej
           End If
    '---------------------   Przycisk akustyczny   ---------------------------------
           Else
            N1 = 1                                    'ustaw bit pomocniczy
             If N1 = 1 And N2 = 0 Then                'jeśli nadal wciśnięty
              Toggle Portb.6                          'włącz sygnał przycisków
               Incr Sygnal                            'zwiększ licznik jasności wyświetlaczy
                 If Sygnal = 30 Then
                   Sygnal = 0                         'jezeli licznik 4 to zeruj
                    Portb.6 = 0                       'wyłącz sygnał  przycisków
                     N2 = 1                           'zablokuj dalsze zmiany do czasu zwolnienia przycisku
        End If
       End If
      End If
  • Poziom 43  
    janbernat: Racja. Musisz mieć odliczanie niepowodujące wstrzymania programu.

    marco47: No bo tym razem wciskasz przyciski niedokładnie jednocześnie. Chyba że masz tak dobrane rezystory że wciśnięcie dwóch przycisków nie da napięcia mieszczącego się w przedziale zarezerwowanym dla jakiegoś jednego przycisku. Ale to na pewno nie to, bo inaczej układ nie reagował by wcale a jednak reaguje na pierwszy przycisk.
    Musiał byś raczej złączyć dwa przyciski i wtedy wcisnąć:
    Bascom, przyciski-błąd w rozumowaniu

    Jak nawet to nie spowoduje błędu, to tylko pogratulować.

    Dodano po 5 [minuty]:

    Pokaż raczej kawałek schematu z przyciskami, a ja powiem Ci które przyciski powinieneś złączyć :D
  • Poziom 43  
    Takiej odpowiedzi się spodziewałem. Zbywasz mnie.
    Podaj mi wartości elementów a ja Ci podam które przyciski trzeba na raz wcisnąć aby spowodować błąd. Oczywiście jak będziesz niedbale wciskał to błędu nie będzie, i dlatego polecam zwarcie dwóch przycisków elektrycznie.
  • Poziom 43  
    Takiej odpowiedzi też się spodziewałem :D
    Czyli sprawdzasz stan przycisków 1000 razy na sekundę? Ciekawe co z zakłóceniami. Nimi też się nie przejmujesz bo przecież użytkownik też nie będzie na siłę wprowadzał zakłóceń żeby spowodować błąd, no nie?
    Rozumiem też że projekt jest zamknięty i wartości elementów są tajne. Jeżeli nie są tajne, to tylko nie podawaj przykładowych 2 czy 3 wartości. Już widziałem że masz 10 przycisków i tylu wartości rezystorów się spodziewam, jak już.
  • Poziom 41  
    Podałem przykład teoretyczny z szybkością pętli.
    Przecież wartości możesz wyliczyć Sam . Przycisków jest np. 10 a zakres ADC 1023 . Wartości rezystancji z dowolnego szeregu , jednak lepiej z małych wartości rezystancji .
  • Poziom 43  
    Oczywiście że mogę wyliczyć sam. Ale chodzi mi o Twoje wartości żebyś mógł zobaczyć że Twój układ nie jest odporny na błędy.
  • Poziom 41  
    Dalej nie rozumiem co chcesz udowodnić . Przecież napisałem że program działa bez zakłóceń mimo naciskania dwóch lub więcej przycisków . Zawsze wykona kod pierwszego przycisku którego wykryje.
    Zresztą cały czas testuję na bieżąco na testerku

    Bascom, przyciski-błąd w rozumowaniu