Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 8 kwi 2026, o 10:28


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 17 ] 
Autor Wiadomość
PostNapisane: 1 lut 2014, o 00:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

Witam, ogarnąłem multipleksowanie, rejestr przesuwny (jakie to proste...) i w sumie zaczynam pisac testowy program.

W Eclipse przedstawia sie to tak:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


litery.h

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Ostatnio edytowano 1 lut 2014, o 18:32 przez Atmegowiec, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2014, o 01:14 
Offline
Nowy

Dołączył(a): 27 lis 2013
Posty: 23
Lokalizacja: Southampton
Pomógł: 2

myślę, że powinieneś troszkę rozwinąć swój problem bo dla wielu osób to teź późna pora :) a tak co mi przed snem przychodzi na myśl to sprawdzenie ustawienia kolejności bitów, bo może wysyłasz go poprostu jako odbicie lustrzane a wpływ na to może mieć pomieszanie kolejności bitów wejściowych LSB z MSB, sprawdź obsluge w swoim procku. Napisz co to za rejestr :) Choć nawet jak jest to seria 74HC595 to może poprostu masz tak, że nóżka wyjściowa najczęściej nazywana jako A może jest zalutowana jako pierwsza pozycja od dołu :) (oj, ilerazy można to edytować, godzina taka,że sam czytam swoje bazgroły i już też się mieszam, Chodzi o taką rzecz, że nóżka odpowiedzialna za odebranie pierwszego bajtu zalutowana jest jako dolna linia)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2014, o 17:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

doszłem juz do rozwiaania problemu - pozmieniałem troche piny. Nie mneij jednak spójżcie na kod, a głownie na funkcję SendChar(). Wysyła ona poszczegolne elementy tablicy "A". No włąsnie tyle ze chciałbym by tam mozna była wstawic dowolną znak z dowolnej tablicy liter np. B, C i td. Nie wiem zabardz jak mam to przekazać do funkcji bo gdy dam zmienna jakąs np. letter i dopisze do niej [] to oczywiscie nie wykrywa mi takiej tablicy. wiec jak mozna zrobic zeby z teblicy stringa "TEST" pobierało kolejno litery i przekazywało je do funkcji SendChar();



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2014, o 18:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

stworzyłem sobie taka tablice tekstową:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


w założeniu ma byc tak zeby każda literka wyrazu była osobną wartoscia w tablicy. Potem zapisuję poszczególny element tego stringa i wysyłam na matrycę
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Naniosłem poprawki do kodu, m. in do SendChar() moze byc wysyłana wartość, jednakże nie pojawia sie literka a na wyświetlaczu. Zdefiniowałem sobie juz wiecej "tablic literkowych" tak jak tablice znaku "A" .

Dziwne gdy ujmę zmienna d w 'd' i tak wysle do funkcji Send char('d') to cos tam majaczy ale to chyba tak przypadkowo sie wyswietla. Niby jest A + kilka dodatkowych kropek. hmm, jak powienienem wykonac takie odwoływanie sie do poszczególnych znaków w tablicy string[] ?.

do tego wszytskiego Eclipse wywala taki waring:

Kod:
/main.c:44:2: warning: initialization makes integer from pointer without a cast [enabled by default]
../main.c:44:2: warning: (near initialization for 'string[0]') [enabled by default]
../main.c:44:2: warning: initialization makes integer from pointer without a cast [enabled by default]
../main.c:44:2: warning: (near initialization for 'string[1]') [enabled by default]
../main.c:49:3: warning: passing argument 1 of 'SendChar' makes pointer from integer without a cast [enabled by default]


PS2 Doc zegos doszłem:

Gdy
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
zamienię na
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Wtedy działa idealnie.... ale no jak... wyświetlając całe zdanie mam każda literkę oddzielać przecinkiem? okropnie niewygodne to. Moza to jakoś zniwelować?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2014, o 22:50 
Offline
Nowy

Dołączył(a): 27 lis 2013
Posty: 23
Lokalizacja: Southampton
Pomógł: 2

ok, załóżmy, że masz tablice ze zdefiniowanymi literkami char TablicaLiterek[21]=... i po kolei masz zdefiniowane litery A, B, C, D (ich odpowiedniki graficzne znaczy się :) ) Teraz aby wyświetlić literkę A to musisz wyświetlić pierwszy element z tablicy prawda? No właśnie :) Tylko jak to zrobić gdy chcesz wyświetlić napis np: "ABCD" ? No tak, tu przydaje sie książeczka(Nie wiem czy w P.Mirka książce to się znajduje czy nie bo nie pamiętam ale...) Aby wyświetlić Pierwszą pozycje z tablicy gdy w zmiennej tablicowej takiej char Napis[3]={"ABC"}; musisz odjąć od liczbę która reprezentuje początek alfabetu :) Zakładając, że twoja tablica ze zdefiniowanymi znakami graficznymi liter posiada tylko duże litery, możesz to rozwiązać tak:
for(uint8_t i=0; i<3; i++){
sendChar(Napis[i]-65); // 65 decymalnie to litera A w tablicy ASCII
}
teraz za każdym obrotem pentli procek będzie widział to mniej więcej tak
sendchar(65-65); //== 0 czyli pirtwszy element tablicy z definicją znaku
sendchar(66-65); // ==1
sendchar(67-65);// == Zgadnij ile :)


