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



Teraz jest 18 maja 2026, o 13:04


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 27 ] 
Autor Wiadomość
PostNapisane: 13 wrz 2014, o 20:52 
Offline
Użytkownik

Dołączył(a): 15 sie 2014
Posty: 87
Pomógł: 0

Mam kolejny problem związany z poczwórnym wyświetlaczem 7 segmentowym. Korzystam z niebieskiej książki i załączonego na p[łycie kodu źródłowego ale nie korzystam z atmegi 32 tylko 88 i pozmieniałem trochę ustawienia portów i coś mi się wydaje że przez to ten wyświetlacz nie działa jak należy. Mają być na nim widoczne cyfry 1,4,5,9 a w praktyce jest zupełnie inaczej. Wydaje mi się że chodzi o maskowanie wartości i te liczby hexadecymalne, załączam fragmenty kodu:

d_led.h:

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


d_led.c:

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


main:

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


A mianowicie chodzi mi o to:

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


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


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



Wydaję mi się że to przez zmianę portów (korzystam z atmegi 88) jest jakiś problem. Ewentualnie źle zbudowałem układ z tranzystorami(korzystam z płytki stykowej) a może wykorzystuję złe tranzystory PNP(C556B)... Ja raczej obstawiam że jest coś źle z tymi portami i maskowaniem wartości proszę o pomoc bo napotykam co chwilę jakieś problemy i już naprawdę ciężko mi to ogarnąć.
Zmiana nastąpiła z pinów C na D jeżeli chodzi o segmenty i kropkę oraz z Pinu D na C jeżeli chodzi o wspólną anodę. Na portach C jest jest reset i jest ich w atmedze 88 siedem a tych portów D jest osiem. Wydaje mi się coś przez te zmiany nie działa to jak należy
dlatego proszę o pomoc.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 wrz 2014, o 22:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 03 mar 2014
Posty: 580
Lokalizacja: Jastrzębie-Zdrój
Pomógł: 71

Witam,

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


Skoro kolega steruje przez tranzystory PNP to baza spolaryzowana na stan niski przewodzi. Czyli zamiast gasić to zapala wszystkie anody. Trzeba spróbować tak:

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


Następnie spróbowałbym zamiast:
moscow18-1990 napisał(a):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


dać:

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


Jeżeli jest możliwość zmiany tranzystorów na NPN to znacznie ułatwi sprawę ;)

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


Jeżeli gdzieś bredzę lub mam błędny tok myślenia to sorki z góry - powrót z popołudniówki i ta godzina daje po szarych komórkach :)

z Niebieskim pozdRowieniem,
Doman89



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 wrz 2014, o 23:16 
Offline
Użytkownik

Dołączył(a): 15 sie 2014
Posty: 87
Pomógł: 0

Myślałem o zmianie na NPN w każdym bądź razie dzięki za rady sprawdzę je w praktyce zobaczymy co z tego wyniknie...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 wrz 2014, o 17:12 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

Witam
moscow18-1990 napisał(a):
Myślałem o zmianie na NPN

...a jaki masz wyświetlacz - wsp. KATODA czy ANODA ?

Pozdr.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 wrz 2014, o 17:22 
Offline
Użytkownik

Dołączył(a): 15 sie 2014
Posty: 87
Pomógł: 0

Wspólna anoda

------------------------ [ Dodano po: 50 minutach ]

Dalej coś nie gra, rady kolegi nic nie dały nie wiem co dalej...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 wrz 2014, o 20:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

moscow18-1990 napisał(a):
Mają być na nim widoczne cyfry 1,4,5,9 a w praktyce jest zupełnie inaczej.

Dalej coś nie gra, rady kolegi nic nie dały nie wiem co dalej...

A co to oznacza? Nic się nie wyświetla? A może wyświetla się nie to co powinno.

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

Dla wspólnej anody i tranzystorów PNP powinno być
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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

oprócz tego, że włączy dany wyświetlacz i wyłączy pozostałe to niechcący ustawi starsze bity portu do którego podpięte są anody.
Dlatego w tym zapisie
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

jest zastosowane dodatkowe maskowanie, które powoduje nie naruszanie wartości starszych bitów portu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 wrz 2014, o 21:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 03 mar 2014
Posty: 580
Lokalizacja: Jastrzębie-Zdrój
Pomógł: 71

