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: Obsługa matrycy LED 126x15 - dziwne zachowanie programu

KJ 27 Mar 2005 00:33 3086 24
REKLAMA
  • #1 1352144
    KJ
    Poziom 31  
    Posty: 2370
    Pomógł: 68
    Ocena: 945
    Pisze właśnie program obsługujący matrycę LED 126 na 15 mam sobie prototypowy programik który wygląda tak :

    Config Timer0 = Timer , Prescale = 8
    On Timer0 Tim0
    Load Timer0 , 200
    Enable Timer0
    Enable interrupts

    Do
    For Da = 0 To 240
    Dat(da) = 128
    Next Da
    Loop
    End

    Tim0:
    Nr2 = Nr2 + 1
    Nr3 = Nr2 + 15
    Nr4 = Nr3 + 15
    Nr5 = Nr4 + 15
    Nr6 = Nr5 + 15
    Nr7 = Nr6 + 15
    Nr8 = Nr7 + 15
    Nr9 = Nr8 + 15
    Nr10 = Nr9 + 15
    Nr11 = Nr10 + 15
    Nr12 = Nr11 + 15
    Nr13 = Nr12 + 15
    Nr14 = Nr13 + 15
    Nr15 = Nr14 + 15
    Nr16 = Nr15 + 15
    Nr17 = Nr16 + 15
    Set Portd.6
    Portb = 0
    Porta = Dat(nr2)
    Portc = Nr
    Portb = 1
    Porta = Dat(nr3)
    Portc = Nr
    Portb = 2
    Porta = Dat(nr4)
    Portc = Nr
    Portb = 3
    Porta = Dat(nr5)
    Portc = Nr
    Portb = 4
    Porta = Dat(nr6)
    Portc = Nr
    Portb = 5
    Porta = Dat(nr7)
    Portc = Nr
    Portb = 6
    Porta = Dat(nr8)
    Portc = Nr
    Portb = 7
    Porta = Dat(nr9)
    Portc = Nr
    Portb = 8
    Porta = Dat(nr10)
    Portc = Nr
    Portb = 9
    Porta = Dat(nr11)
    Portc = Nr
    Portb = 10
    Porta = Dat(nr12)
    Portc = Nr
    Portb = 11
    Porta = Dat(nr13)
    Portc = Nr
    Portb = 12
    Porta = Dat(nr14)
    Portc = Nr
    Portb = 13
    Porta = Dat(nr15)
    Portc = Nr
    Portb = 14
    Porta = Dat(nr16)
    Portc = Nr
    Portb = 15
    Porta = Dat(nr17)
    Portc = Nr
    Reset Portd.6
    Nr = Nr - 1
    If Nr = 255 Then
    Nr = 14
    End If
    If Nr2 = 15 Then
    Nr2 = 0
    End If
    Return

    W timerze 0 chodzi odświeżanie wyświetlacza cała jego zawartość mieści się w tablicy w pamięci ram (zmienna Dat) Program ten nie ma wyświetlać niczego konkretnego tylko pionowe linie to co jest w pętli głównej wpisuje do tablicy ram na wszystkie jej pozycje taką samą daną i tu właśnie dzieją się cuda kiedy w linijce : Dat(da) = 128 jest 128 lub więcej wszystko chodzi na matrycy pojawiają się linie odpowiednio do wpisanej danej kiedy zmienię na 127 lub mniej przerwanie od timera nie jest przyjmowane 8O tak jakby zostało wyłączone gdyby nie to że na czas pisania programu zaniżyłem napięcie zasilania ledów pewnie bym cos usmażył bo matryca wywala jedną poziomą linię (ciągle świecącą) Procesor to Atmega32 wszystkie zmienne poprawnie zadeklarowane bascom w wersji 1.11.7.3 co ciekawe program zarówno w symulacji jak i w rzeczywistym procku zachowuje się jednakowo to jest przy wpisywaniu do tablicy wartości mniejszej od 128 blokuje się przerwanie od timera ... Ja się pytam co ma ze sobą wspólnego wartość wpisywana w tabele w ramie z układem przerwań :evil: Architektura tablicy jest mniej więcej taka: do portuC dołączony 74HC154 do niego 15 tranzystorów mocy sterujących linie do portu B drugi 74HC154 do niego clocki 16 zatrzasków 74HC574 do portu A równolegle połączone linie danych zatrzasków sterowanie w takim układzie jest dość proste i spisuje się świetnie jest na tyle szybkie że da rade wyświetlać płynną grafikę ale nie mogę napisać przyzwoitego softu bo dzieją się wspomniane dziwne zjawiska ... współczynnik magii siedzi w tej wersji bascoma czy ja czegoś nie kumam ??
  • REKLAMA
  • #2 1352164
    wicy
    Poziom 22  
    Posty: 670
    Pomógł: 30
    Ocena: 111
    nie testowałem tego programu, ale korciłoby mnie żeby wypróbować coś takiego - wyrzucić FOR..NEXT przed DO..LOOP


    For Da = 0 To 240
    Dat(da) = 128
    Next Da

    Do

    Loop
    End
  • #3 1352174
    KJ
    Poziom 31  
    Posty: 2370
    Pomógł: 68
    Ocena: 945
    Przy takim układzie zachodzi dokładnie to samo zjawisko ...
  • REKLAMA
  • #4 1352199
    wicy
    Poziom 22  
    Posty: 670
    Pomógł: 30
    Ocena: 111
    A co to za zmienna Nr? Jaką ma wartość początkową i czy ustawioną?
    Sprawdziłbym jeszcze w symulatorze, czy program "wyrabia" z tymi wszystkimi instrukcjami w obsłudze przerwania i czy nie jest w tym czasie generowane kolejne.
  • #5 1352201
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    Hmmm...
    A gdzie jest
    Load Timer0, 200
    które powinno być na początku obsługi przerwania (po etykiecie Tim0) ?
    Generalnie to podczas 1 przerwania powinno obsługiwać 1 linię, a index linii niech bedzie inkrementowalną lub dekrementowalną zmienną... Jaki jest _XTAL ? Obsługa przerwania jest nieciekawa, zmieniasz kwarc i wszystko się rozjeżdża, funkcja Load Timer powinna ładować stałą zależną od _XTAL. Moze jednak jakiś schemat połączeń ? Napewno jest to matryca 126 x 15 LED ?
    Pozdr. Light-I
  • #6 1352220
    KJ
    Poziom 31  
    Posty: 2370
    Pomógł: 68
    Ocena: 945
    Nie rozumiem o co chodzi z tą stałą zależną od Xtal kwarc jest 14,7456MHz czemu taki ?? Bo to wielokrotność 11,592MHz co pozwala na wyciśniecie z procka 115200 baud przy zerowym błędzie transmisji i nieco większej wydajności. (Całość ma się komunikować z PC po RS232) Skąd wątpliwości co do organizacji tablicy ?? Poglądowe schematy są tutaj: https://www.elektroda.pl/rtvforum/topic255848.html (mam nadzieję że link będzie działał) Tam jest tylko kawałek wyświetlacza i parę dodatkowych elementów na schemacie sterownika ale nie ma to w tym przypadku znaczenia. Jak pisałem programik jest prototypowy będę kombinował nad skróceniem obsługi przerwania.
  • #7 1352239
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    74HC(T)574 to moje ulubione latche... ;) Za Chiny Ludowe nie jest jestem w stanie dojrzeć sensownego przeznaczenia niektórych zmiennych, ich nazwy z niczym się nie kojarzą, a można by było zamiast lakonicznego "NrX" dać nazwę zgodną z funkcją, jaką ona pełni. Brakuje również komentarzy w kodzie, przez co trudno jest się połapać. Po co notorycznie do PORTC jest wpisywana ta sama wartość ("Nr") ? Nie wystarczyłoby raz ? Po co ta cała rodzina "nrX" ? Można przecież w pętelce... Ech procedurka w asemblerze zajełaby 1/4 tych linii...
    Pozdrawiam, Light-I
  • #8 1352649
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Witam.
    Pozwolę sobie zaproponować coś takiego:
    
    $regfile = "m32def.dat"
    Config Timer0 = Timer , Prescale = 8
    On Timer0 Tim0
    Load Timer0 , 200
    Enable Timer0
    
    Dim Nr As Byte , Dat(240) As Byte , Da As Byte , Nrx(17) As Byte 
    'Przy tak j/w zadeklarowanych zmiennych i tablicach , po instrukcji
    'Dat(0)=100 liczba 100 zamiast znaleźć się w 1-szym elemencie tablicy Dat , znajdzie się w zmiennej Nr.
    
    For Da = 1 To 240 'tu miałeś byka - tablice adresujemy od 1
    Dat(da) = 128
    Next Da
    Enable Interrupts
    
    Do
    Loop
    End
    
    Tim0:
    Load Timer0 , 200
    Incr Nrx(2)
    For Da = 2 To 17
       Nrx(da + 1) = Nrx(da) + 15
    Next Da
    
    
    Set Portd.6
    
    For Da = 0 To 15
       Portb = Da
       Porta = Dat(nrx(da + 2))
       Portc = Nr
    Next Da
    
    Reset Portd.6
    Nr = Nr - 1
    If Nr = 255 Then
    Nr = 14
    End If
    If Nrx(2) = 15 Then
    Nrx(2) = 0
    End If
    Return
    


    Piotrek

    PS
    Proce ledwo się wyrabia w przerwaniu.
  • #9 1352718
    KJ
    Poziom 31  
    Posty: 2370
    Pomógł: 68
    Ocena: 945
    Byka w końcu sam znalazłem o 3ciej nad ranem :D powodem dziwnego zachowania było adresowanie tablicy od zera :D Stuningowaną procedurę przerwania testowałem i niezabardzo chodzi :/ Wymyślę coś sam. Co do ponawiania Portc = Nr w przerwaniu to teoretycznie wystarczy raz ale często teoria nie idzie w parze z praktyką i jak jest raz to powstają niewielkie błędy w wyświetlaniu stwierdziłem że skoro z ponawianiem działa poprawnie to niech sobie ponawia :D nie jest to może rozwiązanie super eleganckie ale ma tę zaletę że zdaje egzamin.
  • REKLAMA
  • #10 1352759
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    KJ napisał:

    ...
    Stuningowaną procedurę przerwania testowałem i niezabardzo chodzi :/ Wymyślę coś sam.


    To nie jest nic gotowego , tylko ślad , który ma Cie naprowadzić :)

    Zyczę powodzenia.
    Piotrek
  • #11 1352819
    KJ
    Poziom 31  
    Posty: 2370
    Pomógł: 68
    Ocena: 945
    Będe z tym kombinował :D Niezbyt miałem czas się wgłębić myślałem że to gotowa procedura więc walnąłem tylko do proca.
  • #13 1360312
    KJ
    Poziom 31  
    Posty: 2370
    Pomógł: 68
    Ocena: 945
    I kolejny problem. Nie zrobiłem jeszcze tej procedury przerwania jaką proponował zumek bo jest większy problem do pokonania. Tablica ma się komunikować z LCDsmartie i wyświetlać text przez ten program wysyłany. Odbieranie no problem Konwersja też do czasu. Mianowicie z tablicy ASCII działa wszystko od spacji do wielkiego Z (za wyjątkiem znaku $ Dolara czego wyjaśnić nie potrafię) dalej pomimo tego że warunki konwersji są skopiowane i maja pozmieniane wartości działać po prostu nie chce 8O jest jeszcze jedna dziwna rzecz mianowicie wysłanie ciągu ABCDEFGHIJKLMNOP powoduje restart lub zwis procesora w momencie wyświetlenia N kiedy kombinacja MN znajdzie się: M na piątej N na szóstej pozycji obraz się przesuwa w pionie o przypadkowe ilości lini. Przesuwanie MN o kolejne pozycje w prawo powoduje coraz dziwniejsze zachowanie się matrycy.W załączniku kompletny program. Czy takie dziwne zachowanie się proca może być spowodowane zasilaniem ?? (Zasilanie to zasilacz od PC)

    PS. dlaczego załącznik w formacie BAS jest zablokowany ??
    Załączniki:
    • Ver0.6.zip (2.64 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #14 1360336
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    Tu widzę prędzej problemy ze wskaźnikiem stosu, niż z zasilaniem, kol. Zumek, pewnie coś jest w stanie poradzić(jak tylko się zaloguje...) ;)
    KJ napisał:
    PS. dlaczego załącznik w formacie BAS jest zablokowany ??
    Jak na mój gust to jest ok, jak podeślesz swój pliczek spakowany, takich plików jest na elektrodzie setki dziennie i ta oszczędność się opłaca... ;)
    Light-I
  • REKLAMA
  • #15 1362452
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Witam.
    Po krótkim teście Twojego źródełka , mogę (narazie) stwierdzić z całą pewnością , że program błędnie wylicza indeksy dla tablicy Dat.Po pobraniu 6-go znaku do bufora Znak , program wpisuje dane przeznaczone dla tab. Dat do bufora Znak(bazgroli po buforze RS-a).Narazie tyle, muszę dokładnie przeanalizować kod , ale najpierw ... z pieseczkiem na spacerek :wink:

    Piotrek
  • #16 1364209
    KJ
    Poziom 31  
    Posty: 2370
    Pomógł: 68
    Ocena: 945
    Coś znalazłem jest w kodzie obliczanie pozycji:

    Sta = B1 * 15
    Sto = Sta + 14
    Pozycja = Licznik2 - 6
    B = Pozycja * 15

    Licznik 2 zaczyna liczyć od 6 więc 6-6 *15 = 0 a w procedurze wyświetlającej następuje odejmowanie od b liczny jeden w każdym odświeżeniu więc zamiast ciągu 15,14,13,12... mam 255,254,253,252... i podejrzewam że to jest powodem wariowania programu.

    No dobrze wyrzuciłem procedurę wprowadzającą przesunięcie i pozmieniałem wartości licznika tak żeby liczył od 1 do 16 teraz wyświetla wszystkie zadeklarowane w tablicach znaki ale: Proc nadal wywala się na ciągu ABCDEFGHIJKLMN jak piszę małymi to nic się dziwnego nie dzieje.
  • #17 1364716
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Podsyłam Ci mocno stuningowany program ale mam kilka pytań.
    1)Dlaczego przepisujesz obrazy znaków do RAM :?:
    2)Dlaczego proceduka kopiująca znaki z Flash-u do RAM nie jest zsynchronizowana z przerwaniami :?:
    3)Po co zapisujesz do bufora RS-a , niepotrzebne pierwsze 6 znaków :?:
    To na tyle jeśli chodzi o pytania.

    Niepotrzebnie podzieliłeś tablicę generatora znaków na części A,B,C ... wystarczyło tylko zmienną , która adresuje tę tablicę(Nrtab) , utworzyć jako WORD a nie BYTE.Może się okazać , że poprawiony program , wyświatla znaki do góry nogami :wink: gdyż wszystkie ofsety są w nim zwiększane.
    Sprawdź i daj znać to sobie dalej pogdybamy :wink:.

    Piotrek
    Załączniki:
    • Ver0.6_1.zip (2.17 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #18 1364939
    KJ
    Poziom 31  
    Posty: 2370
    Pomógł: 68
    Ocena: 945
    No to tak: Program w sumie działa znaczki faktycznie są do góry nogami ale to nie problem. Nie do końca poprawnie tłumaczy wszystkie literki i nadal nie działają znaczki $ @ [ ] \ i pozostałe z przedziału 91 do 96 w tablicy ASCII. Nadal następuje reset procesora po wpisaniu ABCDEFGHIJKLMN. Obrazy znaków przepisuję do ramu bo tak mi wygodniej tryb wyświetlania textu to jeden z dwóch planowanych drugi to tryb graficzny 6 pierwszych znaków odbieram gdyż majom posłużyć do przełączania trybów między graficznym a textowym do grafiki będę po prostu dołączał 6 swoich znaków innych niż te które także nie będą wyświetlane. Co do tej synchronizacji jest tak bo inaczej nie potrafię. Różnica między trybami będzie niewielka licznik znaków będzie liczył do 240 i odbierał zmienną bezpośrednio do DAT program tłumaczenia znaków będzie w tym czasie zatrzymany w sumie ta procedura jest napisana osobno i działa bez zarzutu trzeba tylko odpowiedni soft na PC do konwersji i wysyłania grafiki.

    No obróciłem multiplex tablicy i władowałem pełna tablicę znaków i program ruszył działa poprawnie za wyjątkiem niektórych znaków tych co zwykle. Sytuacja o tyle się poprawiła że znaki te wpisane ręcznie przy pomocy terminala są wyświetlane a wysyłane ze smartie nie podejrzewam że ten programik je jakoś inaczej koduje w sumie można by to tak zostawić. Ale nadal nie udało się wyjaśnić zagadki ciągu od A do N w kolejności alfabetycznej i wywalania się na nim programu...
  • #19 1365432
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Nie mam pojęcia co to może być , z tym resetem.Spróbuj w opcjech Bascoma zwiększyć wartość HW Stack ,Soft Stack i Framesize na np. 256(RAM-u jest dość).Jeśli chodzi o wyświetlanie poszczególnych znaków , to na symulatorach wszystko działa OK .Jakie znaki wpiszę do bufora RS to do RAM-u ładują się odpowiednie dane , na odpowiednim miejscu.Wpisanie do bufora 6xspacja+ABCDEFGHIJKLMNOP nie powoduje żadnych nieprawidłowości .Ki diabeł :wink:.

    Piotrek

    PS
    Co to jest ten LCD Smartie :?:
    Na goglu wyczytałem , że to jakiś PC-towy program do obsługi LCD , ale na port LPT :!:
  • #20 1365657
    KJ
    Poziom 31  
    Posty: 2370
    Pomógł: 68
    Ocena: 945
    LCD smartie to taki sobie programik do sterowania wyświetlaczem LCD na porcie LPT posiada także opcję (nawet dwie opcje) sterowania wyświetlaczem Na porcie COM (tą właśnie wykorzystuję) programik do pobrania tutaj: http://lcdsmartie.sourceforge.net/ Posiadam wersje 5.1 a tryb który wykorzystuje to w ustawieniach nazywa się serial(crystal Fontz) U mnie także w symulacji żadne cuda się nie dzieją przy tym ciągu.

    Po zmianie parametrów w kompilatorze na 256 nic się nie zmienia :| Ten ciąg jest jakiś magiczny chyba się program buntuje że nie będzie takich krzaków wyświetlał :)
  • Pomocny post
    #21 1365693
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Spróbuj może z terminala coś wysłac ... :?:

    Piotrek
  • #22 1365704
    KJ
    Poziom 31  
    Posty: 2370
    Pomógł: 68
    Ocena: 945
    Z terminala jak wysyłam to jest ok znaki które przy smartie nie są wyświetlane pojawiają się (czyli kodowanie w smartie inne) ale problem A-N pozostaje w terminalu dokładnie to samo zjawisko w momencie wysłania N cały display gaśnie.

    PS. Jak w to wszystko wpleść jeszcze obsługę watchdog-a ??
    Obecna wersja programu w załączniku
    Załączniki:
    • Ver0.6_2.rar (2.41 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #23 1369026
    KJ
    Poziom 31  
    Posty: 2370
    Pomógł: 68
    Ocena: 945
    Problem ciągu A-N występuje tylko gdy jest podłączony programator ;) kiedy wpisuję z odpiętym programatorem nic dziwnego się nie dzieje. Podejrzewam że to wina dość długich lini danych w matrycy (całość ma ponad metr długości) i kabla do programatora (3m przedłużka LPT + 25cm taśmy do złącza na płytce)
  • #24 1391188
    KJ
    Poziom 31  
    Posty: 2370
    Pomógł: 68
    Ocena: 945
    Mam pytanie bo nigdzie nie umiem tego znaleźć: w którą stronę liczy timer0 i kiedy przerwania będą częściej ?? jak załaduję 200 czy np. 50 ?
  • #25 1391321
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    Timer0 jest jednobajtowy i liczy do przepełnienia (Overflow), przerwanie "Timer0 overflow" się pojawi, gdy z 0xFF(255 dziesiętnie) licznik przeskoczy na 0x00(0 dziesiętnie), więc im wiekszą wartość wpiszesz, tym szybciej nastanie przerwanie. A znaleźć można jak najbardziej w dowolnym pdf-ie od AVR, łacznie z kawałkiem kodu w asm... ;)
    Pozdrawiam, Light-I

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy problemów z obsługą matrycy LED 126x15 w Bascom AVR, w szczególności z nieprawidłowym działaniem programu sterującego wyświetlaczem. Główne zagadnienia to błędne indeksowanie tablic (adresowanie od zera zamiast od 1), nieoptymalna i nieczytelna obsługa przerwania Timer0, problemy z synchronizacją kopiowania danych znaków z pamięci Flash do RAM oraz nieprawidłowe wyświetlanie znaków ASCII, zwłaszcza znaków specjalnych ($, @, [, ], ) i ciągu liter A-N, który powoduje reset lub zawieszanie procesora. Wskazano na możliwe przyczyny problemów, takie jak niewłaściwe zarządzanie wskaźnikiem stosu, brak synchronizacji przerwań, długie linie danych matrycy oraz zakłócenia związane z podłączonym programatorem i kablami. Zaproponowano poprawki w kodzie, m.in. uproszczenie obsługi przerwania, poprawne indeksowanie tablic, zwiększenie rozmiarów stosu w Bascom, a także sugestię przeniesienia kodu do asemblera dla lepszej wydajności. Omówiono także konfigurację Timer0 i wpływ wartości ładowanej na częstotliwość przerwań. Wspomniano o integracji z programem LCD Smartie do sterowania wyświetlaczem przez port COM oraz o problemach z kodowaniem znaków w tym oprogramowaniu. Dyskusja zawierała także link do schematu połączeń i sugestie dotyczące poprawy czytelności kodu i nazewnictwa zmiennych.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA