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

[BascomAVR] - przekazywanie danych do przerwań

ImPuLs 10 Sty 2010 22:39 1614 13
  • #1 7517294
    ImPuLs
    Poziom 23  
    Jeżeli byłby ktoś w stanie wyjaśnić mi dlaczego realizując wyświetlanie multipleksowane w poniższy sposób uzyskuję wyświetlanie czterech zer ?
    Wygląda mi to tak jakby zmienne Z1...Z4 nie były dostępne w momencie działania podprogramu przerwania. Jeżeli podprogram 'Wyswietlanie' umieszczę w pętli głównej to wszystko jest ok i wyświetla się ciąg '4795'.

    Co się dzieje ze zmiennymi Z1...Z4 podczas startu podprogramu obsługi przerwania i dlaczego ?

    
    $regfile = "m16def.dat"
    $crystal = 2000000
    
    Dim C1 As Byte , C2 As Byte , C3 As Byte , C4 As Byte
    Dim Z1 As Byte , Z2 As Byte , Z3 As Byte , Z4 As Byte
    
    Config Porta = Output
    Porta = 0
    
    Config Portb = Output
    Portb = 0
    
    Cyfra1 Alias Portb.1
    Cyfra2 Alias Portb.2
    Cyfra3 Alias Portb.3
    Cyfra4 Alias Portb.4
    
    
    '---[ Ustawienie przerwań ]-----------------------------------------------------
    
    Config Timer0 = Timer , Prescale = 32
    Enable Timer0
    On Timer0 Wyswietlanie
    Enable Interrupts
    
    
    '---[ pętla główna programu ]---------------------------------------------------
    
    Do
    
       Z1 = 4
       Z2 = 7
       Z3 = 9
       Z4 = 5
    
    Loop
    
    '-------------------------------------------------------------------------------
    End
    
    
    '---[ Obsługa przerwania - WYŚWIETLANIE ]-----------------------------------
    Wyswietlanie:
       Reset Cyfra1
       Reset Cyfra2
       Reset Cyfra3
       Reset Cyfra4
    
       C1 = Lookup(z1 , Znaki)
       Porta = C1
       Set Cyfra1
       Waitms 4
       Reset Cyfra1
    
       C2 = Lookup(z2 , Znaki)
       Porta = C2
       Set Cyfra2
       Waitms 4
       Reset Cyfra2
    
       C3 = Lookup(z3 , Znaki)
       Porta = C3
       Set Cyfra3
       Waitms 4
       Reset Cyfra3
    
       C4 = Lookup(z4 , Znaki)
       Porta = C4
       Set Cyfra4
       Waitms 4
       Reset Cyfra4
    
    Return
    '-------------------------------------------------------------------------------
    
    
    '---[ Definicja znaków ]------------------------------------------------------
    Znaki:
       Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144
    
  • Pomocny post
    #2 7517611
    alien_audio
    Poziom 21  
    Witam.
    Problem raczej jest w obsłudze przerwania. Są za szybkie. Przerwania nakładają sie
    na siebie czyli zanim zakończy sie obsługa, timer wywołuje ponownie.
    Najlepiej w podprogramie obsługi przerwania na początku zatrzymaj przerwania a na końcu podprogramu wznów przerwania.
    Krzysztof
  • Pomocny post
    #4 7517792
    mirekk36
    Poziom 42  
    Twoje przerwanie odbywa się co około 4ms..... a ty w tym przerwaniu ładujesz WAITMS 4 i to aż cztery razy !!!! co daje ci łącznie 16ms. Tak więc zaczyna się przerwanie - trwa jak kolega wyżej napisał KOSMICZNIE DŁUGO, ale ok potem się kończy, i niestety od razu procek wykonuje następne przerwanie i tak wokółko ;) ..... widzisz co się dzieje???? procek nie ma czasu wykonywać w ogóle programu z pętli głównej żeby podziałać sobie na zmiennych trzymających cyfry

    Wywal te wszystkie WAITMS z przerwania i w ogóle raz na całe życie zapamiętaj sobie żeby NIGY - PRZENIGDY tego typu poleceń do jakichkolwiek przerwań nie wkładać ;) to po pierwsze

    a po drugie to po kiszkę robisz Reset CyfraX ??? (nie mówię o tych pierwszych 4 rozkazach gdzie gasisz na chwilę wszystkie cyfry)

    coś źle zrozumiałeś jeszcze multipleksowanie - w jednym przerwaniu masz zapalać kolejną cyfrę - a nie tak jak masz teraz że próbujesz w jednym przerwaniu po kolei zapalić i zgasić każdą cyfrę .... to jest pomyłka genetyczna ale rozumiem że stąd wzięły ci się te kocie waitemsy .

    Jedno przerwanie to ma być zapalenie jednej cyfry, kolejne przerwanie zapalenie kolejnej i tak cały czas cyklicznie - na tym polega multipleksowanie
  • #5 7517920
    ImPuLs
    Poziom 23  
    Czyli jednym słowem przedobrzyłem w kombinowaniu.

    Zazwyczaj robię multipleksowanie na podstawie znalezionego gdzieś wzorca (z instrukcjami SELECT CASE) i działa to OK. Tam jest właśnie wyświetlanie jednej cyfry w jednym przerwaniu.
    Wpadłem jednak na MAŁO genialny pomysł że można wyświetlenie wszystkich cyfr wwalić w jeden obieg przerwania. I może byłoby wszystko OK gdybym sobie obliczył te czasy i stwierdził to co Wy - mój błąd :-(

    Tak się właśnie dzieje jak ktoś chce ulepszyć coś co jest dobre ;-/

    Dziękuję wszystkim za odpowiedzi.
  • #6 7518033
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #7 7518279
    Konto nie istnieje
    Poziom 1  
  • #8 7518913
    ImPuLs
    Poziom 23  
    -> atom1477
    No właśnie zauważyłem że z tym kompilatorem coś jest nie tak odnośnie preskalera. Jak dałem 64 to wywaliło błąd tak jak opisałeś. Przy wartości 32 błędu nie pokazuje ale jaką wartość przyjmuje faktycznie to tego nie wiem. Być może faktycznie nie jest to wartość 32 tylko 1.

    Mam wersję 1.11.8.1 - może tylko z tą wersją jest coś nie tak.
    Jak ktoś ma inne wersje to niech ew. sprawdzi i napisze w której jest ten problem rozwiązany.
  • #9 7519018
    mirekk36
    Poziom 42  
    ImPuLs napisał:

    Mam wersję 1.11.8.1 - może tylko z tą wersją jest coś nie tak.
    Jak ktoś ma inne wersje to niech ew. sprawdzi i napisze w której jest ten problem rozwiązany.


    a czy tak ciężko pobrać z netu od producenta - najnowszą wersję DEMO??? przecież twoja wersja to można powiedzieć, że jest już archaiczna i pochodzi z jakichś wykopalisk ;)
  • #10 7519024
    janbernat
    Poziom 38  
    1.11.9.5- działało dobrze.
    Wczoraj zainstalowałem 1.11.9.8- też działa dobrze.
  • #11 7525879
    ImPuLs
    Poziom 23  
    Nie chodzi o niechęć ściągnięcia - po prostu tą wersję mam 'kupną' i dotychczas nie miałem do niej zastrzeżeń.

    ==

    Sprawdziłem wyniki kompilacji dla v.1.11.8.1 - przy ustawieniu takim jak na moim lisingu ( prescaler=32 ) rejestr TCCR0 ustawiany jest na wartość 03h czyli fizycznie na CLK/64, czyli powinno być prawidłowo pomimo błędu w kompilatorze.
  • #12 7525946
    janbernat
    Poziom 38  
    Jak masz kupną- to masz prawo do ściągania nowej pełnej wersji.
  • #13 7525959
    mirekk36
    Poziom 42  
    ImPuLs napisał:
    Nie chodzi o niechęć ściągnięcia - po prostu tą wersję mam 'kupną' i dotychczas nie miałem do niej zastrzeżeń.


    Łooo matko! no to skoro masz kupną - to ty jeszcze nie pobrałeś sobie uaktualnienia do najnowszej??? tak nie lubisz nowinek i jednocześnie lubisz się katować wyszukiwaniem błędów Bascoma że tak zapytam? ;)

    przecież jak masz kupną - to możesz spokojnie sobie zassać nowszą licencję za free - w czym problem - ja tak zawsze robiłem gdy korzystałem z Bascoma. Zresztą teraz choć nie korzystam to i tak zawsze zassię nowszą żeby chociaż zobaczyć w co nowego go wyposażyli. I ostatnio ze zdziwieniem tzn miłym zaskoczeniem zobaczyłem że np dodali obsługę programatora USBASP ;)
  • #14 7526607
    ImPuLs
    Poziom 23  
    Hmm, pojechaliście mi trochę po ambicji i sobie zaktualizowałem ;-))

    Powoli przesiadam się od jakiegoś czasu na asemblera więc zbytnio nie zależało mi na aktualizacji.
REKLAMA