Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Atmega8][C] Futaba VFD BJ883GNK i SC16311

nexus6 10 Gru 2009 13:43 5581 22
  • #1 10 Gru 2009 13:43
    nexus6
    Poziom 10  

    Witam,
    Naszła mnie druga młodość. Czyli jak najbardziej początkujący.
    Wysiadło radio samochodowe Medion i trochę szkoda było wyrzucać cały układ wyświetlający VFD wraz ze starowaniem.
    Elektorniką "bawiłem" się na studiach i jak mi wpadło to w ręce to postanowiłem z sentymentu wrócić. I co świat idzie naprzód jendnoukładowce, I2C, one-wire, wszystko nowe a więc do dzieła :)

    Pytanie lampy VFD zasila się zwyczajowo żarzenie:+1,5 do +3V
    sterowanie grid o przepraszam siatka i segment: +20V do +30V
    To co w temacie to ~30V na żarzeniu z przetwornicy (takiej na kablu z tyłu radia) czy to normalne?
    sterownik tego wyświetlacza to Silan SC16311 (UPD16311) szeregowa transmisja do uC,własna pamięć RAM wyświetlacza, 8 poziomów jasności wyświetlacza (wypełnienie), do starowania siatkami i segmentami układ ten wykorzystuje
    napięcie -30V.
    Czy ktoś może pisał soft dla uC do obsługi tego coś?
    Czy budowa zegarka dla początkującego na tym czymś to zbyt duże wyzwanie jak na początek?
    Czy do budowy zegarka wystarczy zastosowanie np. Atmega8? Dodawać układ RTC?
    Uff dużo tego.
    Za wszelkie sugestie będę wdzięczny proszę się nie zniechęcać jak będę odpowiadać z dużym opóźnieniem ale musze się nauczyć: programować uC :D (C,ASM,Bascom:?:)
    Przepraszam za te trywialne pytania ale dawno nie dotykałem elektroniki :D

    Dodano po 3 [godziny] 31 [minuty]:

    dodatek
    siedząc sobie w ustronnym miejscu z notą 16311 doszedłem do wniosku że
    układ ten sam się zajmuje odświeżaniem lampy VFD a działa mniej więcej tak:
    po przesłaniu rozkazów i danych do pamięci Display
    układ "przemiata" napięciem Vdd=-35V zestaw grid,n i segment,n
    teraz czy jest to sekwencja np. grid1 segment 1,2,3...n
    czy też grid1 segment 1 grid2 segment 1 ... gridn segment 1 itd.
    W sumie to chyba nie ma znaczenia bo i tak nie mam na tio wpływu :)
    Gdzieś się natknąłem że MAX robi podobne układy ale na napięcia dodatnie może
    transmisja jest podobna, może ktoś wie jaki to MAX?
    Fajnie o jeden problem mniej odpada sterowanie bezpośrednie VFD
    pozdrawiam,

    0 22
  • #2 10 Gru 2009 18:45
    nsvinc
    Poziom 35  

    www.maxim-ic.com <-- spróbuj poszukać tego twojego "MAX"a...

    poza tym. skoro masz juz sc16311, to po co ci inny/dodatkowy/zamienny driver do VFD?

    Dodawać RTC? zalezy czy chcesz go dodać :] To jest typowo konstruktorskie pytanie, no a ze to twoj uklad, to musisz zdecydowac sam...

    Do budowy zegarka pod driver sterowany jakas badziewna magistrala szeregowa (najpewniej chamski RS232-TTL lub nie-TTL) wystarczyłby PIC16Fxxxx :D lub jakis smutny attiny. mega8 w twoim przypadku to hardcore.

    O co ci chodzi z tym żarzeniem, przetwornica, i kablem?...Czyzby konstruktorzy radia samochodowego "dorzucali" najczesciej psujacy sie element w oddzielnej czarnej skrzynce "extra"?

    Nie kazdy jest szczesliwym posiadaczem zdechłego radia firmy Medion, wiec na gotowy kod nie masz raczej co liczyć.

    Programowac? NIE-bascom (chybaze chcesz poprzestać na sprzetach typu uC+wyswietlacz+ukladzik wykonawczy)....
    Polecam: ARMy (chociazby na rdzeniu v4...), no i assembler

    A tak na powaznie - zdaj sie tutaj na opinie Kolegów (o ile ktos sie zainteresuje tym tematem), ktorzy są w temacie konstruowania sprzętów "uzytkowych". Tu niestety ja nie jestem w stanie pomóc...

    0
  • #4 10 Gru 2009 21:40
    nexus6
    Poziom 10  

    :) Dzięki za posty.
    Stan na dziś :
    zasilacz skończony:
    +5V/1,5A +12V/1,5A wyszperałem jakiś stary impulsowy
    przetwornica (jeżeli ktoś szuka schematu to znalazłem) podpięta na +12V która daje:
    F1=~30V napięcie żarzenia
    F2=~30V napięcie żarzenia
    Vdd=-36,5V napięcie sterujące siatkami i segmentami
    ale się narobiłem :) ale co tam mam się bawić w uC a nie w analogówkę
    czekam na programator nie chce mi sie dłubać
    myślę że SC16311 rozpracowany i faktycznie transmisja to asynchronik totalny badziew sterowny jednym sygnałem :) ale sam układzik całkiem sprytny,
    zobaczymy jak będzie to pracować z uC.
    Troszkę jestem zakłopotany może zrobić zegar tylko programowy? W sumie to mój 1 projekt na uC ale zostawię sobie furtkę dla podpięcia RTC zewnętrznego.
    VFD to 14 siatek i 14 segmentów.
    Dzięki za linka Maxim faktycznie robi prawie identyczne drivery :) a są one znacznie lepiej znane na Elektrodzie :)
    ale poświęciłem już za dużo czasu temu SC... następny projekt będzie na MAX-ach :)a teraz idziemy zapalać diody podpięte do uC trzeba od czegoś zacząć :)
    -> mirekk36 jejku nie zaskoczyłem ten post czytałem ze 3 razy normalnie jak niezły kryminał i kto mówi że elektronika to nuda :)
    był to jeden z postów który zmusił mnie do powrotu do źródeł :) Fantastyczna robota naprawdę chylę czoła Tobie i kolegom super sprawa!

    0
  • #5 11 Gru 2009 11:02
    nsvinc
    Poziom 35  

    Czekaj, czekaj, rozpędziłeś się z tym "asynchronikiem"...Wlasnie zajrzałem w datasheeta tego twojego sc16311 i:

    1) to nie jest zaden asynchronik/uart/rs232 i pochodne
    2) TO JEST SPI!!!

    Masz jak wół napisane "CLK - clock input". Czy asynchroniczna transmisja potrzebuje zegara? zastanów się....

    Ten scalak jest fajny, nie wiem na co narzekasz. Duze mozliwosci i prosty w obsłudze.

    Jakoże jestes początkujący, zwrócę twoją uwagę na pewne ISTOTNE sprawy związane z tym driverem:

    -zauważ zegar w spoczynku jest w stanie WYSOKIM + dane się zatrzaskują na zegarze NARASTAJĄCYM: SPI mode 3

    -STB pełni funkcję standardowego spi-owego CSa (Chip Select), i jak widzisz jest aktywny w stanie niskim ,czyli std.

    -Transmisja odbywa się bajtami. Pamietaj o opuszczeniu CSa przed rozpoczeciem transmisji, i podniesieniem go po zakonczeniu transmisji - kazdy kolejny rozkaz wymaga machania CSem - czyli tez standard.

    -Poprzez ten driver mozesz migać ledami - spróbuj :]

    RTC zewnetrzny to jakby nie patrzeć, DWA piny, i DWA rezystory (SDA/SCL)...

    0
  • #6 13 Gru 2009 08:44
    nexus6
    Poziom 10  

    nsvinc-dzięki
    czy dobrze kombinuję: można wykorzystać np. porty pd5-7 atmegi jako linie DATA (out), CLK, STB także będzie tylko transmisja AT->SC16331. Chyba że musze poświęcić interfejs SPI do programowania AT :( układ bedzie męczony do bólu i porgramowany dzięsiatki razy (w tym wypadku odpinac AT od SC na czas programowania?)
    pozdrawiam

    0
  • Pomocny post
    #7 13 Gru 2009 11:47
    mirekk36
    Poziom 42  

    nexus6 --> w tym temacie do którego podawałem ci link, do taktowania właśnie takich rejestrów przesuwnych zostały użyte zwykłe linie portów I/O za pomocą których zrobiony został programowy SPI - więc w czym miałby być problem?

    0
  • #8 28 Gru 2009 15:55
    nexus6
    Poziom 10  

    Witam,
    Proszę o pomoc bo moje C to jeszcze za mało :(
    Transmisja szeregowa synchroniczna :)
    Narazie funkcja bez przekazywania parametrów
    Funkcja ma za zadanie przesłać bit po bicie rozkaz DSM do
    sterownika VFD. Nie wiem jak wskazać zmienną "i" bit w DSM a następnie wpsiać go
    na 6 bit w PORTD. Zapis poniżej oczywiście kompletnie bez sensu:)

    Code:

    #include <avr/io.h>
    #include <util/delay.h>
    #define F_CPU 1000000L
    #define CLK_0 PORTD|=_BV(4)          //bit CLK=0
    #define CLK_1 PORTD&=~_BV(4)         //bit CLK=1
    #define STB_0 PORTD|=_BV(5)            //bit STB=0
    #define STB_1 PORTD&=~_BV(5)         //bit STB=1

    void cmd_DSM (void)
    {
       STB_0;                      //otwarcie komunikacji do VFD
          int i,DSM;
          DSM=0x0D;               //Display Mode b00001101
          for (i=0; i<8; i++)      // 8 bitów do wysładnia
          {
          CLK_0;                  // clock =0
          B=PORTD|=_BV(6)|DSM(i);   /* Jak to zapisać Aby Na linii 6 Portu D pojaiwały sie kolejne bity
                               rozkazu DSM uwaga reszta bitów PORTD nie może być zmieniona!
          CLK_1;                  // zapis do VFD kolejnego bitu
          }
          
          


    jadąc do domu wpadłem na coś takiego proszę czy ma szansę to zadziałać?


    Code:

    #define CLK_0 PORTD|=_BV(4)          //bit CLK=0
    #define CLK_1 PORTD&=~_BV(4)         //bit CLK=1
    #define STB_0 PORTD|=_BV(5)            //bit STB=0
    #define STB_1 PORTD&=~_BV(5)         //bit STB=1
    #define DIN_0 PORTD|=_BV(6)             //bit DIN=0
    #define DIN_1 PORTD&=~_BV(6)            //bit DIN=1

    void cmd_DSM (void)
    {
       STB_0;                   //otwarcie komunikacji do VFD
       int i,DSM;
       DSM=0x0D;               // Display Mode b00001101
       for (i=0x01; i<0x81; i*=2)   // 8 bitów do wysładnia LSB do MSB
       {
       CLK_0;                  // clock =0
       if (DSM&i)                // 0-false, 1-true
          {
          DIN_1;               // ustaw bit6 na 1
          CLK_1;               // zapis do VFD kolejnego bitu
          }
       else
          {
          DIN_0;               // ustaw bit6 na 0
          CLK_1;               // zapis do VFD kolejnego bitu
          }
       }
       STB_1;                  // zamknięcie transmisji
    }   

    0
  • #9 29 Gru 2009 22:49
    nexus6
    Poziom 10  

    :cry:
    Nie ma szans aby działało
    bo jak się robi takie błędy sorrki ale uczę się

    Code:

    #include <avr/io.h>
    #include <util/delay.h>
    #define F_CPU 1000000L
    #define CLK_1 PORTD|=_BV(4)          //bit CLK=1
    #define CLK_0 PORTD&=~_BV(4)         //bit CLK=0
    #define STB_1 PORTD|=_BV(5)            //bit STB=1
    #define STB_0 PORTD&=~_BV(5)         //bit STB=0
    #define DIN_1 PORTD|=_BV(6)          //bit DIN=1
    #define DIN_0 PORTD&=~_BV(6)         //bit DIN=0
    #define DSM 0x0D                  //Display Mode  b00001101 14gridx14segment
    #define DSC 0x40                  //Data Setting  b01000000
    #define ADD 0xC0                  //Address Setting b11000000
    #define DCC 0x8F                  //Display Control b10001111
    #define OFF 0x80                  //Display Control b10000000 OFF Display
    #define TEST 0xff


    i co :D :D:D:D Hurra działa na razie brak procedur dostępu do pojedynczych Gridów wyświetlacza ale transmisja działa i VFD żyje Hurra ale uciecha pierwsze podejście do programowania i się udało!
    a zmieniłem też definicję pętli for na oszczędniejszą z mnożenia na przesunięcie bitowe
    Code:

    void send_cmd (char CMD)
    {
       STB_0;                   //otwarcie komunikacji do VFD
       int i;
       for (i=0x01; i<0x81; i<<=1)// 8 bitów do wysładnia LSB do MSB
       {
       CLK_0;                  // clock =0
       if (CMD&i)                // 0-false, 1-true




          {
          DIN_1;               // ustaw PD6 na 1
          CLK_1;               // zapis do VFD kolejnego bitu
          }
       else
          {
          DIN_0;               // ustaw PD6 na 0
          CLK_1;               // zapis do VFD kolejnego bitu
          }
       }
       STB_1;                  // zamknięcie transmisji
    }   

    VFD w całej okazałości :)
    [Atmega8][C] Futaba VFD BJ883GNK i SC16311 [Atmega8][C] Futaba VFD BJ883GNK i SC16311
    :D Procedura swobodnego dostępu do pamięci wyświetlacza gotowa teraz tablice
    i kodowanie znaków tylko na razie nie wiem jak się do tego zabrać. Czyli czytać czytać ...
    [Atmega8][C] Futaba VFD BJ883GNK i SC16311

    0
  • #10 30 Gru 2009 20:05
    nexus6
    Poziom 10  

    Może ktoś podpowie jak się zabrać do pisania tablicy? To naprawdę mój 1 program w c i na uC. :oops:
    procedura przyjmuje 3 parametry adres BANKA i BANKB
    w zmiennych BANK są 8 bitowe liczby dla pamięci wyświetlacza.
    Na razie to aby wyświetlić napis to taka orka na ugorze że hejjjj :|

    Code:

    mem_access (OFFSET+0x0c,0x26,0x0B);_delay_ms(100);   //N

    jakaś sugestie podpowiedź żeby zrobić to uniwersalnie np. w jakiejś zmiennej (tablicy?)
    podaję tekst do wyświetlania jakaś funkcja (?) przerabia tekst na dane dla BANK
    Planuję aby procedura mem_access była wykorzystywana przez zegarek i inne kawałki programu do wyświetlania swojego działania
    pozdrawiam.
    HEP'P'P'PY NEEUUWW YEARRR :!::idea::idea::!: czyli szampan balanga to je to! :robot: :popcorn:

    0
  • Pomocny post
    #11 30 Gru 2009 20:20
    nsvinc
    Poziom 35  

    Chyba nie zrozumiałem pytania...

    Jak "napisać tablicę"? Normalnie: bierzesz długopis, kartkę i...piszesz :]

    Nie rob obslugi tekstów w C na sztywno zdefiniowanych tablicach. Znacznie lepiej robi się to wskaznikiem...

    Nie wiem jak ci pomóc, bo skad mam wiedziec co to jest 0x26 lub 0xB? Co to są za liczby? Nie są na pewno w ASCII (obok masz w komentarzu 'N'...)

    Czy potrzebujesz lookup tych zmiennych BANKA i BANKB dla kazdej litery? Jesli tak, niestety czeka cię zrobienie tablicy const unsigned char o wielkosci (ilość_liter_ktore_chcesz_wyswietlac x 2), np. tak

    const unsigned char charmap[128][2];

    A nastepnie inicjalizujesz to dla kazdej litery lub znaku ktory chcesz wyswietlic. Nastepnie robisz funkcje, np.

    void putchr(unsigned char znak)

    ktora przyjmie znak ASCII (liczba 0..255), znajdzie ten znak w tej tablicy (np. korzystając z wzoru) i pogoni na wyswietlacz...

    A nastepnie piszesz funkcję ktora przyjmuje wskaznik na unsigned char np.

    void putstr(unsigned char *znaki)

    w ktorej bedziesz rozbierał zawartość pamięci spod (znaki) bajt po bajcie az do znaku pustego, za kazdym razem sumiennie wywolujac wyzej zaproponowaną funkcję putchr...
    Mniej wiecej tak:


    while(*znaki)
    {
    putchr(*znaki);
    znaki++;
    }

    Pominalem tutaj obliczanie offsetu czyli pozycjonowania znakow na wyswietlaczu.

    0
  • #12 30 Gru 2009 20:35
    nexus6
    Poziom 10  

    :D
    te liczby to 2 bajty do wysłania aby na wyświetlaczu pojawiło się N
    nieźle jest to pokręcone nie ma to nic z ASCII wspólnego nie dość baty mają przestawione bity bo sterownik przyjmuje wartości od LSB do MSB w bajcie (Motorola vs. Intel)
    Adresacja pamięci też jest ciekawa bo w moim przypadku ta pamięć jest nieciągła :)
    dzięki za podpowiedź mam nadzieję że nie padnę w tym miejscu.
    dzięki również za poprzednie podpowiedzi :) przydały się!

    0
  • Pomocny post
    #13 31 Gru 2009 12:03
    nsvinc
    Poziom 35  

    Masz tu trochę lepszą funkcję programowego SPI:

    Code:

    void send_cmd (unsigned char CMD) //UNSIGNED CHAR!
    {
    unsigned char i; //8 bitow - na 8bitowym procesorze szybsze od 16bitowego inta :)
    STB_0;                   //otwarcie komunikacji do VFD
    for (i=1; i ; i<<=1)// 8 bitów do wysładnia LSB do MSB - for leci do przekrecenia i
    {
    CLK_0;                  // clock =0
    DIN_0;               // ustaw wstępnie PD6 na 0
    if (CMD&i)                // 0-false, 1-true
    {
     DIN_1;               // ustaw PD6 na 1 tylko jesli dany bit jest 1
    }
    CLK_1;   
    }
    STB_1;                  // zamknięcie transmisji
    }


    Ogolnie parę uwag:

    - pracujesz na 8bitowym procesorze. Unikaj więc stosowania zmiennych 16bitowych, w szczególności jako zmienne "do fora".

    - dlaczego twoja funkcja send_cmd przyjmuje parametr typu 'char'? Jestes pewny ze kompilator ma wlaczona opcje 'char is unsigned'? Jesli nie, to przy próbie zapisania liczby wiekszej niz 127 będziesz miał warninga przekroczenia zakresu. Dobrym przyzwyczajeniem jest pisanie przed kazda zmienna tego 'unsigned', chyba ze masz pewność/potrzebę przechowywać w tej zmiennej liczby ujemne.

    - nie powtarzaj kodu ktory i tak się wykona, tak jak to zrobiles w funkcji send_cmd. Skoro CLK_1; jest i 'w ifie' i 'w elsie', to zawartość makra wykona się zawsze, niezaleznie od wyniku porownania ifa.

    0
  • #14 31 Gru 2009 12:36
    mirekk36
    Poziom 42  

    nsvinc --> tak z ciekawości zapytam dlaczego zmienną do iteracji w pętli for deklarujesz np jako unsigned char zamiast np uint8_t ???

    tzn wiem dokładnie, że w jednym i drugim przypadku to oznacza to samo czyli liczbę z zakresu 0-255 i wszystko tak samo ładnie będzie działać, ale czy nie nie jest dobrym przyzwyczajeniem przy pisaniu programów w C aby właśnie typu char czy unsigned char używać tylko do przechowywania znaków? a zmienne których używamy jako zwykłe wartości liczbowe deklarować jako int unsigned int, int8, uint8_t, doble, long itd.

    Pytam tylko dlatego , że sam nadal się uczę języka C i zawsze ciekawią mnie zagadnienia dobrych (hmm najlepszych) praktyk programowania w tym nowym dla mnie języku ;)

    0
  • #15 31 Gru 2009 12:43
    nexus6
    Poziom 10  

    Fantastyczne
    ->nsvinc
    takie uwagi są badzo cenne i to na początku maltretowania się z C :idea: :!:
    bo jak błąd wejdzie w głowę to będzie tam tkwić do końca.
    Zupełnie nie zwróciłem na to uwagi bo przecież działa! Jeszcze raz dzięki
    pzdr4u

    0
  • #16 31 Gru 2009 12:58
    nsvinc
    Poziom 35  

    >mirekk36

    Nie wszystkie biblioteki udostepniaja makro/typ uint8_t...Racja, takie nazewnictwo jest czytelniejsze niz jakis 'unsigned char', ale jesli pisze się kod ktory ma miec maksymalne mozliwosci przeportowania na inny procesor/biblioteke, lepiej trzymać się nazewnictwa tradycyjnego - oszczędza to czas potrzebny do przeportowania...

    Ogolnie zalozenia byly (a moze jeszcze są) takie, ze char jest zawsze 8bitowy dla rdzeni DO 32 bitów, int jest zawsze rowny 'bitowosci' rdzenia (wylaczajac rdzenie 8bitowe, gdzie ten int jest 16bitowy)...
    Czym jest char dla srodowisk pod rdzenie 64bitowe - nie mam pojęcia :) ale idąc za ciosem najpewniej jest 16bitowy...

    Zmiennej typu char nigdy nie nalezy kojarzyc ze znakiem, bo sam 'znak' tak naprawde nie istnieje...Znak czy nie znak, zawsze jest liczba. Jeśli masz chęć przechowywać znak w longu, to przeciez nikt ci tego nie zabroni...

    Nie ograniczajmy 'znaków' do 8 bitów, bo co, jeśli podejmiesz decyzję że będziesz pracować na UTF16? Do char-a juz tego nie upchniesz, wiec pozostaje int. I wtedy masz 'znak' w int-cie - i wg. twoich założeń juz jest malutka sprzeczność :]

    A jesli chodzi o 'char do znakow' - zawiało pascalem...:D

    0
  • #17 31 Gru 2009 13:16
    mirekk36
    Poziom 42  

    nsvinc --> hahaha no pewnie że zawiało pascalem - bo ja od 10lat na PCtach aplikacje tylko w Delphi trzaskałem a teraz dopiero powoli zaczynam próby przejścia na C++ odkąd zakochałem się w C dla procków ;)

    z drugiej jednak strony najbardziej przekonuje mnie twój argument o tym aby łatwiej było przesiadać się z programem na inne procki, które nie będą miały zdefiniowanego uint8_t ;)

    (bo jak mówiłem to spokojnie rozumiem i znam twoje wyjaśnienia odnośnie tego że zmienna char służy tak na prawdę do przechowywania liczb.)

    No a sam też przyznałeś że np pisząc tylko dla AVR w C - nazewnictwo zmiennych liczbowych deklarowanych jako int czy uint - byłoby nieco czytelniejsze..... i to takie właśnie wyciąganie subtelnych już chyba tylko różnic mi chodzi. Więc dzięki za wyjaśnienia ;)

    0
  • #18 31 Gru 2009 14:46
    nexus6
    Poziom 10  

    Code:

    void send_cmd (unsigned char CMD)
    {
       unsigned char i;
       STB_0;                   //otwarcie komunikacji do VFD
       for (i=1; i<0x81; i<<=1)      // 8 bitów do wysładnia LSB do MSB
       {
       CLK_0;                  // clock =0
       if (CMD&i)                // 0-false, 1-true
          {
          DIN_1;               // ustaw PD6 na 1
          CLK_1;               // zapis do VFD kolejnego bitu
          }
       else
          {
          DIN_0;               // ustaw PD6 na 0
          CLK_1;               // zapis do VFD kolejnego bitu
          }
       }
       STB_1;                  // zamknięcie transmisji
    }   


    nie mogę zrozumieć dlaczego coś takiego nie działa na unsigned char a int działa ?
    Chyba przy unsigned char nie ma szans wysłać 8 bitu bo i zawsze będzie <0X81 czy tak?dobrze myślę?

    0
  • #19 31 Gru 2009 15:49
    nsvinc
    Poziom 35  

    No i masz w kodzie badziewie :]

    popatrz uwaznie na warunek ifa, ktory podalem pare postów wyzej. Nie ma zadnego 0x81....:/ czytaj ze zrozumieniem!

    A dlatego nie dziala, ze zauwaz ze ostatni obrót fora przesunie jedynkę z siódmego bitu w lewo, czyli ta jedynka wypadnie poza bajt. Dlatego w moim przykladzie for kreci sie DO ZEROWEGO "i"....

    0
  • #20 31 Gru 2009 17:36
    nexus6
    Poziom 10  

    nie nie spokojnie :D
    czytam ze zrozuminiem
    Twój SPI już w programie jest bardzo prosty i elegancki!
    do stosowania na zawsze a ten mój babol powyżej to tylko pytanie :D do Guru
    kurcze chyba coś mi nie idzie jasne formułowanie pytań :|

    0
  • #21 12 Sty 2010 15:57
    nexus6
    Poziom 10  

    Pomocy :(

    Code:


    void wyswietl (unsigned char pz, unsigned char str,unsigned char rozmiar, char *charmap)
    ....

    const unsigned char charmap[][3]={   {0x33,0x1D,'0'},   //0
                                  {0x02,0x01,'1'},   //1
                                  {0xC3,0x18,'2'},   //2
    ...


    wyswietl (pozycja,str,rozmiar,charmap);
    wyswietl (pozycja1,str,rozmiar,charmap);
    wyswietl (pozycja2,str,rozmiar,charmap);


    czemu kompiluje sie z błędem już kombinuję jak mogę i nic:
    ../Projekt/vfd.c:328: warning: passing argument 4 of 'wyswietl' from incompatible pointer type
    ../Projekt/vfd.c:329: warning: passing argument 4 of 'wyswietl' from incompatible pointer type
    ../Projekt/vfd.c:330: warning: passing argument 4 of 'wyswietl' from incompatible pointer type

    0
  • #22 12 Sty 2010 16:20
    nsvinc
    Poziom 35  

    Spróbuj tak :)

    Code:

    wyswietl (pozycja,str,rozmiar,(char*)charmap);


    Albo jako typ ostatniego parametru funkcji zamiast "char" napisz "unsigned char". Nadal popełniasz ten sam "błąd początkującego".

    Nic dziwnego ze masz warningi...Twoj "charmap" to typ (const unsigned char*), a funkcja oczekuje typu (char*) ...Czyli masz NIEZGODNE TYPY, czyli masz już wyjasnienie tych warningów...

    Twoja funkcja "wyswietl" najpewniej pracuje na bitach, nie liczbach, więc faktycznie jest wszystko jedno, czy liczba bedzie miala znak, czy nie, dlatego można zmusić kompilator do jawnego rzutowania typu wskaznika.

    Ale będą sytuacje, kiedy natniesz się boleśnie na bezmyślne rzutowania...

    Proste?

    0
  • #23 12 Sty 2010 16:35
    nexus6
    Poziom 10  

    To że mam niezgodnośc typów zmiennych to wiem :)
    definiowałem funkcję w postaci
    void wyswietl (a,a,a,unsigned char *charmap)
    ale niestety warrnigi pozostały
    ale wywołanie funkcji przez: (unsigend char*)charmap działa

    0