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

[Atmega8] Jak zasilić i sterować VFD BJ883GNK z Atmega8 i SC16311?

nexus6 10 Gru 2009 10:11 6499 22
  • #1 7369338
    nexus6
    Poziom 11  
    Posty: 57
    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,
  • #2 7371106
    nsvinc
    Poziom 35  
    Posty: 2870
    Pomógł: 262
    Ocena: 88
    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...
  • #3 7371519
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    Popatrz sobie tutaj ;)

    https://www.elektroda.pl/rtvforum/topic558072.html

    wszystko się da zrobić z wyświetlaczmi VFD. A program można pisać w dowolnym języku - chociaż jeśli już cokolwiek miałeś do czynienia z C nawet na PC - to zaczynaj od C dla mikroklocków ;)
  • #4 7372164
    nexus6
    Poziom 11  
    Posty: 57
    :) 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!
  • #5 7373663
    nsvinc
    Poziom 35  
    Posty: 2870
    Pomógł: 262
    Ocena: 88
    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)...
  • #6 7381591
    nexus6
    Poziom 11  
    Posty: 57
    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
  • Pomocny post
    #7 7382131
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    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?
  • #8 7447335
    nexus6
    Poziom 11  
    Posty: 57
    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:)

    
    #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ć?


    
    #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
    }	
    
  • #9 7455752
    nexus6
    Poziom 11  
    Posty: 57
    :cry:
    Nie ma szans aby działało
    bo jak się robi takie błędy sorrki ale uczę się
    
    #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
    
    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] Jak zasilić i sterować VFD BJ883GNK z Atmega8 i SC16311? [Atmega8] Jak zasilić i sterować VFD BJ883GNK z Atmega8 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] Jak zasilić i sterować VFD BJ883GNK z Atmega8 i SC16311?
  • #10 7460326
    nexus6
    Poziom 11  
    Posty: 57
    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 :|
    
    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:
  • Pomocny post
    #11 7460422
    nsvinc
    Poziom 35  
    Posty: 2870
    Pomógł: 262
    Ocena: 88
    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.
  • #12 7460509
    nexus6
    Poziom 11  
    Posty: 57
    :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ę!
  • Pomocny post
    #13 7463110
    nsvinc
    Poziom 35  
    Posty: 2870
    Pomógł: 262
    Ocena: 88
    Masz tu trochę lepszą funkcję programowego SPI:

    
    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.
  • #14 7463273
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    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 ;)
  • #15 7463305
    nexus6
    Poziom 11  
    Posty: 57
    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
  • #16 7463380
    nsvinc
    Poziom 35  
    Posty: 2870
    Pomógł: 262
    Ocena: 88
    >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
  • #17 7463478
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    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 ;)
  • #18 7463902
    nexus6
    Poziom 11  
    Posty: 57
    
    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ę?
  • #19 7464200
    nsvinc
    Poziom 35  
    Posty: 2870
    Pomógł: 262
    Ocena: 88
    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"....
  • #20 7464791
    nexus6
    Poziom 11  
    Posty: 57
    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ń :|
  • #21 7524619
    nexus6
    Poziom 11  
    Posty: 57
    Pomocy :(
    
    
    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
  • #22 7524726
    nsvinc
    Poziom 35  
    Posty: 2870
    Pomógł: 262
    Ocena: 88
    Spróbuj tak :)

    
    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?
  • #23 7524812
    nexus6
    Poziom 11  
    Posty: 57
    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

Podsumowanie tematu

✨ Użytkownik poszukuje informacji na temat zasilania i sterowania wyświetlaczem VFD BJ883GNK z mikrokontrolerem Atmega8 oraz układem SC16311. W dyskusji poruszono kwestie dotyczące napięć zasilających dla żarzenia (1,5V do 3V) oraz napięcia sterującego (20V do 30V). Użytkownik zbudował zasilacz impulsowy, który dostarcza odpowiednie napięcia, a także rozważa użycie zewnętrznego RTC do budowy zegara. W odpowiedziach podano, że SC16311 wykorzystuje interfejs SPI do komunikacji, a także zasugerowano, aby do programowania używać języka C. Użytkownik podzielił się postępami w programowaniu, w tym przesyłaniu danych do VFD oraz tworzeniu tablicy znaków do wyświetlania. Wskazano na problemy z typami zmiennych w C oraz na konieczność poprawnego rzutowania typów.
Wygenerowane przez model językowy.
REKLAMA