Witam,

Odniosę się do poniższego:

jacekk232 napisał(a):
A ten zapis, który zaproponował kol. doman89
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

oprócz tego, że włączy dany wyświetlacz i wyłączy pozostałe to niechcący ustawi starsze bity portu do którego podpięte są anody.
Dlatego w tym zapisie
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

jest zastosowane dodatkowe maskowanie, które powoduje nie naruszanie wartości starszych bitów portu.


Oto mój kod z zegarka który popełniłem i śmiga pełną parą :) Wszystko na porcie B - Anody od PB0-PB5, PB6 - dioda, PB7 - DS18B20:

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


Wszystko śmiga bez zająknięcia :) Sprawdzone i wykorzystywane w praktyce - nie ma mowy o najmniejszym zakłóceniu ;)

Co do autora tematu, to prosimy o schemat, i ewentualnie krótki filmik co tam się dzieje. Ja akurat oddałem mojemu koledze 4 wyświetlacze 7 segmentowe, więc nie mogę za bardzo zasymulować Twojego układu, więc trzeba krok po kroku analizować kod. Tak więc schemat by się przydał.

z Niebieskim pozdRowieniem,
Doman89



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 wrz 2014, o 22:49 
Offline
Użytkownik

Dołączył(a): 15 sie 2014
Posty: 87
Pomógł: 0

Dobra mam inny pomysł muszę zacząć chyba od całkowitych podstaw. Chciałbym wyświetlić dwie cyfry na wyświetlaczu. Nie chcę używać żadnych przerwań, timerów tylko po prostu wyświetlić cyfrę na dwóch wyświetlaczach. Cyfry mają być różne bo w tej chwili wyświetlają mi się dwie czwórki. Używam dwóch anod mimo że korzystam z poczwórnego wyświetlacza. Do tych przerwań i timerów dojdę ale powoli... Moje pytanie pytanie brzmi: Czy muszę zdefiniować jakąś tablicę żeby wyświetlać RÓŻNE cyfry na poszczególnych wyświetlaczach załączam program jest skromny ale wyświetla dwie czwórki a to już coś. Chcę go powoli rozbudowywać. Proszę o wskazówki... Oto program:

main:

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


i led_proba.h:

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: 19 wrz 2014, o 23:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 03 mar 2014
Posty: 580
Lokalizacja: Jastrzębie-Zdrój
Pomógł: 71

Witam,

moscow18-1990 napisał(a):
Moje pytanie pytanie brzmi: Czy muszę zdefiniować jakąś tablicę żeby wyświetlać RÓŻNE cyfry na poszczególnych wyświetlaczach załączam program jest skromny ale wyświetla dwie czwórki a to już coś. Chcę go powoli rozbudowywać. Proszę o wskazówki...


Kolega tablica znaków musi być jak najbardziej ;) Jak prześlesz na port liczbę, to otrzymasz głupoty. Na port podajesz element tablicy, który ma zakodowane jakie piny mają się zapalić dla danej liczby. Tu masz przykładowo-poglądowy kod z mojego zegarka:

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


Wyświetlenie już cyfry to np.:

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


Do testów to wystarczy, że jeden segment opanujesz, kolejne to już przy multipleksacji wymęczysz.

Jak coś dalej nie jasne to pytaj ;)

z Niebieskim pozdRowieniem,
Doman89


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2014, o 09:18 
Offline
Użytkownik

Dołączył(a): 15 sie 2014
Posty: 87
Pomógł: 0

Czyli muszę użyć multipleksowania nie mogę jednocześnie na pierwszym wyświetlaczu wyświetlić np.1 a na drugim np. 4? Użyłem tej tablicy wszystko działa ale są dwie jedynki na pierwszym i drugim wyświetlaczu. I tak w ogole co to jest to pgm_read_byte?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2014, o 10:02 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

Nie musisz, pod warunkiem, że w uC znajdziesz wolnych 14 pinów (dla dwóch wyświetlaczy, dla trzech to już będzie 21 itd) ;-) Przy multipleksowaniu wystarczy pinów 9 dla dwóch wyświetlaczy, a dla każdego kolejnego tylko jeden pin więcej