ewentualnie widzę że używasz sendChar(A) więc akurat w twoim wypadku to by było
for(uint8_t i=0; i<3; i++){
sendChar( TablicaZLiterkami[Napis[i]-65] ); // 65 decymalnie to litera A w tablicy ASCII
}
Pisze odręcznie więc kod może wymagać drobnej poprawki lub może gdzieś zdarzyć się literówka :)
Na przyszłość zapraszam do zapoznania się z kilkoma różnymi książkami o języku C, choćby z tego powodu, że każdy autor ma inne założenia :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2014, o 23:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

hej czyli zrozumiałem ze myusiałbym utworzyc jeszcze dodatkową tablice ze wszytskim tablicami poszczegolnych znaków?
z dopiero z tego zbioru znaków odejmowac i wybierac liczbę?.

Bo widzisz ja kazda literkę czy znak mam jako osobna tablicę.
Nie wiem czy dobrze mysle ale jakbym miał jakies zdanie to chyba by takie odejmowanie strasznie zagmatwało sprawe?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2014, o 23:21 
Offline
Nowy

Dołączył(a): 27 lis 2013
Posty: 23
Lokalizacja: Southampton
Pomógł: 2

No tak, taka definicja może wyglądać tak:
char TablicaZnakow[][6]= {
{(0),(0),(0),(0),(0),(0)}, // Litera A
{(0),(0),(0),(0),(0),(0)}, // Litera B
//....
{(0),(0),(0),(0),(0),(0)} // Litera Z
};


Już nie będe ty definiuował znaków tylko wstawiłem zera ale wiadomo o co chodzi :) Takie rozwiązanie powinno dać lepszy skutek niż definiowanie znaków w osobnych tablicach bo do elementu tablicy łatwiej się odwołać niż do każdej literki jako osobnej zmiennej, twoje rozwiązanie też na upartego mogło by być ale to masochizm bo taka petla wyglądała by wtedy mniej więcej tak:

uint8_t Numer=0;
for(uint8_t i=0; i<3; i++){
Numer= Napis[i]-65;

if(Numer == 0 )sendChar(A);
if(Numer == 1 )sendChar(B);
if(Numer == 2 )sendChar(C);
if(Numer == 3 )sendChar(D);
// ...Po bardzo dużej ilości ifów
if(Numer == 21 )sendChar(Z);
// uffff, koniec ifów :)
}
Sam chyba widzisz, że pracy multum a efekt.. no cóż :)


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lut 2014, o 00:11 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

no ok zrozumiełem to w sumie racja dobry pomysł, ale popatzr chce wstawic kropkę... i co teraz ? mam w tablicy przykladowo opisane literki A,B,C i kropkę. Kropka ma zapis w ASCII 46. wiec 46-46 = 0 wiec musiałby byc pierwszym elementem w tablicy. ipotem mam litery A, B, C. 'A'-42 = 65-42=23 . czyli program by poleciał na 23-cie miejsce w tablicy, a takiego miejsca przeceiz nie ma. Czyli musiałbym z koleji zdefiniowac po koleji wszytskoe znaki od "." do "C" aby metoda odejmowania działała, dobrze to zrozumiałem? Na upartego jest ok, ale no ja sie uparłem, chce miec tylko kropkę i A,B,C i zadnych literek wiecej w tabeli znaków ;] ? co w tym wypadku ?.

Twoja metoda mi sie podoba, tylko musiałbym elementy w tabeli rozpisać w HEX-sie :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lut 2014, o 00:32 
Offline
Użytkownik

Dołączył(a): 17 sty 2013
Posty: 327
Lokalizacja: Białystok
Pomógł: 14

możesz zrobić tak jak napisałeś i if'y będą wyglądać tak:
if(Numer == 0 )sendChar(kropka);
if(Numer == 23 )sendChar(A);
if(Numer == 24 )sendChar(B);
if(Numer == 25 )sendChar(C);



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lut 2014, o 00:51 
Offline
Nowy

Dołączył(a): 27 lis 2013
Posty: 23
Lokalizacja: Southampton
Pomógł: 2

JEżeli liczba takich dodatkowych znaków jest niewielka to możesz je zdefiniować na końcu takiej tablicy (za "Z") i odwołać się już w pętli za pomocą ifa :) a co to znaczy niewielka? To znaczy taka która nie spowoduje przerostu formy nad treścią :), jak będziesz definiował np 30 kolejnych niestandardowych znaków czy więcej które mają się nijak to kolejności przedstawionej w poprzednich moich postach to skolei musisz jeszcze jakieś inne podejście sobie wymyślić :) ja dałem tylko drobniutki przykład :)
Apropo, odpowiadając na kolejne pytanie które może się narodzić "dlaczego na końcu" a no dlatego, dość często korzysta się z działań na znakach ASCII a liczba 65 (41hex) jest poprostu szybką podpowiedzią gdy zajrzysz do kodu za pare miesięcy i zobaczysz odejmowanie od 65 ew. 0x41 to odrazu zoriętujesz się, że chodzi właśnie o ustalenie początku alfabetu a patrząc na liczbe powiedzmy 71 czy inną w zależności ile takich znakow miałbyś mieć na początku to będziesz musiał spędzić jakąś ilość czasu aby zaskoczyć o co chodziło tobie samemu gdy (kiedyś kiedyś...) pisałeś dany kawałek kodu :) Dobra zasada to pisać kod czytelnie i z zachowaniem zasad logiki aby jak to jakiś czas temu panowie bodajże z PO czy PISu mówili "By żyło się lepiej" :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lut 2014, o 19:57 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

Hej, rozwiązałem problem z tablicą według pomysłu kolegów i tak ponizej mamy fragment:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


myślę jak uzyskać przewijanie tekstu, próbowałem z przesunięciami bitowymi lecz to chyba nie to ;/ myślałem ze tekst będzie się przewijał tak jak u Mirka w poradniku o 74hc595 dioda ale zmieniają się litery tzn. schemat danego znaku się zmienia, a nie ze on się przesuwa o jeden rzad w lewo.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lut 2014, o 20:54 
Offline
Nowy

Dołączył(a): 27 lis 2013
Posty: 23
Lokalizacja: Southampton
Pomógł: 2

Ok, pomyślmy na przykładzie twojej literki A :)
00001100
00010010
00011110
00010010
00010010
czyli masz tablice znaki[][5].
więc aby przesunąć tą literke o 1 w lewo powinieneś przesunąć każdy wiersz o 1 w lewo i dopiero wyświetlić literke. Wydaje mi się, że to powinno wyglądać mn. tak:

Piszę w procesorze tekstu a nie w IDE więc kod może wymagać poprawki/ literówki
uint8_t TmpLiterka[5]=0;
for(uint8_t i=0; i<5; i++){
TmpLiterka[i]=Znaki[65][i]<<=1;
}
showChar(TmpLiterka);



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 lut 2014, o 17:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

no jak przejzałem ten kod to na logike powiniend ziałąs: powołujemy tymczasowa tablice wniej umeiszczany literke po przenunięciu.. wyswietlamy ją, tylko z ecos nei działa, moze zle przekazuje tą tymczasowa tablicę do SendChar()?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 lut 2014, o 19:37 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

Ok, wieć z pomocą uzytkowików kiterka sie ruszyła.. ciekawi mnie jak np. zrobic by przesuwał sie cały string . Cos mi swita ze trzeba by było utworzyc jakis system odniesienia pozycji, np. takie cos jak w LCD funkcja lcd.locate(). tylko jak to rozwiązac przy takiej matrycy ? Cos mi tez sie mysli o buforze tylko nie wiem co...

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 lut 2014, o 20:54 
Offline
Nowy

Dołączył(a): 27 lis 2013
Posty: 23
Lokalizacja: Southampton
Pomógł: 2

niewiem, może spróbuj dać zmienną statycazną z. Z tak krótkiego kodu nie bardzo co widze :( ale chyba rzeczywiście o to chodzi, przynajmiej tak wynika z fragmentu który pokazałeś



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 lut 2014, o 21:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

tanwel napisał(a):
niewiem, może spróbuj dać zmienną statycazną z. Z tak krótkiego kodu nie bardzo co widze :( ale chyba rzeczywiście o to chodzi, przynajmiej tak wynika z fragmentu który pokazałeś


no dałem static i wałasnie działa. Tylko mysle jak by rozwiazac przesuwanie całej tablicy zeby wyswietliło literki jedna obok drugiej i przesuwanie. Hmmm..



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 lut 2014, o 21:40 
Offline
Nowy

Dołączył(a): 27 lis 2013
Posty: 23
Lokalizacja: Southampton
Pomógł: 2

sposobów jest napewno multum :) pokombinuj troszkę :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 17 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO