Seven Segment Simple Display
AVR Studio 4 plugin

O pluginie

Biblioteka SevenSegmentSimple jest rozszerzeniem (pluginem) przeznaczonym do instalacji w środowisku AVR Studio 4 firmy Atmel. Zadaniem plugina jest symulacja prostego wyświetlacza siedmiosegmentowego, który podłączamy do wyprowadzeń (portów) mikrokontrolera. Biblioteka może być przydatna podczas nauki programowania procesorów AVR w języku assemblera, pozwala przećwiczyć oprogramowanie jednego z typowych zagadnień - obsługi wyświetlacza siedmiosegmentowego sterowanego statycznie. Użytkownik ma możliwość decydowania o typie symulowanego wyświetlacza (wspólna anoda lub katoda), o jego kolorze (czerwony, zielony, niebieski, żółty) oraz o przypisaniu poszczególnych wyprowadzeń segmentów wyświetlacza do sygnałów sterujących (wybrany port I/O, VCC lub GND).
Stan wyświetlacza jest odświeżany w każdym kroku symulacji wykonywanej w AVR Studio. Dane potrzebne do odrysowania segmentów wyświetlacza są pobierane z symulowanego aktualnie procesora przy pomocy metody ReadMemory interfejsu IAvrTarget z ustawionym parametrem TARGET_MEM_IO. Wyświetlacz można podłączyć do wybranych bitów jednego z czterech portów: PORTA, PORTB, PORTC, PORTD od adresach w przestrzeni I/O odpowiednio: 0x1B, 0x18, 0x15, 0x12. W celu jak najlepszego ozdwierciedlenia rzeczywistego układu, możliwe jest też stałe przypisanie wybranych segmentów do masy lub napięcia zasilania - zależnie od typu wyświetlacza spowoduje to stałe świecenie lub wygaszenie odpowiednich segmentów podczas symulacji.