Autor postu otrzymał pochwałę

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2014, o 14:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 sty 2014
Posty: 243
Pomógł: 9

Plus jeszcze jedna nóżka jak chce się z kropki skorzystać :)
Ciekawym wg mnie rozwiązaniem jest wykorzystać ekspander wyjść na I2C wtedy wystarczą 2 piny plus piny dla kolejnych tranzystorków, ale to już dywagacje na inny wątek.

_________________
http://www.ate-zbaszyn.eu



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2014, o 14:51 
Offline
Użytkownik

Dołączył(a): 15 sie 2014
Posty: 87
Pomógł: 0

Mam pytanie do jednej linijki kodu którą podał kolega wyżej a mianowicie:

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


a jeszcze bardziej mianowicie o co chodzi w tym indeksie tablicy:

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


Ja sobie zrobiłem taką tablicę mam cztery wyświetlacze już podłączone i wpisuje normalnie w indeksie 0,1,2 i w związku z tym wyświetla się jakaś cyfra na czterech wyświetlaczach. Coś to się chyba z tymi przerwaniami i typem volatile wiąże aczkolwiek ja tym tematem będę się zajmował jutro i chciałbym wypytać co ten indeks oznacza i dlaczego taki jakiś dziwny on?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2014, o 21:11 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Zmienna zahl6 i pewnie też zmienne zahl1-zahl5 to te same zmienne co cy1-cy4 z kodu z BB. Kolega doman89 pewnie miał sześć wyświetlaczy i zmienne przechowujące cyfry do wyświetlenia nazwał sobie zahl zamiast cy.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2014, o 22:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 03 mar 2014
Posty: 580
Lokalizacja: Jastrzębie-Zdrój
Pomógł: 71

Witam,

jacekk232 napisał(a):
Zmienna zahl6 i pewnie też zmienne zahl1-zahl5 to te same zmienne co cy1-cy4 z kodu z BB. Kolega doman89 pewnie miał sześć wyświetlaczy i zmienne przechowujące cyfry do wyświetlenia nazwał sobie zahl zamiast cy.


No "znaki_wyswietlacza" przedłożyłem na polski, o "zahl" zapomniałem, a to po prostu liczba po niemiecku ;) Jedni piszą biblioteki po angielsku, inni co nie znają tego języka piszą np. po niemiecku ;) Sorki za zamieszanie, postaram się następnym razem bardziej poprawić :)

Bierzesz sobie dwie zmienne, które przechowują Twoje dwie liczby np. liczba1, liczba2. I teraz w programie jeżeli chcesz wyświetlać na każdym wyświetlaczu inną liczbę to podajesz np. takie coś:

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 ANODY_WY_x musisz odpowiednio zdefiniować - bez multipleksacji jeden port mikrokontrolera na jeden wyświetlacz. Tak więc kolega szybko pobaw się tymi dwoma cyferkami i opanowuj multipleksację ;), a jak będzie jakiś problem to wal śmiało do nas.



z Niebieskim pozdRowieniem,
Doman89



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 wrz 2014, o 10:36 
Offline
Użytkownik

Dołączył(a): 15 sie 2014
Posty: 87
Pomógł: 0

Chłopcy mam kolejny raz ten sam problem tym razem z ustawieniem timera0 mam atmegę88 i już krew mnie zalewa bo nie wiem czy to moja wina
czy coś z tym eclipsem jest nie tak dam fragment kodu. Jeżeli ktoś mógłby mnie zweryfikować z datasheet i sprawdzić czy zrobiłem to dobrze... :

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


i błędy:
make all
Building file: ../main.c
Invoking: AVR Compiler
avr-gcc -Wall -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega88 -DF_CPU=8000000UL -MMD -MP -MF"main.d" -MT"main.d" -c -o "main.o" "../main.c"
../main.c: In function 'inicjalizacja':
../main.c:69: error: 'OCCR0B' undeclared (first use in this function)
../main.c:69: error: (Each undeclared identifier is reported only once
../main.c:69: error: for each function it appears in.)
../main.c:71: error: 'TIMSKO' undeclared (first use in this function)
make: *** [main.o] Error 1

**** Build Finished ****


a do tego jakieś insekty na pasku wyskakują... Proszę o pomoc bo krew zalewa mnie.... Zaznaczam też że próbowałem tych patentów z rebuild i zmianą workspace i coś to nie skutkuje niczym dobrym....

------------------------ [ Dodano po: 4 minutach ]

No po index -> rebuild insekty to jeszcze znikną ale są te błędy które wkleiłem. Jeżeli ktoś będzie w stanie zweryfikować czy dobrze wyklikałem z datasheet to będę niezmiernie wdzięczny....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 wrz 2014, o 12:21 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Sprawdź dokładnie czy Atmega88 zawiera rejestr OCCR0B i czy w nazwie TIMSK0 nie masz literki "O" zamiast cyfry "0".



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 wrz 2014, o 14:09 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 03 mar 2014
Posty: 580
Lokalizacja: Jastrzębie-Zdrój
Pomógł: 71

Witam,

Poprawne rejestry:
TIMSK0 ( kolega ma w błedzie literkę "O", niech kolega wpisze zero "0").
OCR0B (kolega ma OCCR0B).

z Niebieskim pozdRowieniem,
Doman89


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 wrz 2014, o 14:28 
Offline
Użytkownik

Dołączył(a): 15 sie 2014
Posty: 87
Pomógł: 0

okejjjj teraz gra błedy zniknęły...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 wrz 2014, o 12:34 
Offline
Użytkownik

Dołączył(a): 15 sie 2014
Posty: 87
Pomógł: 0

Piszę procedurę obsługi przerwania i tu ma mam pytanko tym razem do kodu z płyty dołączonej do niebieskiej książki bo czegoś tu nie rozumiem a mianowicie:

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


Chodzi mi dokładnie o cy1 , cy2, cy3, cy4. Sa to zmienne które podobno odwołują się do elementu tablicy i moje pytanko brzmi
W JAKI SPOSÓB TO SIĘ ODBYWA? Nie mógłbym po prostu napisać:

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


A mianowicie odwołać się do poszczególnego elementu tablicy poprzez zwykłe cyfry? Nie rozumiem na jakiej zasadzie te zmienne cy1, cy2, cy3, cy4 odwołują się do elementów tej tablicy... Dlatego pytam bo chciałbym to zrozumieć a nie przyjmować że po prostu ma tak być...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 wrz 2014, o 14:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

Witam
Nie wiem czy dobrze wytłumaczę ale:
w przypadku
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

z tablicy cyfry wyświetlasz ten zestaw segmentów który "wyliczyłeś" jako cy1.
Jeśli cy1 byłoby np.: 8 to wyświetli Ci się cyfra 8; mało tego w każdej chwili możesz to zmienić na np.:5 czy każdą inną wartość w obrębie tablicy. Za każdym razem na wyświetlaczu pojawi się inny znak, a Ty masz dostęp do tej zmiennej cy1
Natomiast dla
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Na wyświetlaczu pojawi Ci się liczba 1 i za Chiny nic z tym już nie zrobisz; no możesz patrzeć i podziwiać :) .
Po prostu pisząc, kompilując i wgrywając program z
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

na stałe każesz uC wyświetlać cyfry 1,2,3,4

Pozdr.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 wrz 2014, o 15:48 
Offline
Użytkownik

Dołączył(a): 15 sie 2014
Posty: 87
Pomógł: 0

okejj wylicza się ale gdzie? Podam kolejny fragment kodu z płyty dołączonej do niebieskiej książki:

cały main:

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


Czy tutaj się "wyliczją" te elementy tablicy i w ogóle co się tutaj dzieje bo nie ogarniam za bardzo:

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


Jeżeli ktoś mi tego gruntownie nie objaśni to nie ukrywam że ciężko mi będzie to zrozumiec. Nie rozumiem trochę tego "wyliczania".
Mam przecież zdefiniowaną tablicę ze wzorami znaków które mają być wyświetlane dlatego to całe zamieszanie jest ciężkie do zrozumienia dla początkującego jak ja...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 wrz 2014, o 16:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 03 mar 2014
Posty: 580
Lokalizacja: Jastrzębie-Zdrój
Pomógł: 71

Witam,

Kolega to ja spróbuję w ten deseń:

Chcesz do zmiennej np. cyfra1 zapisać liczbę 4.

To to dajesz:

cyfra1 = 4;

