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



Teraz jest 19 kwi 2024, o 09:59


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
Autor Wiadomość
PostNapisane: 9 lis 2011, o 22:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

Witam

Piszę ponieważ mam dylemat ..
Problem polega na tym, że zwykle do kodowania czy zmiany konfiguracji programu używałem/używam
typowych przełaczników listwowych zwanych DIP SWITH, każdy wie jak takie ustrojstwo wygląda prawda??

Stosuje w tedy kodowanie 4/6/8 bit czyli odpowiednie ułożenie switchy wybiera konfiguracje programu
np:

używam 4 pinow procka dla 4 bitowego kodu DIPSwitch mam do dyspozycji parę kombinacji :

0000
0001
0011
0111
1001

itd ...

Sprawa prosta programowo do zrealizowania zero problemu z wykonaniem itd.

Więc dlaczego piszę ??

Ano dlatego że ze wzgledu na rozmiar urządzenia, i mały procek M168 oraz konieczność użycia 16 wariantów
konfiguracji programu, jedyną możliwością jest użycie obrotowego dipswitcha pracującego w trybie hexagonalnym
i tu mam problem ...

Jak wspomniałem wymagany do realizacji projektu jest ustrojstwo hexagonalne:
Obrazek
które wygląda tak jak na fotce wyżej ,
Tu jest nota ustroju z której jasno wynika tryb pracy switcha :
http://www.te.com/commerce/DocumentDelivery/DDEController?Action=showdoc&DocId=Customer+Drawing%7F1825008%7FA4%7Fpdf%7FEnglish%7FENG_CD_1825008_A4.pdf%7F1825008-4


I tu mały opis działania dla chętnych pomocy w rozgryzieniu ustrojstwa:
- cały swith ma 8 wyprowadzeń
2 z nich to wejście oznaczone w tabelce jako "C" tu podajemy stan GND lub VCC
zależnie od potrzeby
- pozostałe 4 to wyjścia kodu hex gdzie pojawiają się nam stany zgodnie z tabelką
gdzie X to 1 a 0 to poprostu brak stanu ustalonego (jakby noga wisiała w powietrzu)


I tu teraz pytanie jak to ugryźć w "C" dla AVR ??
Chodzi o np. uzyskanie napisu na terminalu lub LCD odpowiadającemu wyborowi na RDSW

* RDSW -- Rotary Dip Switch

--- odrazu powiem ze kombinowanie z switch case mija się z celem
probowałem konwersji hex ASCII i też nic mi to nie dało

Z 10 pozycyjnymi RDSW nie mam problemu , ale one pracuja w kodzie BCD ,
w zwiazku z czym próbowałem konwersji HEX -> BCD z mizernym skutkiem

I w związku z tym pytam tu bowiem już mi brakło pomysłów , nie podaję kodów źródłowych
dlatego, że chciałbym aby rozwiązanie powstało nie jako od zera bez powielania moich nawyków
i błedów .

No i czekam na propozycje ugryzienia problemu.

UPS... Wkradł się bład w opisie działania RDSW --
mianowicie żle opisałem , a powinno być tak :

Obrazek

piszę tu bo to moze wpłynąc na ocenę działania

a teraz jasno wynika ze X = 1 a 0 = 0 w tabelce .

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Ostatnio edytowano 9 lis 2011, o 22:57 przez SunRiver, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lis 2011, o 22:24 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27224
Lokalizacja: Szczecin
Pomógł: 1041

Ale możesz podać przykład o jaki napis na LCD albo na terminalu chodzi ? tzn w jakiej postaci chcesz to mieć ? w postaci liczby HEX ? czy dziesiętnej ? czy jeszcze jakoś inaczej ? Albo może ja czegoś jeszcze nie zrozumiałem do końca?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lis 2011, o 22:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

Mirku np zgodny z wybranym na RDSW -- masz w tabelce 0-9 A-F :)

Chodzi o powiazanie wskazania rotora z tym co się wyswietli gdziekolwiek ....

np. wybrałem B więc zgodnie z tabelką uzyskam na wyjściach kod 0D w HEX
co z kolei powoduje ustawienie na np. PB1-4 ustawienie 1101

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lis 2011, o 22:59 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27224
Lokalizacja: Szczecin
Pomógł: 1041

Ja przepraszam, bo po całym dzisiejszym dniu mogę być zakręcony. Co do tabelki i pierwszej części pytania to jak dla mnie "mucha nie siada" ;) .... ale .... hmmm teraz jeszcze bardziej nie rozumiem i proszę o wyrozumiałość dla mnie ;)