Stan wybranego segmentu podczas debugowania programu w AVR Studio określają następujące warunki:

  • dla wyświetlacza typu wspólna katoda (katoda podłączona do GND, sterowanie anod)
    segmentn = 1 <==> PORTp.b == 1 || VCC gdzie:
    n = {a,b,c,d,e,f,g,k} - kolejne segmenty wyświetlacza
    p = {A,B,C,D} - porty I/O mikrokontrolera
    b = {0,1,2,3,4,5,6,7} - bity portu

  • dla wyświetlacza typu wspólna anoda (anoda podłączona do VCC, sterowanie katod)
    segmentn = 1 <==> PORTp.b == 0 || GND gdzie:
    n = {a,b,c,d,e,f,g,k} - kolejne segmenty wyświetlacza
    p = {A,B,C,D} - porty I/O mikrokontrolera
    b = {0,1,2,3,4,5,6,7} - bity portu

    Ustawienie dowolnego segmentu w stan 1 oznacza polecenie odmalowania go wybranym przez użytkownika kolorem przy najbliższym odświeżeniu zawartości okien środowiska.

    Instalacja

    Ponieważ kod rozrzerzenia zawarty w bibliotece AvrPluginSevenSegmentSimple.dll implementuje wymagany dla wszystkich pluginów interfejs COM o nazwie IGuiPlugin, wymagana jest rejestracja tej biblioteki w systemie Windows.
    Plik dll z archiwum 7seg_AvrPluginSevenSegmentSimple.zip należy rozpakować do wybranej lokalizacji na dysku (np."\Program Files\Atmel\AVR Tools\7SegDisplay")



    a nastepnie dokonać rejestracji biblioteki przy pomocy systemowego narzędzia regsvr32.exe



    Po wykonaniu tej czynności środowisko AVR Studio dołączy bibliotekę do listy innych dostępnych pluginów, możemy to zobaczyć uruchamiając aplikację Plug-in Manager (menu Start / Atmel AVR Tools / Plug-in Manager):



    W tym momencie rozszerzenie Seven Segment Simple Display jest gotowe do pracy.

    Pierwsze uruchomienie

    Po uruchomieniu AVR Studio wyświetlacz jest widoczny na zakładce 7-seg obok standardowych zakładek Info, I/O View, a fakt poprawnego załadowania plugina jest potwierdzany odpowiednim wpisem w zakładce Message.



    Plugin instaluje na pasku narzędzi swoją własną ikonkę, skojarzoną z poleceniem pokazania/ukrycia okna wyświetlacza. Dodatkowo w menu Tools pojawia się nowe sub-menu Pojedynczy 7-seg zawierające dwa polecenia: Pokaż/ukryj oraz Ustawienia.



    Polecenie Ustawienia jest dostępne tylko gdy do AVR Studio jest załadowany jakikolwiek projekt, próba wywołania okna konfiguracji wyświetlacza bez załadowania projektu zakończy się komunikatem:



    Gdy załadujemy projekt z dysku (lub założymy nowy) plugin automatycznie dokona próby wyszukania swojego pliku konfiguracyjnego o stałej nazwie 7SegSimple.ini. Plik konfiguracyjny jest poszukiwany w folderze na który wskazuje zawartośc tagu SaveFolder pliku *.aps projektu. W przypadku, gdy plik konfiguracyjny nie zostanie znaleziony, przyjmowana jest domyślna konfiguracja wyświetlacza (zielony, wspólna katoda, bity 0..7 portu PORTB).



    Przyjęte domyślnie ustawienia można zmieniać przy pomocy okna dialogowego wywoływanego poleceniem Ustawienia z menu Tools / Pojedynczy 7-seg.



    Do każdego segmentu wyświetlacza (a...k) możemy przypisać jeden z sygnałów: bit portu PORTA...PORTD, masę lub napięcie zasilania. W przypadku wybrania portu I/O dodatkowo decydujemy który bit tego portu będzie sterował segmentem. Możemy zmienić także typ wyświetlacza oraz jego kolor.
    Naciśnięcie przycisku OK zamyka okno dialogowe modyfikując konfigurację plugina. W przypadku zaznaczenia opcji zapisz na dysku nowa konfiguracja zostanie zapisana w pliku i będzie dostępna przy każdym następnym załadowaniu projektu.
    Przycisk ustaw domyślne resetuje konfigurację plugina do wartości domyślnych zawartych w kodzie.

    Symulacja

    Po załadowaniu (lub utworzeniu) projektu i napisaniu programu możemy zobaczyć jak w praktyce działa wyświetlacz. Kompilujemy i uruchamiamy symulację projektu poleceniem Tools / Start debugging. Gdy symulator ustawi się na pierwszym rozkazie naszego programu, wykonujemy kolejne instrukcje wydając polecenia Step over lub Step into. Jeżeli jakakolwiek instrukcja zmodyfikuje zawartość portu, do którego przypiety jest wyświetlacz, będzie to widać w oknie z rysunkiem segmentów natychmiast po wykonaniu tej instrukcji.



    Oczywiście nic nie stoi na przeszkodzie, aby zmienić konfigurację wyświetlacza w trakcie wykonywania programu, poniżej przykładowa zmiana koloru, ale bez zapisu ustawień na dysk:



    Przykładowe programy

    Pierwszy programik to proste migadełko wykorzystujące jeden segment wyświetlacza - kropkę. Wyświetlacz należy ustawić jako: wspólna anoda, segmenty a...g zapinamy do VCC aby ich świecenie nam nie przeszkadzało, segment k podłączamy do bitu 0 portu A (PORTA.0). Kolor może być dowolny...
    Ponieważ anoda diody świecącej jest podłączona do VCC, aby dioda świeciła na katodę należy podać niski stan logiczny - to chyba oczywiste.
    Oto kod programu simple1.asm:

            .include "tn2313def.inc"
            ;
            .cseg
            .org 0x0000
            ;
            ; konfiguracja portu A, bit 0 jako OUT
            ldi R16, 0x01
            out DDRA, R16
    loop:
            ; ustaw L na bicie PORTA.0
            ; kropka się zaświeci
            cbi PORTA, 0
            ; ustaw H na bicie PORTA.0
            ; kropka zgasnie
            sbi PORTA, 0
            ; i tak w kółko
            rjmp loop
            ;

    A to odpowiednia do zabawy konfiguracja, czyli zawartość pliku 7SegSimple.ini:

    [display type]
    common=anode
    color=blue
    [segments assignment]
    SEG_A=VCC
    SEG_B=VCC
    SEG_C=VCC
    SEG_D=VCC
    SEG_E=VCC
    SEG_F=VCC
    SEG_G=VCC
    SEG_K=PORTA.0

    Spakowany plik simple1.asm oraz konfiguracja - 7seg_simple1.zip


    Drugi przykład, już nieco bardziej skomplikowany, to programik do odliczania 0...9. Wymagana konfiguracja to wspólna katoda (segmenty zaświecają się gdy na porcie jest H), wyświetlacz podłączony do portu B kontrolera (segmenty a...g), kropka (k) zwarta do masy.

    Kod programu simple2.asm:

            .include "tn2313def.inc"
            ; mapa przypisań bitów portu B na segmenty
            .equ SEG_A = 0x01
            .equ SEG_B = 0x02
            .equ SEG_C = 0x04
            .equ SEG_D = 0x08
            .equ SEG_E = 0x10
            .equ SEG_F = 0x20
            .equ SEG_G = 0x40

            ; definicje znaczków
            .equ DIGIT_0 = SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F
            .equ DIGIT_1 = SEG_B | SEG_C
            .equ DIGIT_2 = SEG_A | SEG_B | SEG_G | SEG_E | SEG_D
            .equ DIGIT_3 = SEG_A | SEG_B | SEG_C | SEG_D | SEG_G
            .equ DIGIT_4 = SEG_F | SEG_G | SEG_B | SEG_C
            .equ DIGIT_5 = SEG_A | SEG_F | SEG_G | SEG_C | SEG_D
            .equ DIGIT_6 = SEG_A | SEG_F | SEG_G | SEG_E | SEG_C | SEG_D
            .equ DIGIT_7 = SEG_A | SEG_B | SEG_C
            .equ DIGIT_8 = SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G
            .equ DIGIT_9 = SEG_A | SEG_B | SEG_G | SEG_F | SEG_C | SEG_D

            .equ HOW_MANY_DIGITS = 10
            .cseg
            .org 0x0000

            ; bity 0..6 portu B jako OUT
            ldi R16, 0x7F
            out DDRB, R16

    start_again:
            ; inicjuje licznik cyfr
            ldi R17, HOW_MANY_DIGITS
            ; inicjuje wskaźnik na tabelkę ze znakami
            ldi ZL, low(cyfry << 1)
            ldi ZH, high(cyfry << 1)
    do_count:
            ; pobierz znak R0 wskazywany przez rejestr Z
            lpm
            ; wystaw na port B
            out PORTB, R0
            ; zmniejsz licznik cyfr
            dec R17
            ; gdy już zero to zacznij od początku
            breq start_again
            ; wskaż na następny znaczek
            adiw ZH:ZL, 1
            ; i tak dalej...
            rjmp do_count

    cyfry:
            .db DIGIT_0,DIGIT_1,DIGIT_2,DIGIT_3,DIGIT_4,DIGIT_5,DIGIT_6,DIGIT_7,DIGIT_8,DIGIT_9

    Konfiguracja w pliku 7SegSimple.ini:

    [display type]
    common=cathode
    color=green
    [segments assignment]
    SEG_A=PORTB.0
    SEG_B=PORTB.1
    SEG_C=PORTB.2
    SEG_D=PORTB.3
    SEG_E=PORTB.4
    SEG_F=PORTB.5
    SEG_G=PORTB.6
    SEG_K=GND

    Spakowany plik simple2.asm oraz konfiguracja - 7seg_simple2.zip


    Uwagi końcowe

    Plugin Seven Segment Simple Display posiada kilka niejako 'wbudowanych' niedoskonałości.
    Pierwsza, wynikająca ze sposobu implementacji jego funkcji, to obsługa tylko czterech portów kontrolera AVR. Druga, to możliwość ustawienia dowolnej (w szczególnym przypadku bezsensownej) konfiguracji, której wykorzystanie nie przyniesie oczekiwanych efektów wizualnych. Przykładem jest podłaczenie segmentów wyświetlacza do wszystkich bitów portu A kontrolera tiny2313, choć jako fizyczne wyprowadzenia dostępne są tylko bity 0..2. Trzecia sprawa to sposób zapamiętywania konfiguracji - łatwo zgadnąć, że dla jednego projektu możemy mieć tylko jeden plik 7SegSimple.ini. Chcąc mieć więcej niż jedną konfigurację, musimy podmieniać pliki ręcznie.

    Podczas zabawy z wyświetlaczem, należy pamiętać że AVR Studio odświeża zawartość wyświetlacza po każdym pojedynczym kroku symulacji. Jeżeli chcemy uruchomić nasz program w trybie animacji (AutoStep) należy się liczyć z ryzykiem migotania ekranu wynikającym z szybkiego odmalowywania okien. Pewnym rozwiązaniem jest tu dodanie do testowego kodu procedur opóźniających i odznaczenie opcji Step over when Autostepping w oknie ustawień środowiska dostępnym via Tools / Options w sekcji General. Taki manewr spowoduje, że w trybie animacji symulator będzie wchodził w głąb procedurek opóźniających co spowolni odświeżanie okna wyświetlacza. Powyższe nie jest koniecznością, ale jednak warto mieć w pamięci...

    Informacja

    Plik AvrPluginSevenSegmentSimple.dll jest dynamicznie ładowaną biblioteką platformy Win32, wykorzystującą do pracy biblioteki "Microsoft Foundation Classes" (MFC42.dll) oraz "C Runtime Library" (MSVCRT.DLL).

    Biblioteka, jako zawierająca obiekt COM, wymaga rejestracji. W rejestrze systemowym można odszukać ją poprzez identyfikator SevenSegmentSimple

    Plugin został napisany w środowisku "Microsoft Visual C++ v.6.0" z wykorzystaniem pakietu "AVR Studio© Software Development Kit" udostępnianego nieodpłatnie przez firmę Atmel.

    Plugin został przetestowany w środowisku AVR Studio 4.12 (Service Pack 3) pracującym w Windows XP.

    Dołożyłam wszelkich starań, aby plugin nie powodował żadnych anomalii w pracy AVR Studio, utraty jego stabilności, a w szczególności nie powodował ryzyka uszkodzenia aktualnie załadowanego kodu źródłowego.

    Nie zmienia to faktu że:

  • pobierasz i instalujesz plugin AvrPluginSevenSegmentSimple.dll na własną odpowiedzialność
  • nie odpowiadam za jakiekolwiek szkody wynikłe z pracy w AVR Studio z zainstalowanym i aktywnym pluginem
  • po pobraniu, zawartość archiwum 7seg_AvrPluginSevenSegmentSimple.zip należy sprawdzić skanerem antywirusowym
  • biblioteka AvrPluginSevenSegmentSimple.dll w żaden sposób nie narusza prywatności użytkownika, w szczególności nie zbiera informacji o użytkowniku lub systemie oraz nie kontaktuje się z Internetem
  • kod źródłowy pluginu 'Seven Segment Simple Display' nie jest i nie będzie publicznie dostępny

    Warszawa, wrzesień 2006