Ale co to jest liczba 4 dla mikrokontrolera? Mianowice:
00000100 - to jest dla mikrokontorlera liczba 4 (czyli binarnie - jak wiemy każdy komputer działa w oparciu o informację jest sygnał lub go nie ma ;) ).

Tak więc jeżeli do portu np. A przypiszesz liczbę 4, to będziesz miał takie sygnały:
PA0 - 0
PA1 - 0
PA2 - 1
PA3 - 0
PA4 - 0
PA5 - 0
PA6 - 0
PA7 - 0

Tak więc na wyświetlaczu będziesz miał podświetlony jeden segment, który będzie podpięty pod PA2. Więc co Ci będzie mówić taka informacja? Tyle co zegarek od predatora ;)

Dlatego masz tablicę ze zdefiniowanymi znakami, które określają jak mają być piny ustawione, abyś na wyświetlaczu uzyskał 4. Więc do tablicy podajesz zmienną cyfra1 i wtedy pobierasz z tablicy elementów czwarty wzór (bo cyfra1 = 4) i uzyskujesz czwóreczkę ;)
Ważne tu aby elementy tablicy były kolejno ułożone tj.
cyfry[0] - prezentacja bitów aby uzyskać liczbę zero - zapalonych odpowiednich 6 segmentów.
cyfry[1] - prezentacja bitów aby uzyskać liczbę jeden - zapalonych odpowiednio 2 segmentów.

Ty sobie do zmiennej przypisujesz po prostu liczbę, a przerwanie automatycznie sobie ją nijako "dekoduje", czyli przepisuje Twoją zmienną jako konkretny element tablicy.

Mam nadzieję, że nieco rozjaśniłem :)

z Niebieskim pozdRowieniem,
Doman89


------------------------ [ Dodano po: 9 minutach ]

moscow18-1990 napisał(a):

Czy tutaj się "wyliczją" te elementy tablicy i w ogóle co się tutaj dzieje bo nie ogarniam za bardzo:

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


Kolega tu masz trywialny przykład.

Nie wyświetlisz liczby np 2345 na jednym wyświetlaczu, więc masz po kolei:
2345 / 1000 - daje Ci liczbę tysięczną - 2, bo reszta po przecinku jest odcinana.
(2345 - (2*1000))/100 - daje Ci liczbę setną - 3, jak zwykle reszta odcięta.
(2345 - (2*1000) - (3*100))/10 - daje Ci liczbę dziesiętną - 4.
2345 - (2*1000) - (3 *100) - (4*10) - daje Ci liczbę jednostek - 5.

Skąd liczby 2,3,4 w obliczeniach?
Masz w kodzie właśnie zmienną:
d1, d2, d3, które są obliczane w danym kroku, zmienna licznik to przykładowe 2345.

z Niebieskim pozdRowieniem,
Doman89



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 wrz 2014, o 11:14 
Offline
Użytkownik

Dołączył(a): 15 sie 2014
Posty: 87
Pomógł: 0

okejjj czyli ta pętla po prostu "losuje" element tablicy tak i przypisuje do zmiennej np. cy1? Czyli na dobrą sprawę nie muszę robić takiej pętli tylko mogę się odwołać do poszczególnego elementu tablicy? W sumie zajarzyłem ale ciężkie to... ten licznik-- zmniejsza tą wartość 6000 tak? A moj kolejny dylemat to jak działa ten licznik w przerwaniu(odwołuję się do kodu z płyty, mój program ewoluuje wraz z waszymi wskazówkami):

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

'
Nie za bardzo jażę jak zmienia się ten licznik w przerwaniu przecież nie ma tu żadnej pętli... No i czy w ogóle ten licznik jest jakoś "powiązany" z tą petlą while i tym licznikiem równym 6000? Dlaczego przybiera on wartość 1 później 2 itd jak to się dzieje? Każde kolejne przerwanie to powoduje? Ciężki temat...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 wrz 2014, o 20:50 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 03 mar 2014
Posty: 580
Lokalizacja: Jastrzębie-Zdrój
Pomógł: 71

Witam,