piszesz, że gdy wybierzesz B to uzyskasz na wyjściach kod 0D w HEX - ale jakim cudem? tzn zaraz - może ustalmy właśnie jak go np podłączamy, czy piny 1,2,4,8 podłączasz np kolejno do bitów 0,1,2,3 jakiegoś portu ??? czy odwrotnie ? bo nijak nie mogę zrozumieć dlaczego wybranie B daje ci 0x0D ??? przecież to powinno dać albo 0x0B albo 0x04 po zanegowaniu. (czy może właśnie wyjścia RSDW 1,2,4,8 łączysz z bitami 1,2,3,4 jakiegoś portu?)

ale abstrahując od powyższego - czy np w efekcie końcowym chcesz uzyskać na LCD np jakiś "napis1", napis2",..... , "napis16" ???? czy wystarczy właśnie że pokaże się sam kod HEX, np 0x0B ????

na prawdę sorki jeśli coś mieszam za mocno - ale jak nie zrozumiem po kolejnym twoim wyjaśnieniu - to wtedy spróbuję to przeczytać dopiero jutro ;) tymczasem czekam na wyjaśnienie - może jeszcze dzisiaj

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lis 2011, o 23:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

Sprawa jest prosta mamy :

mamy dwa wejscia C - sygnałów GND i VCC
oraz 4 wyjscia (4bity) rotor ma oznaczenie hexagonalne czyli 0123456789ABCDEF

dla wybranego rotorem wskazania B układ na wyjściach 1,2,4,8 bedzie obrazowany przez stany
odpowiednio 1101 binarnie co w hexie jest równe 0D dlatego dla B dostaniemy 0D
to tyle co wynika z tabelki

podłaczenie jak updatowałem wyżej czyli wejścia C po jednym na VCC i GND
a PINY 1,2,4,8 do portów mikrokontrolera np PORTB bity 4,5,6,7 czyli PB4 , itd przez rezystory 220om

i nparzykład na tej podstawie chcę wyswietlić np wybrane B na rotorze :)

to tylko przykład teoretyczny bo układ jak napisałem to ma służyć docelowo wybieraniu 16 mozliwych ustawień programu , ale utknołem właśnie na czytaniu tego wrednego hex obrotowego ,
zaczynam się zastanawiac czy czasem jakoś źle go nie potraktowałem bo przeca uzywałem z powodzeniem mniejszych braci mających 10 pozycji tyle że one generowały na wyjściu BCD

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lis 2011, o 23:57 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27224
Lokalizacja: Szczecin
Pomógł: 1041

SunRiver napisał(a):
podłaczenie jak updatowałem wyżej czyli wejścia C po jednym na VCC i GND
a PINY 1,2,4,8 do portów mikrokontrolera np PORTB bity 4,5,6,7 czyli PB4 , itd przez rezystory 220om


No to może jednak tutaj kolega się myli ? Już mówię o co chodzi. Bo jeśli dla ciebie ustawienie pozycji B na rotorze to wartość 0x0D to by oznaczało, że pozycja E na rotorze to wartość 0x07 tak ??? a np pozycja 1 to wartość 0x08 tak ??

No to nawet nie można powiedzieć, że to zależy "jak na to spojrzeć", bo to przecież zależy tylko i wyłącznie "jak to podłączyć".

Spójrz może na ten rysunek poniżej czy nie mam racji - że punkt widzenia zależy od podłączenia ? ;)

Obrazek

dlatego jeśli podłączysz sobie wg tego sposobu po prawej to masz ładnie po kolei stany na wyjściach rotora zgodne z kodami, wtedy pozycja B to będzie kod 0x0B , pozycja E to będzie kod 0x0E (tzn tak mi się wydaje - bo nigdy takich rotorków nie miałem okazji używać)

a skoro tak ? no to wystarczy sobie już bez żadnego problemu zamienić wartość binarną odczytaną na pinach portu i zamienić ją na postać HEX. Jeśli podłączysz do jednak do 1 - PB4, 2 - PB5, 4 - PB6, 8 - PB7

no to sam zapewne już widzisz że przed konwersją BIN na HEX wystarczy zrobić sobie przesunięcie:

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


i teraz jakąś funkcją wywalić na LCD, np:

Kod:
lcd_put_string( bin_to_hex( val ) );


albo zrobić sobie tablicę stringów:

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


i potem:

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


dobrze mówię ?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lis 2011, o 15:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

