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

Dlaczego wyświetlacz widmowy pokazuje tylko małe litery?

.robcio. 03 Mar 2014 20:53 1767 17
  • #1 13370223
    .robcio.
    Poziom 11  
    Witam! mam problem z oprogramowaniem do mojego wyświetlacza widmowego.
    Do rzeczy.

    Napisałem program który umożliwił mi wyświetlanie na nim napisów. Zastosowałem kodowanie ASCII do wyboru znaku jaki chcę wyświetlić.
    W tablicy dwuwymiarowej zdefiniowałem sobie każdy ze znaków (na początku wielkie litery). Wszystko było ok wyświetlacz wyświetlał to co chciałem.
    problemy zaczęły się jak dopisałem do tej tablicy znaków małe litery, wtedy mój układ zaczął tak samo reagować na wielkie jak i małe litery w tablicy- zawsze wyświetla małe .

    Mógłby ktoś powiedzieć dlaczego tak się dzieje ?

    Zamieszczam tutaj kod mojego programu.
    Główny program
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Plik z tablicą znaków i efektami

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #2 13372155
    el2010tmp
    Poziom 25  
    Masz jakieś ostrzeżenia kompilatora?
    Piszesz: const char text[] = {'T','O','M','E','C','Z','E','K',']',']',']',};
    kilka linii później: const char text[] = {'T','o','m','e','c','z','e','k',']',']',']',']'};
    Wiesz co znaczy const?
  • #3 13372207
    BlueDraco
    Specjalista - Mikrokontrolery
    To akurat nie jest problem - te dwie stałe mają różne zasięgi leksykalne.
  • #4 13376062
    .robcio.
    Poziom 11  
    Const to stały, ale zauważ że ta tablica nie obejmuje zasięgiem całego programu.
    Poza tym nawet gdy do jednaj tablicy załaduje wielkie i małe litery to nadal wyświetlać będzie duże jako małe.
    Nawet gdy zrobię tylko jedną tablicę ze znakami.
  • #5 13378396
    gaskoin
    Poziom 38  
    kompilator avr słabo obsługuje consta (jeśli chodzi o umieszczenie danych).

    Nie masz może pozamienianych tablic z literami ?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    dla litery T (ascii 84) wg Twoich obliczeń wylądujemy w elemencie tablicy nr 38 i 39

    {0b00000000,0b10000000,0b10000000,0b10000000,0b00000000,0b00000000,0b00000000,0b00000000},
    {0b00100000,0b00100000,0b00100100,0b00111111,0b00100000,0b00100000,0b00100000,0b00000000},



    Pierwsza linijka to:

    ________
    #_______
    #_______
    #_______
    ________
    ________
    ________
    ________


    a druga
    __#_____
    __#_____
    __#__#__
    __######
    __#_____
    __#_____
    __#_____
    ________


    no nie ma siły :)
  • #6 13382835
    .robcio.
    Poziom 11  
    Wyświetlanie wielkich liter jest dobrze bo wielkie litery wyświetlało mi normalnie puki nie zdefiniowałem małych. A poza tym źle skopiowałeś.


    A i pamiętaj że przy wywoływaniu tablicy pierwszy jej element to 0 a nie 1.
  • #7 13383456
    gaskoin
    Poziom 38  
    Mea culpa

    __#_____
    __#_____
    __#__#__
    __######
    __#_____
    __#_____
    ________

    druga pusta

    więc dla T powinno Ci to wyświetlić, a nie małą literę

    .robcio. napisał:
    Wyświetlanie wielkich liter jest dobrze bo wielkie litery wyświetlało mi normalnie puki nie zdefiniowałem małych.


    Nie kumam o czym mówisz. Z Twojego zdania wynika coś takiego: "Wyświetlanie wielkich liter działa mi idealnie, ale wyświetla mi małe litery zamiast dużej". Ja Ci tylko pokazuje, że tablice są ok i dla T powinieneś otrzymać to co Ci wkleiłem a nie małe t.

    .robcio. napisał:
    Problemy zaczęły się jak dopisałem do tej tablicy znaków małe litery, wtedy mój układ zaczął tak samo reagować na wielkie jak i małe litery w tablicy- zawsze wyświetla małe.
  • #8 13383489
    .robcio.
    Poziom 11  
    Wytłumaczę jak na miedzy.
    1. Na początku przedefiniowałem sobie alfabet wielkich liter.
    2.Przetestowałem czy wyświetla mi je dobrze.
    3.Wynik testu pozytywny-działa.
    4.Dodałem do tablicy małe litery.
    5.Chcę wyświetlić dużą wyświetla mi małą. Chcę wyświetlić małą wyświetla także małą.
  • #9 13383531
    piotrva
    VIP Zasłużony dla elektroda
    A mnie martwi co innego - litery trzymasz w pamięci ram jako zmienne int, czyli mamy 116*8*2 bajtów danych...
    Powiedz na jakim procesorze działasz to może wiele to wyjaśniać ;)
  • #10 13383581
    .robcio.
    Poziom 11  
    Atmega 8.
    Martwi mnie jeden komunikat przy kompilacji
    Data: 1297 bytes (126.7% Full)
  • #11 13383611
    piotrva
    VIP Zasłużony dla elektroda
    No i widzisz - martwi nas jak się okazuje ten sam problem - na taką ilość zmiennych nie starcza procesorowi miejsca w pamięci RAM, przez co program może zachowywać się dziwnie - powiem nawet, cud, że działa :D

    Co musisz zrobić - poczytaj o przechowywaniu w pamięci flash procesora (atrybut PROGMEM i funkcja pgm_read_byte(...);) - możesz też zerknąć do mojego projektu, jak rozwiązana jest sprawa przechowywania czcionki.
    https://www.elektroda.pl/rtvforum/topic2086208.html

    Poza tym nie podoba mi się #define F_CPU - tak w ogóle w czym piszesz ten program (jakie IDE)?
  • #12 13383645
    .robcio.
    Poziom 11  
    IDE- WinAvr.
    Dzięki bardzo :D
    Rozwiązałeś mój kolejny problem dlaczego program zawieszał mi się i dziwnie reagował gdy chciałem wyświetlić więcej niż 3 linijki tekstu.
  • #13 13383659
    piotrva
    VIP Zasłużony dla elektroda
    Nie ma sprawy, fajnie, że pomogłem.

    Polecam jeszcze co do środowiska przesiadkę na coś rozgarniętego - np. Atmel Studio.
  • #14 13383682
    .robcio.
    Poziom 11  
    Więc w tym momencie mam 2 wyjścia:
    1.Zmiana procka na większy.
    2.Zewnętrzny EEPROM, bo Atmega8 ma tylko 512 bajtów wewnętrznego EEPROM'a.
    Co byś polecił w przypadku takiego projekciku?
  • #15 13383718
    piotrva
    VIP Zasłużony dla elektroda
    Czytaj jeszcze raz ze zrozumieniem - dane możesz przechować w pamięci FLASH, teraz są one przechowywane w pamięci FLASH a potem podczas startu procesora kopiowane do pamięci SRAM.

    Stosując modyfikator PROGMEM, ograniczając typ danych tablicy do uint8_t oraz odczytując dane z pamięci za pomocą pgm_read_byte() możesz wszystko zrobić na Atmega8 - zajrzałeś chociaż do mojego projektu? Widziałeś ile tam zmieściłem w Atmega8?

    Dodano po 1 [minuty]:

    https://www.elektroda.pl/rtvforum/topic2086208.html#9929737
  • #16 13383736
    .robcio.
    Poziom 11  
    Widziałem, ale tam stosowałeś zewnętrzny EEPROM. Ok poczytam dogłębnie i jakoś sobie poradze.
  • #17 13384022
    piotrva
    VIP Zasłużony dla elektroda
    Widać potrzebne Ci okulary :D - w zewnętrznym eepromie przechowywany jest program animacji i teksty do wyświetlenia, które są wgrywane z komputera (czyli odpowiednik Twoich efektów i tekstów), zaś wzory czcionek są przechowywane w pamięci FLASH procesora Atmega8.
  • #18 13384101
    .robcio.
    Poziom 11  
    Przeniosłem już tą tablicę do pamięci FLASH i wszystko działa :D
    A podpowiedziałbyś jak przedefiniować sobie matrycę do tego wyświetlacza?
    Chodzi mi o to żebym mógł podawać współrzędne x/y i w ten sposób zapalać wybrane ledy w odpowiednim momencie .
REKLAMA