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

Arduino 2560 - program do zmiany stanów, nie działa, potrzebna korekta kodu,

Kazymir 24 Sty 2019 14:37 732 12
REKLAMA
  • #1 17726350
    Kazymir
    Poziom 8  
    Posty: 8
    Witam. Z racji, że jestem w miarę początkujący jeśli chodzi o arduino
    Cel programu: Po wciśnięciu przycisku (NO) mikroprocesor zmienia stan logiczny na wyjściach (A, B, C, D) według tablicy karnaught.
    Problem: Brak zmiany stanów kogicznych na wyjściach (A, B, C, D)
    Kod programu:
    Kod: C#
    Zaloguj się, aby zobaczyć kod

    Z góry dziękuję za każdą pomocną radę
  • REKLAMA
  • #3 17726403
    Kazymir
    Poziom 8  
    Posty: 8
    Przycisk podłączony jak na grafice.
    Arduino 2560 - program do zmiany stanów, nie działa, potrzebna korekta kodu,
  • REKLAMA
  • #4 17726474
    kaczakat
    Poziom 34  
    Posty: 1748
    Pomógł: 317
    Ocena: 230
    Przy takim podłączeniu to nie zadziała, pin musi mieć dwa wymuszone stany, jeden dla "nie wyciśnięty", drugi dla "wciśnięty". Do tego służą rezystory podciągające. W MEGA można użyć programowego, wtedy wejście definiujesz "pinMode(BUTTON, INPUT_PULLUP);. Może być zewnętrzny rezystor 10k wpięty na tym schemacie między pin arduino i VCC. W obu przypadkach jednak wciśnięcie przycisku będzie ściągać napięcie w dół, czyli wywołanie przerwania powinno być na zbocze opadające, nie rising: https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/ . Pomyśl jeszcze jak zrobić, by było 1 zliczenie przy 1 wciśnięciu - drgania styków. Albo dorób trochę sprzętu przy pinie, albo jakoś programowo.
    Jak to musi być rising to w MEGA tylko rezystor zewnętrzny pulldown, odwracasz sytuację, pin na stałe wpięty do GND przez rezystor ,a zwierasz przyciskiem do VCC.
    Pomogłem? Kup mi kawę.
  • REKLAMA
  • #5 17726572
    Kazymir
    Poziom 8  
    Posty: 8
    Kod: C#
    Zaloguj się, aby zobaczyć kod

    Czy tak poprawiony program będzie działać?
    Oraz czy pętla komputer jest dobrze napisana?
    I co do tego zliczania przerwań co proponujesz? Bo ja całkowicie nie wiem jak to zrobić, ale szczerze wolałbym rozwiązanie programowe, ale sprzętowym też nie pogardzę.
  • #6 17726654
    kaczakat
    Poziom 34  
    Posty: 1748
    Pomógł: 317
    Ocena: 230
    Ta zmienna z przerwania może być typu uint8_t skoro mieści się w liczbie 255, docelowo, na razie zostaw jak jest. Testuj, to zależy co tam teraz masz na pinie. Jak nic to na wydruku SEQUENCE zobaczysz dużą liczbę. Gdzieś też powinieneś ją zerować, od jakieś wartości zawijać znowu do 0. Może być od razu w przerwaniu if (SEQUENCE>=16) SEQUENCE=0;. Bez eliminacji drgań styków będziesz przynajmniej losował liczbę od 0-15.
    Pomogłem? Kup mi kawę.
  • REKLAMA
  • #7 17726971
    Kazymir
    Poziom 8  
    Posty: 8
    Cytat:
    Ta zmienna z przerwania może być typu uint8_t skoro mieści się w liczbie 255, docelowo, na razie zostaw jak jest.

    Masz na myśli, że mam poprawić na "SEQUENCE = Serial.readStringUnti8_t('\n');"?
    Cytat:
    Jak nic to na wydruku SEQUENCE zobaczysz dużą liczbę. Gdzieś też powinieneś ją zerować, od jakieś wartości zawijać znowu do 0. Może być od razu w przerwaniu if (SEQUENCE>=16) SEQUENCE=0;.

    Myślisz, że jak zamienię funkcję "volatile int SEQUENCE = 0;" na "volatile int (SEQUENCE>=16) SEQUENCE = 0;"?
    Cytat:
    Bez eliminacji drgań styków będziesz przynajmniej losował liczbę od 0-15.

    I tu jest właśnie mojue pytanie jak wyeliminować te drgania?
  • #8 17727724
    kaczakat
    Poziom 34  
    Posty: 1748
    Pomógł: 317
    Ocena: 230
    Poczytaj to http://mikrokontrolery.blogspot.com/2011/04/przycisk-drgania-stykow-debouncing.html, a (int, uint, int8_t, uint8_t, char) to typy zmiennych. Więcej dowiesz się na kursie: https://forbot.pl/blog/kursy i przerób go od początku bo mylisz deklarację zmiennych z funkcjami. "volatile int SEQUENCE = 0;" możesz zamieni się w "volatile uint8_t SEQUENCE = 0;" gdy zechcesz zmienić typ zmiennej SEQUENCE z int na uint8_t . Przeczytaj jakąś książkę o C, są nawet takie darmowe.
    while (BUTTON == LOW) to jest jakaś forma eliminacji drgań styków, nie najlepsza do zwykłych przycisków i nic nie dająca z przerwaniami, bo one mogą się generować w czasie zablokowania procesora delayem. Jak już umiesz zrobić przypisanie przerwania to możesz też po jego wywołaniu zrobić deattachInterrupt by je wyłączyć i włączyć znowu po czasie przewidywanym dla pojedynczego wciśnięcia, tylko zamiast delay użyj do tego przynajmniej funkcji millis.
    Pomogłem? Kup mi kawę.
  • #9 17727975
    Kazymir
    Poziom 8  
    Posty: 8
    Póki co mam wszystko ogarnięte, ale pozostaje jeszcze sprawa z:
    
    void komputer(){
      if(Serial.available() > 0){
        SEQUENCE = Serial.readStringUntil('\n');
        Serial.println(SEQUENCE);
      }
    }
    


    Nie wiem jak sprawić by na monitorze portu szeregowego pokazywała się aktualna wartość SEQUENCE.
    Gdy kompiluje program wyskakuje mi błąd:
    In function 'void komputer()':

    Bramki_logiczne_sprawdzenie:121:14: error: cannot convert 'String' to 'volatile uint8_t {aka volatile unsigned char}' in assignment

    SEQUENCE = Serial.readStringUntil('\n');

    ^

    exit status 1
    cannot convert 'String' to 'volatile uint8_t {aka volatile unsigned char}' in assignment
  • #10 17728332
    Konto nie istnieje
    Poziom 1  
  • #11 17729251
    Kazymir
    Poziom 8  
    Posty: 8
    Czyli mogę zamienić wszystkie "else if (SEQUENCE == x)" na "case x"? Dobrze rozumiem?
  • #12 17729377
    Konto nie istnieje
    Poziom 1  
  • #13 17729415
    Kazymir
    Poziom 8  
    Posty: 8
    Rozmumiem, zmieniłem już i wydaje mi się, że kod ładniej wygląda. :D

Podsumowanie tematu

✨ Użytkownik ma problem z programem na Arduino 2560, który ma zmieniać stany logiczne na wyjściach (A, B, C, D) po wciśnięciu przycisku. Problemy wynikają z nieprawidłowego podłączenia przycisku oraz braku odpowiednich rezystorów podciągających. Użytkownik został poinstruowany, aby użyć rezystora 10k lub skorzystać z opcji INPUT_PULLUP w kodzie. Dodatkowo, zasugerowano zastosowanie przerwań do obsługi wciśnięcia przycisku oraz eliminacji drgań styków. Użytkownik zaktualizował kod, aby poprawnie wyświetlać wartość zmiennej SEQUENCE na monitorze szeregowym, a także przekształcił strukturę warunkową w pętli loop na konstrukcję switch/case dla lepszej czytelności.
Wygenerowane przez model językowy.
REKLAMA