No tak Mirku coś w tym jest , ale jakie ma to znaczenie jakimi portami czytam skoro odczytana wartośc z pozycji przykładowej "B" = 1101 wiec czy podepne to tak czy inaczej ta wartość nie ulega zmianie
bo czytam z rotora 1101 , chyba sam się już zaplątałem i już widzę gdzie popełniłniam bład. I przez traktowanie go na siłę jako hexagona stracvilem wątek :)


faktycznie powinienem czytać go odwrotnie wtedy pod pozycją "B" mam 1011 a nie 1101 co z koleji wzięło się z używania 10 pozycyjnych z kodowaniem BCD i teraz pokutuje.

W istocie fizycznie ten sw wystawia przecierz stan binarnie i tu łatwo się z nim rozprawić :)
a ja oczywiście zamotałem się na konwersji konwersji z postaci bin na BCD , BCD na HEX i HEX na ASCII

ot widzisz na starość człowiek głupieje :)

Dzieki za pomoc. Bo sam się na siłe zamotałem :)

Oczywiście jak masz jakiś ciekawy pomysł lub ktos inny z tym oto ustrojem to zapraszam do pogawędki :)

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lis 2011, o 00:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

Idąc dalej teraz Switha widze w innym świetle i traktuje go jak powinienem czyli :
czyli poprostu jako zwykły 16 pozycyjny coder binarny :)

a więc mniej więcej obsługę widzę tak:
używając bit maskingu:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


oczywiście w tej chwili niema znaczenia prawidłowość bo chodzi mi o zobrazowanie jak się za to coś zabrać

Jak to działa?

Bit masking jest techniką, w którym binarne operacje są używane do pobierania danych. Wykorzystuje proste algorytmy Boole'a do ustalenia, czy konkretna wartość znajduje się w zestawie bitów. "wynik = X & wartość" jest to fragment procedury maskowania. Zmienna "Wartość" reprezentuje "zdemaskowane" dane odczytane z przełacznika, "X" jest maską, a zamaskowane dane reprezentuje zmienna "wynik". Maskowanie Bitów jest procesem analizy związanej z bitami i zbieraniem wyników. Odbywa się to za pomocą operacji logicznych i operatora AND. W efekcie jeśli zamaskowane dane są takie same jak maska , a maska jest obecna jako podzbiór danych następuje porównanie.

Przykładowo:
Analiza wartości dla 7 pozycji SWitcha -- sprawdzenie czy jest aktywny

Kod:
0111   wartość binarna odczytana przez mikrokontroler
1000   maska  określająca pozycje 7 reprezentujaca SW7
-------------
0111   wynik  0x07  włacznik aktywny na pozycji 7

 

hmmm no mam nadzieje ze nie zamotałem zabardzo
:)

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lis 2011, o 01:44 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27224
Lokalizacja: Szczecin
Pomógł: 1041

Wiesz ... obsługę to można zrobić na miliard dwieście tysięcy sposobów, w zależności od potrzeb ;) .... ja jednak nie za bardzo jakby nadal widzę tego co chcesz uzyskać - tzn nie widzę całości/celu .... dlatego ciężko mi np coś jeszcze innego zaproponować czy wnieść do dyskusji.

Tzn np nie rozumiem po co ci aż tyle zmiennych tych chkDipX ???? skoro masz tylko jeden rotor i możliwa jest tylko jego jedna wartość przecież.

przecież po odczycie wartości portu (zakładając, że rotor podłączony jest do najstarszych bitów)

Kod:
uint8_t chkDip = PINB >> 4;


masz od razu w takiej jednej zmiennej wartość binarną wybraną przez tenże rotor (wartości od 0 do 15)

więc teraz gdybym chciał sprawdzić czy aktywna jest wartość 7 to wystarczyłby warunek:

Kod:
if( chkDip == 7 ) .....


albo wczytanie do innej zmiennej wartości true lub false:

Kod:
wartosc = chkDip == 7;


i wtedy wartosc = 1 (true) jeśli rotor jest w pozycji 7 albo wartosc = 0 (false) jeśli jest w innej pozycji.

No chyba że ty go chcesz użyć właśnie w jakimś takim celu o jakim ja nie mam pojęcia? ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lis 2011, o 11:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

Masz racje Mirku troche zamotałem ale faktycznie wydaje mi się iż użycie algorytmu Boole'a ma sens
choć szukam szybszego rozwiazania, które by pozwalało odczytać stan switcha porównać, odczytaną
wartość z maską i przekazać tą informacje do programu , który wykona w zależności od wartości określonej przez powyższe .... wykonać przypisane procedury:)

---------
a teraz przedstawie kawałek układanki :)

Obrazek

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



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: 10 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 6 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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO