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

Atmega8 Bascom Przerwania dziwne zachowanie na portach

Artee 20 Sie 2010 22:49 2738 20
  • #1 8420781
    Artee
    Użytkownik obserwowany
    Mam sobie programik w ktorym co 400us wywolywane jest przerwanie. Obsluga przewania jest króciutka. W ukłądzie dołączony jest też LCD i 4 diody do portu. Co może być przyczyną że na portach LCD i diod pojawiają się dziwne stany w różnych momentach obsługi przerwania? Do tej pory nie używałem tego kontrolera i nie wiem o co może tu chodzić. Całkowicie przez to głupieje LCD. Diody tez w dziwnych momentach się zapalają. Co jest zmieniane w czasie przerwania mające wpływ na porty? Według mnie nic nie powinno się zmieniać na portach a jednak cos się dzieje.
  • #2 8421010
    mirekk36
    Poziom 42  
    Pewnie, że się dzieje i to dużo! ... w twoim programie. Ale oczywiście po co pisać w jakim języku pisze się program? po co pokazać chociaż kawałek kodu, który sprawia problemy? ... po co? Na elektrodzie są wróżki co przepowiedzią co może być nie tak.
  • #3 8421548
    Artee
    Użytkownik obserwowany
    Od poczatku napisane jest wyraźnie w jakim języku jest program.
    A procedura obsługi przerwania to odczytanie bitu z portu:

    if pind.3=1 then set data

    I co takiego może sie dziać w czasie obsługi tego przerwania??

    Pytanie jest raczej ogólne dotyczące przerwań. Nie rozumiem jaki wpływ na stan portów może mieć obsługa przerwania z tych portów niekorzystająca. Może namieszać w rejestrach ale na portach?
  • #4 8421621
    mirekk36
    Poziom 42  
    "Lubię" takie pytania ogólne. Jak zwykle doszukuje się ktoś problemu nie tam gdzie trzeba i dziwi się, że coś nie działa. Stąd te pomysły o zmianie stanów na portach spowodowanych przez przerwanie.

    Samo przerwanie nie nie może "namieszać" i nigdy nie miesza. Zawsze powodem zamieszania jest programista i jego program czy też sam układ, który bywa totalnie źle zaprojektowany. Ok było napisane że bascom, sorki .... teraz podałeś kod przerwania. Jednak to co się u ciebie "miesza" nie ma nic wspólnego z przerwaniem.
  • #5 8421659
    Artee
    Użytkownik obserwowany
    Wlasnie o to chodzi że ma coś wspolnego z przerwaniem.
    Te zmiany na portach wyswietlacza LCD (zmienialem porty i zawsze bylo to samo)
    dzieja się w momencie obsługi przerwania. Jesli przerwania nie ma na portach jest cisza. Obserwowalem to przez godzine na analizatorze i tak jest. Jak wyłącze przerwania to nic na porcie LCD tez nie ma i reszta chodzi dobrze.
    Jak do polecenia on_interrupt dalem opcje nosave to co innego szlo na wyswietlacz. Ale cały czas te śmieci idą tylko w momencie jak są aktywne przerwania.
  • #6 8421694
    l3sz3k
    Poziom 18  
    Kolego Artee wklej cały kod i schemat, bo bez tego to jak wróżenie z fusów.
  • #7 8421708
    Artee
    Użytkownik obserwowany
    No właśnie w tym problem, że kodu nie mogę wkleić bo zawiera on cały algorytm pewnej transmisji chronionej prawami jak to sie mówi korporacyjnymi. Teraz pisze reszte programu a do problemów z LCD wróce poźniej. Może przerobie i okroje kod tak żeby zjawisko pozostało a nie było tych algorytmów to wtedy zapodam.
    Co do schematu to jest tylko Atmega8 na płytce testowej gdzie do jednego portu jest LCD do drugiego 3 diody LED i trzy piny jako wejście więc od strony elektrycznej praktycznie tam nic nie ma.
  • #8 8421777
    piotr5000
    Poziom 21  
    Cytat :
    "co 400us wywolywane jest przerwanie"
    i
    "portach LCD i diod"
    " w różnych momentach obsługi przerwania"

    Mam gratulować bystrośći wzroku czy czymś to mierzyłeś.
    Co w/g Ciebie powinien zrobić program, a co robi
    Może to co obserwujesz nie ma nic wspólnego z przerwaniami , a przyczyna jest w innym fragmencie programu ?
  • #9 8421863
    mirekk36
    Poziom 42  
    piotr5000 napisał:
    Cytat :
    "portach LCD i diod"


    tak tylko z ciekawości o co chodzi koledze z tym podkreśleniem i wytłuszczeniem "diod" ??? Bo jeśli chodzi o pisownię to jest w jak najlepszym porządku. Chyba kolega nie ma na myśli, że powinno być "diód" - bo to masakra

    piotr5000 napisał:
    Mam gratulować bystrośći wzroku czy czymś to mierzyłeś.
    Co w/g Ciebie powinien zrobić program, a co robi
    Może to co obserwujesz nie ma nic wspólnego z przerwaniami , a przyczyna jest w innym fragmencie programu ?


    Co do reszty to całkowita racja.

    Tak jak pisałem wcześniej, nie ma to nic wspólnego z przerwaniem tylko ze wszystkim innym w tym super tajnym przez poufne mega korporacyjnym kodem napisanym w Bascomie - nie żeby umniejszać Bascomowi , no ale takie teksty:

    Artee napisał:
    Wlasnie o to chodzi że ma coś wspolnego z przerwaniem.


    To ty tutaj wpadłeś żeby wszystkim wciskać takie herezje, że ma ???? czy ty się pytasz????

    Artee napisał:
    Jak do polecenia on_interrupt dalem opcje nosave to co innego szlo na wyswietlacz.


    Może by kolega najpierw dokładnie doczytał do czego służy opcja NOSAVE w Bascomie bo wygadywanie takich fantasmagorii jasno pokazuje, że w tym twoim całym mega algorytmie jest pełno baboli czysto programistycznych, wynikających z braku choćby podstawowej wiedzy o samym Bascomie niestety :(

    Poza tym, jeśli teoretycznie korzystasz z przerwania co 400uS (o ile w ogóle jesteś pewien że taki interwał ustawiłeś - bo ja w zaczynam wątpić) to jeśli do tego używasz wyświetlacza LCD z pinem R/W podłączonym do GND i zwykłych bibliotek Bascoma do jego obsługi - to , to, że na wyświetlaczu w pewnych sytuacjach mogą pojawiać się krzaki wcale nie jest dziwnym objawem.

    Zainteresuj się podłączeniem wyświetlacza ze sprawdzaniem flagi BUSY czyli pin R/W podłączony do procka i wykorzystaj odpowiednie biblioteki "lcd4_busy" Bascomowe do jego sterowania.

    Biorąc to wszystko pod uwagę to jeśli nie potrafisz tak zmienić kodu żeby go ukryć przed nami a pokazać problem jaki występuje na innym nieco zmienionym kodzie do lepiej udaj się do wróżbity panie kolego. ALbo jeszcze lepiej - zleć komuś napisanie tego korporacyjnego kodu. Będzie lepiej, szybciej i taniej.

    No chyba, że w końcu wkleisz jakiś kod zamiast opowiadać bajki o wpływie przerwań na porty i analizowaniu analizatorem.
  • #10 8421902
    piotr5000
    Poziom 21  
    Dlatego , że sam nie jestem w stanie zauważyć mignięcia "DIOD" trwającego np. 100 us dlatego to podkreśliłem . Wyświetlacze LCD są chyba nieco wolniejsze.
    PS. ortografii się nie czepiam , bo sam mam z nią dużo problemów
  • #12 8423128
    Dexter77
    Poziom 28  
    Ja bym stawiał na brak debounce. Skoro sprawdzany jest stan przycisku to pewnie on do czegoś służy. Może do wyświetlenia informacji na wyświetlaczu. Jeżeli brak debounce to przerwanie to wywoła się pewnie z kilkanaście razy. Może być tez tak ze przepełnia się stos, kilkanaście razy 32 bajty.... i koniec RAM, procek sie resetuje. Ale to tylko zgadywanie skoro kodu nie widać...
  • #13 8423363
    Artee
    Użytkownik obserwowany
    Okrojona czesc kodu ktora daje efekt o ktorym mowilem:
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    $hwstack = 32
    $swstack = 16
    $framesize 40
    $lib "LCD4.LBX"
    '$sim
    
    
    'Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.1 , Rs = Portc.0
    Config Lcd = 16 * 2
    
    Config Int0 = Falling
    
    Config Pind.3 = Input
    Config Pind.4 = Input
    Config Pinc.3 = Output
    Config Pinc.1 = Output
    Config Pinc.2 = Output
    Config Pinc.0 = Output
    
    
    On Int0 Odczyt_bitu
    Enable Interrupts
    Enable Int0
    
    Dim Nowybit As Bit
    Dim Preamb As Word
    Dim Receivedbit As Bit
    
    
    Cls
    
    Do
    Loop
    
    End
    
    Odczyt_bitu:
    Reset Portc.3
    Set Portc.3
    If Pind.4 = 0 Then
                Reset Typdanych
                Preamb = &B0101010101010101
                Return
    End If
    Receivedbit = Pind.3
    Set Nowybit
    Return
    


    Na wejscie int0 podawany jest sygnał 2400Hz który wyzwala przerwania
    Na wejście PD.4 podawany jest sygnał z urządzenia.
    Na porcie B na pinach podłączonych do LCD przez cały czas sa regularne ciągi impulsów, znikają przy braku sygnału na wejściu przerwań lub podaniu "1" na wejście PD.4.
    Z gory zaznaczam, że nie jestem programistą a to jest pierwszy program na AVR i wykorzystujący przerwania.
    Aha, jesli zlikwiduje polecenie Cls nic sie nie dzieje. Bałagan na porcie wyświetlacza pojawia się po pierwszej komendzie do niego wysłanej.
    Żeby nie było kolejnych komentarzy, że mierze "na oko" wszystkie obserwacje dokonywane są na odpowiednim sprzęcie w tym przypadku wielokanałowy analizator logiczny oraz oscyloskop cyfrowy z pamięcią przebiegów.
    Być może jest tu jakiś banalny błąd ale póki co go nie znalazłem bo już mi się w oczach troi od patrzenia :)
    Jeśli nie korzystam z LCD to całość programu działa dobrze ale musze przecie gdzieś wyświetlić to co wyliczam.

    p.s.
    rzadko tu zaglądam i pisząc że zaobserwowałem jakieś zjawisko nie sądziłem że jeszcze trzeba będzie tłumaczyć jak je zaobserwowałem. Mnie by nawet na myśl nie przyszło zeby pisać iż widzę na wyświetlaczu czy LED impulsy 400us czy krotsze.
  • #14 8423433
    zumek
    Poziom 39  
    Artee napisał:
    ...A procedura obsługi przerwania to odczytanie bitu z portu:
    
    if pind.3=1 then set data


    Artee napisał:
    Okrojona czesc kodu ktora daje efekt o ktorym mowilem:
    
    Odczyt_bitu:
    Reset Portc.3
    Set Portc.3
    If Pind.4 = 0 Then
                Reset Typdanych
                Preamb = &B0101010101010101
                Return
    End If
    Receivedbit = Pind.3
    Set Nowybit
    Return 


    No faktycznie, jedna instrukcja - sarkazm :(
    Kolego :!:
    Gdybyś od razu pokazał swoje przerwanie, to już dawno byś wiedział "co w trawie piszczy" :)
    Pozbądź się zbędnego Return i to wszystko :idea:
  • #15 8423503
    Artee
    Użytkownik obserwowany
    Jak pisalem pierwszego posta nie było tej instrukcji a LCD głupiał. Wrócę do tamtego kodu i jak go okroje wyślę
  • #16 8424111
    piotr5000
    Poziom 21  
    Db6 = Portc.3

    Artee czy w Twoim programie jest to komentarz:

    'Config Lcdpin ...... Db6 = Portc.3

    czy jest to właściwa konfiguracja LCD

    Config Lcdpin ...... Db6 = Portc.3

    ;Odczyt_bitu:
    Reset Portc.3 ' to zmienia Db6
    Set Portc.3 ' to też zmienia Db6
  • #17 8424247
    lukego
    Poziom 17  
    Zmienia ale nie ma opadającego zbocza na ENABLE, czyli nic się nie powinno stać, chyba, że w oryginale programu jest inaczej.
  • #18 8424432
    piotr5000
    Poziom 21  
    Nie wiemy co jest na ENABLE bo ten set portc.3 jest w przerwaniu co 400 us
  • #19 8424626
    zumek
    Poziom 39  
    piotr5000 napisał:
    Db6 = Portc.3

    Artee czy w Twoim programie jest to komentarz:

    'Config Lcdpin ...... Db6 = Portc.3


    Spójrzcie koledzy na ten fragment kudu
    $lib "LCD4.LBX"

    Domyśinie ta biblioteka operuje na PORTB, a autor nie wspomina ani słowem, że ją przekompilował na inny port.
    Należy przyjąć, że LCD podłączone jest tak:
    ;Rs = PortB.0
    ;RW = GND
    ; E = PortB.2
    ;E2 = PortB.3
    ;Db4 = PortB.4
    ;Db5 = PortB.5
    ;Db6 = PortB.6
    ;Db7 = PortB.7
    

    Poza tym jak już ktoś wspomniał, wartości "stosów" zdecydowanie za małe.
  • #20 8428011
    Artee
    Użytkownik obserwowany
    Wszystko juz chodzi. Przyczyną problemów były błędy jakie zawiera sam BASCOM, które zgłoszę do autora.
    Cały program robi sie po prostu za skomplikowany dla BASCOM i tylko w Assemblerze będzie pełna kontrolą nad tym co sie dzieje w programie i nie zostaje mi nic innego jak po wielu latach przerwy przypomnieć sobie ASM na AVR-y. Już kilka wstawek zrobilem i wszystko od razu chodzi lepiej.
    Pozdrawiam wszystkich.

    Temat do zamkniecia
  • #21 8428027
    mirekk36
    Poziom 42  
    Artee napisał:
    Wszystko juz chodzi. Przyczyną problemów były błędy jakie zawiera sam BASCOM, które zgłoszę do autora........Temat do zamkniecia


    No zaraz padnę na zawał. Najpierw, że kod super tajny, korporacyjny och i ach , że przerwania w AVRach mieszają na portach. A przecież przerwania to nie "wytwór" Bascoma

    Artee napisał:
    Wlasnie o to chodzi że ma coś wspolnego z przerwaniem.
    .


    Potem ujawnianie fragmentów maksymalnie nieudolnie pisanego programu, gdzie wielu ludzi zwraca uwagę na popełnione błędy (na co ty w ogóle praktycznie nie reagujesz) ..... a tu co ????

    Cytat:
    "Bascom zawiera błędy, które zgłoszę do autora"
    zgłoś, zgłoś - powodzenia

    Jak sobie przypomnisz asembler to z takim podejściem będziesz miał jeszcze 100 razy gorzej i pod górkę. Ciekawe tylko do kogo wtedy zgłosisz błędy w Asemblerze. No chyba tylko do ATMELA gdy odkryjesz błędy w procesorach.
REKLAMA