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

[BASCOM][ATmega32] - Multipleksowanie wyświetlaczy 7-segmentowych +aliasy +pętla

Zoomas 08 Lis 2012 16:48 3762 10
REKLAMA
  • #1 11504476
    Zoomas
    Poziom 12  
    Cześć! Zacząłem niedawno eksperymenty z Bascomem na płytce ZL3AVR, obecnie wziąłem sobie za cel napisanie zegarka na wyświetlacze 7-segmentowe, ale mam problem z ich obsługą.. a konkretniej wyświetlaniem kolejnych cyfr w pętli.

    Wszystko działało (w sensie wyświetlały się cyferki, nic specjalnego:)), zanim nie postanowiłem zastosować właśnie pętli FOR do wyświetlenia kolejnych cyfr. Pierwszym problemem okazał się brak możliwości stworzenia aliasów lub tablicy bitów dla Portów mikrokontrolera, więc przypisałem je do tablicy bytów aktualizowanych w pętli z aliasami portów. Efekt jest taki, że obecny program wyświetla wszystkie segmenty i czasem sobie mrugnie tylko, ale w żaden sposób nie pokazując cyfr które umieszczam w zmiennych..

    Fizyczne połączenia:
    PortA.0-7 - Segmenty wyświetlaczy
    PortC.0-3 - 4 przyciski
    PortD.4-7 - Zasilanie kolejnych segmentów

    Program wygląda następująco:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    W zamyśle ma to wyglądać następująco:
    1) Zwiększ odpowiednie wartości, jeżeli naciśnięto przycisk
    2) W pętli:
    - Włącz wyświetlacz o numerze A
    - Uaktualnij stan wyjść
    - Wystaw na PortA odpowiednią kombinację
    - Odczekaj, żeby sobie LEDy poświeciły
    - Wyłącz wyświetlacz o numerze A
    - Przejdź do następnego wyświetlacza

    Opis zmiennych/aliasów:
    Sw01, Sw05, Sw09, Sw13 - aliasy Pinc.0-4, gdzie podłączone są przycisk zwierające do masy
    C1, C2, C3, C4 - aliasy Portd.4-7 gdzie podłączone są bazy tranzystorów BC327 załączających zasilanie segmentów
    Disptime - czas w ms dla wyświetlacza na wyświetlenie cyfry
    A - zmienna do obsługi pętli
    Cathode(x) - tablica pomocnicza dla wprowadzenia powiązania pomiędzy pętlą, a aliasami C1..C4
    Digit(x) - przechowuje wartość do wyświetlenia na wyświetlaczu o numerze x
    Number(x) - kombinacja wyjść reprezentująca daną cyfrę na wyświetlaczu


    Będę wdzięczny za wszelką pomoc :)[/code]
  • REKLAMA
  • #2 11508343
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #3 11508729
    Procesor32
    Poziom 13  
    Zoomas napisał:
    Cześć! Zacząłem niedawno eksperymenty z Bascomem


    Powinieneś zamieścić ten wątek w dziale początkujący.
    Ten zegarek nie może poprawnie działać z powodu braku wyboru\konfiguracji\uruchomienia zarówno timera, jak i przerwania z nim związanego.

    Zgadzam się z przedmówca we wszystkich punktach.
    Poza tym w pętli Do ,,Loop zbędne jest For .. Next, można to zrobić inaczej.
  • REKLAMA
  • Pomocny post
    #4 11509349
    Benson000
    Poziom 14  
    Tu masz program pod ATtiny2313, jeśli potrafisz programować, to też potrafisz przerobić program na ATMegę:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #5 11510489
    Zoomas
    Poziom 12  
    Dzięki za wskazówki i pomoc :)

    Procesor32 napisał:
    Ten zegarek nie może poprawnie działać z powodu braku wyboru\konfiguracji\uruchomienia zarówno timera, jak i przerwania z nim związanego.

    W ww. programie jeszcze do fazy Timerowania nie doszedłem - stwierdziłem tylko brak poprawności wyświetlania zadanych cyfr :)

    Przerobiłem program, działa i wygląda następująco:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Co jest złego w używaniu 'debounce' w pętli głównej? Czy tylko w określonych warunkach ma to szkodliwy wpływ? Bo z tego co rozumiem to chodzi tylko o te opóźnienia 25ms w oczekiwaniu na stabilizację przycisku.

    Jak bym używał więcej przycisków to bym wrzucił je do jednej procedury i wywoływał ją za pomocą Debounce wykrycia naciśnięcia dowolnego przycisku. Zgadza się?
  • REKLAMA
  • Pomocny post
    #6 11511152
    Benson000
    Poziom 14  
    W debounce, przez opóźnienie 25 ms jeden z wyświetlaczy świeci dłużej niż reszta. Polecenie jest bardzo przydatne, ale czasami warto z niego zrezygnować i badać stan przycisku co 20 ms, tylko wtedy, gdy kończy się cykl wyświelania. 20 ms bo zazwyczaj czas naciśnięcia przycisku to 40 ms.
  • Pomocny post
    #7 11511292
    Procesor32
    Poziom 13  
    W celu eliminacji drgań styków należy użyć przerwania licznika, by odczytywać
    stan przycisku tylko raz na około 10 ms .
    Nie używamy funkcji Debounce i delay_ms !
    Czy przycisk został naciśnięty sprawdzamy w zmiennej globalnej dostępnej w programie głównym.
  • #8 11513054
    Zoomas
    Poziom 12  
    Dziękuję za kolejną porcję dobrych rad :)

    Wyrzuciłem debounce z pętli głównej i wstawiłem następujący kod do procedury 'Co4ms': (wszystko działa :))
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Dobrze, czy da się to zrobić lepiej/prościej? :)

    ---------------------------
    Procesor32 napisał:
    Czy przycisk został naciśnięty sprawdzamy w zmiennej globalnej dostępnej w programie głównym.

    Nie bardzo rozumiem co masz na myśli.. Mógłbyś jakoś inaczej to opisać?

    ---------------------------
    Debounce i delayms/delay - w momencie 'oczekiwania' zawieszone jest wykonywanie przerwań, czy przerwania mają wyższy priorytet?
  • #9 11513475
    Benson000
    Poziom 14  
    Skoro dobrze działa i napisałeś to w tylu linijkach to nie da się prościej i lepiej. Przerwania są wykonywane "na raz" z programem, więc nic nie może ich zatrzymać.
  • Pomocny post
    #10 11515307
    Procesor32
    Poziom 13  
    Zoomas napisał:
    Dobrze, czy da się to zrobić lepiej/prościej?

    Da się prościej.
    Nie trzeba deklarować ani stałych, ani zmiennych przycisków.
    Jedynie skonfigurować jako wejście i podciągnąć do masy.

    Zoomas napisał:
    Nie bardzo rozumiem co masz na myśli.. Mógłbyś jakoś inaczej to opisać?

    W tym przykładzie jest też przykład przycisków.

    Można również sprawdzać stany pinów w ten sposób.
    Kod: text
    Zaloguj się, aby zobaczyć kod




    Zoomas napisał:
    Debounce i delayms/delay - w momencie 'oczekiwania' zawieszone jest wykonywanie przerwań, czy przerwania mają wyższy priorytet?


    http://www.robotyka.net.pl/mikrokontrolery-avr-czesc-5-przerwania/
    Jest tam to opisane.

    Przykład
  • #11 11529967
    Zoomas
    Poziom 12  
    Super, dzięki wielkie za pomoc i wyjaśnienia, wszystko już śmiga!

    Docelowo układ będzie sterował robotem 4 osiowym, ale póki co udało mi się jeszcze upalić silnik krokowy dając mu za duży prąd z niewyregulowanego sterownika :))

    PS Robot nie będzie miał funkcji zegarka - to tylko taki ćwiczebny program był.
REKLAMA