moscow18-1990 napisał(a):
okejjj czyli ta pętla po prostu "losuje" element tablicy tak i przypisuje do zmiennej np. cy1? Czyli na dobrą sprawę nie muszę robić takiej pętli tylko mogę się odwołać do poszczególnego elementu tablicy? W sumie zajarzyłem ale ciężkie to... ten licznik-- zmniejsza tą wartość 6000 tak? A moj kolejny dylemat to jak działa ten licznik w przerwaniu(odwołuję się do kodu z płyty, mój program ewoluuje wraz z waszymi wskazówkami):

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

'
Nie za bardzo jażę jak zmienia się ten licznik w przerwaniu przecież nie ma tu żadnej pętli... No i czy w ogóle ten licznik jest jakoś "powiązany" z tą petlą while i tym licznikiem równym 6000? Dlaczego przybiera on wartość 1 później 2 itd jak to się dzieje? Każde kolejne przerwanie to powoduje? Ciężki temat...


Kolega kolejny trywialny przykład :)

Więc jedziemy zmienna licznik = 1 to jest dla uC:
00000001 - to już wiesz, czyli zapalamy anodę wyświetlacza pod np. PA0

Później masz
licznik <<= 1; - czyli przesunięcie bitowe w lewo (co to jest odsyłam do poradnika p. Mirka),
więc licznik = 2, czyli:
00000010,

następnie znów masz przesunięcie i wychodzi:
00000100 czyli licznik = 4 to już zapalasz anodę na pinie PA2.

Oczywiście funkcja którą wykonuje przerwanie jest ściśle powiązana z Twoim programem. Przerwanie co określony czas (dla wyświetlaczy 7-seg przeciętnie 50Hz*liczba_wyswietlaczy) wyrzuca na wyświetlacze Twoje zmienne cy1, cy2, cy3, cy4. Ty zmieniasz je sobie w programie, a przerwanie dekoduje i wyświetla dane na wyświetlaczu.

z Niebieskim pozdRowieniem,
Doman89


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 paź 2014, o 21:32 
Offline
Użytkownik

Dołączył(a): 15 sie 2014
Posty: 87
Pomógł: 0

Dobra zadziałało wyświetla mi różne znaki na wyświetlaczach, timer jest dobrze skonfigurowany, próbowałem zmieniać ten rejestr przepełnienia i zmieniała się częstotliwość wyświetlania w sumie fajnie ale sa rzeczy o które muszę zapytać a mianowicie(na razie pierwsze pytanko jak uzyskam odp to jeszcze ze dwa zadam) :
chodzi o operacje na bitach:

po pierwsze nie rozumiem trochę takiej linijki:

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


i zamieniłem ją na taką:

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


I w moim odczuciu odpowiada ona za pojawienie sie stanu niskiego na wyświetlaczu a nie za wygaszenie wszystkich jaka jest różnica pomiedzy tymi zapisami ten drugi jest całkowicie zrozumiały chyba. Mam np. licznik=1 to bedzie binarnie 0b0000 0001 a skoro mam tranzystor pnp i wspólną anodą to musi "wędrować" stan niski więc negujemy i mamy 0b1111 1110, dobrze rozumuję?

no i w ogóle chodzi mi o operację na bitach w przerwaniu bo w sumie jest to w niebieskiej książce ale mam pewne problemiki o to kod

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


a w szczególności ta szalona linijka kodu jest intrygująca:

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


a więc powiedzmy że punktem wyjścia jest wartość zanegowanego licznika czyli 0b1111 1110. Jak dalej będą wyglądały te operacje na bitach? Przydałoby się żeby jakiś specjalista to rozpisał i objaśnił. Wiem tylko tyle że jest tu maska bitowa mająca na celu "uchronienie przed manipulowaniem" na bitach do których nie są podpięte anody. Przepraszam że tak męczę ten temat ale muszę gruntownie zrozumieć ten temat



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 paź 2014, o 22:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 03 mar 2014
Posty: 580
Lokalizacja: Jastrzębie-Zdrój
Pomógł: 71

Witam,

moscow18-1990 napisał(a):
po pierwsze nie rozumiem trochę takiej linijki:

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



Kolega tu masz iloczyn bitowy, czyli takie coś np:
xxxx0010 (x - jakis stan, ktorego nie ruszasz np. DS18B20, z Anod masz Px1 aktywny)
& 11110000 (binarnie 0xF0 - jedynki są aby nie zmienić stanu, mnożenie cokolwiek przez jeden daje to cokolwiek :D)
------------
xxxx0000 (Taki wynik)

Czyli wygaszasz wszystkie wyświetlacze. Po co to robić? A no po to, żeby nie było tzw. "duszków", czyli lekko jasnych cyfr (np. poprzedniej). Daje to nie fajny efekt wizualny.

moscow18-1990 napisał(a):
i zamieniłem ją na taką:

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


I w moim odczuciu odpowiada ona za pojawienie sie stanu niskiego na wyświetlaczu a nie za wygaszenie wszystkich jaka jest różnica pomiedzy tymi zapisami ten drugi jest całkowicie zrozumiały chyba. Mam np. licznik=1 to bedzie binarnie 0b0000 0001 a skoro mam tranzystor pnp i wspólną anodą to musi "wędrować" stan niski więc negujemy i mamy 0b1111 1110, dobrze rozumuję?


No i tu kolega jak rozbuduje projekt o jakieś dodatkowe peryferia to odczuje dlaczego to jest błąd ;)
Ale już postaram się wytłumaczyć. To co kolega zamienił robi dokładnie to samo (choć w uboższej wersji) co linijka z maskowaniem. Wcześniej wygaszone zostały wyświetlacze, przypisujemy odpowiednie stany na kolejny wyświetlacz i dopiero wtedy go zapalamy. Po to właśnie aby zapobiec tym tzw. "duszkom". Linijka w/w przy okazji przerwie każdą możliwą transmisję, lub zakłóci pracę innych peryferii układu. Bo np. DS18B20 będzie musiał mieć przez np. 60 us stan niski, a kolega w połowie mu zarzuci stan wysoki. I kiszka :)
Czyli podsumowując kolega dał linijkę która wykonuje zupełnie coś innego, niż to było zaplanowane.

moscow18-1990 napisał(a):
no i w ogóle chodzi mi o operację na bitach w przerwaniu bo w sumie jest to w niebieskiej książce ale mam pewne problemiki o to kod

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


a w szczególności ta szalona linijka kodu jest intrygująca:

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


a więc powiedzmy że punktem wyjścia jest wartość zanegowanego licznika czyli 0b1111 1110. Jak dalej będą wyglądały te operacje na bitach? Przydałoby się żeby jakiś specjalista to rozpisał i objaśnił. Wiem tylko tyle że jest tu maska bitowa mająca na celu "uchronienie przed manipulowaniem" na bitach do których nie są podpięte anody. Przepraszam że tak męczę ten temat ale muszę gruntownie zrozumieć ten temat


Kolega tu nie trzeba żadnego specjalisty ;), parę przykładów zrobisz i sam zobaczysz, że to proste.
Tak więc jak zwykle tu kolega ma konsekwencję zabezpieczenia pinów które nie służą do sterowania anodami, a nie chce zmienić ich stanu co by nie zakłócać.

Więc przykład z kosmosu:) :
Na porcie mamy takie dane 0101 0010 (pierwsza czwórka to np. linia SPI, druga to anody Px1 aktywne), licznik nam się zwiększył więc musimy przeskoczyć na Px2, ale stan SPI w danej chwili musi być identyczny więc jedziemy z obliczeniami:

1. (ANODY_PORT & 0xF0)

0101 0010 - ANODY_PORT
&1111 0000 - 0xF0
-----------
0101 0000 - Wynik 1

Tu mamy maskę, aby nie zakłócić SPI, co widać, że pierwsza czwórka bitów jest nie ruszona.

2. (~licznik & 0x0F)

0000 0100 - ~licznik
&0000 1111 - 0x0F
------------
0000 0100 - Wynik 2

Od razu wspomnę bo we wcześniejszych postach jakiś kolega wypomniał, że nie mam tego obliczenia. Jak widać, który z czterech wyświetlaczy by nie był opisany w liczniku to ten iloczyn nic nie wnosi :)

3. (ANODY_PORT & 0xF0) | (~licznik & 0x0F)

0101 0000 - Wynik 1
|0000 0100 - Wynik 2
------------
0101 0100 - Wynik zapisywany do ANODY_PORT

Tak więc kolega widzi, że nastąpiło przesunięcie wyświetlacza, a dane na SPI nie ruszone :) Taki to ma cel.

z Niebieskim pozdRowieniem,
Doman89



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

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