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



Teraz jest 1 gru 2024, o 08:28


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 18 ] 
Autor Wiadomość
PostNapisane: 26 lut 2012, o 15:21 
Offline
Użytkownik

Dołączył(a): 26 lut 2012
Posty: 82
Pomógł: 0

Witam,

Nazywam się Robert, postanowiłem zająć się programowaniem uC gdyż na studiach liznąłem trochę 8051 i mi się spodobało:) Poza tym pisanie w C na komputerze i wyświetlanie wyników w konsoli nie jest tak efektowne;)

Posiadam książkę Pana Mirosława gdyż jest chyba najlepszą pozycją dla początkujących dostępną na rynku.
Nie mam zestawu uruchomieniowego, poszczególne projekty wykonuję na breadboardzie i płytce uniwersalnej do lutowania.

Utknąłem na multipleksowaniu wyświetlaczy 7 segmentowych. Posiadam 3szt ze wspólną anodą, dekoder BCD->7SEG, tranzystory BC556 i Atmega8.
Kod do obsługi pisałem z książki, dopasowując go do tego co mam na daną chwilę zmontowane.

Problem jest taki, że po włączeniu zasilania każdy z wyświetlaczy mignie po kolei na bardzo krótki okres czasu, po czym na wszystkich pojawia się cyfra "3".

Proszę o nakierowanie mnie gdzie popełniam błąd.

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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lut 2012, o 15:49 
Offline
Moderator
Avatar użytkownika

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

Już chciałem pisać z prośbą aby nie umieszczać kodów bibliotek z książki na forum - no ale kolega pozmieniał wszystko do własnych potrzeb, czyli podjął fajną próbę walki z dostosowaniem kodu do swoich potrzeb - SUPER! ;) to rozumiem.

Ale teraz do rzeczy, gdybym ja miał pomóc to musiałbym zobaczyć dokładnie schemat jak kolega to sobie popodłączał - bo niestety bez schematu tylko z opisu to ciężko mi sobie zawsze to skojarzyć w głowie - dlatego prosiłbym o uzupełnienie pytania właśnie o dokładny schemat OK ? ;)

_________________
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: 26 lut 2012, o 16:46 
Offline
Użytkownik

Dołączył(a): 26 lut 2012
Posty: 82
Pomógł: 0

Zrobienie schematu na 12" X61s używając tylko trackpointa było nie lada wyzwaniem:)

Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lut 2012, o 17:01 
Offline
Moderator
Avatar użytkownika

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

1. nie robisz na początku przerwania wygaszania wszystkich anod wyświetlaczy - nabawisz się duszków (szkoda że to pominąłeś)

2. najpierw powinieneś wystawić dane na katody wyświetlaczy (po uprzednim ich zgaszeniu jak w książce) a dopiero potem zapalać po kolei anody - robisz to zmienną licznik

3. Niestety licznik porusza się tak jak w książce po najstarszych bitach portu czyli 7,6,5 - a zwróciłeś uwagę do których pinów ty masz przypięte anody ? ;) ..... to jest moja podpowiedź ;)

teraz popróbuj wziąć to wszystko pod uwagę i działaj ;) jak coś to dalej pytaj - wszystko ci wyjdzie tylko pamiętaj o punkcie 1-szym bo ludzie go bagatelizują a potem narzekają na duszki

aha najważniejsze - czy korzystasz z kodów na DVD ??? czy korzystasz z Eclipse ??? czy oglądałeś lekcje VIDEO ?

_________________
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: 26 lut 2012, o 17:41 
Offline
Użytkownik

Dołączył(a): 26 lut 2012
Posty: 82
Pomógł: 0

Pisząc kod czytam po prostu książkę i z każdą stroną dopisuję co mi jest potrzebne, dopiero jak nie działa jak należy to zerkam w listingi z płyty i szukam różnic.
Korzystam z Eclipse, nie oglądałem jeszcze lekcji video.

Porty poprawione, nie wiem dlaczego założyłem, że to ostatnie bity;)
Wygaszanie zrobione, maskowanie (co prawda po łebkach, bo kosmetyka na koniec) też.

Na daną chwilę dalej mam same "3" na wyświetlaczach.

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: 26 lut 2012, o 19:42 
Offline
Moderator
Avatar użytkownika

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

Jeszcze nie wiem dlaczego są trójki na wyświetlaczach nie mniej jednak teraz już licznik ładnie poprawiony.

Ale niestety nie poprawione jest maskowanie :( , które na pewno będzie bruździć w kodzie - drobna podpowiedź jeśli chcesz:

spójrz na linię:

Kod:
PORTC = (PORTC & 0xF0);


ona służyła do wygaszenia 4 najstarszych bitów, a u ciebie - anody jak zauważyłeś już słusznie nie są na 4 najstarszych bitach prawda ? ;) więc tu też trzeba zadziałać ... a skoro tu no to i całe maskowanie już przy zapalaniu poszczególnego wyświetlacze też jest złe.... u ciebie ta linia powyżej powinna wyglądać jak ???

Kod:
PORTC = (PORTC & 0x38);


zgodzisz się ? .....

PS jak kolejny raz będziesz dawał kod dłuższy niż 2-3 linijki to postaraj się umieszczać go w znacznikach syntax = c OK ? Masz tam na górze takie pole które pozwala wybrać nawet język C i samo wstawi znaczniki po zaznaczeniu kodu.

_________________
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: 26 lut 2012, o 20:00 
Offline
Użytkownik

Dołączył(a): 26 lut 2012
Posty: 82
Pomógł: 0

Wyłączyłem maskowanie, żeby skupić się na samym wyświetlaniu. Podałem stany bezpośrednio.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Teraz mam same "7" chociaż patrząc na plik led.h powinienem mieć "4"
Kod:
#define C1 _BV(PB2)
#define FOUR1 PORTB |= (C1)


Wygląda na to jakby uC włączał kolejne bity nie wyłączając poprzednich:
Kod:
#define SEVEN1 PORTB |= (A1 | B1 | C1)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lut 2012, o 20:05 
Offline
Użytkownik

Dołączył(a): 26 lut 2012
Posty: 82
Pomógł: 0

I tym sposobem sam sobie odpowiedziałem:)

Problem tkwił w zerowaniu pinów uC podczas wywołania przerwania, w listingu z płyty nie ma takiego czegoś, u mnie pomogło.

Prawidłowy kod:

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: 26 lut 2012, o 20:41 
Offline
Moderator
Avatar użytkownika

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

No po to ci dałem podpowiedź żeby pokazać że źle wyłączasz wszystkie wyświetlacze na czas dokonywania zmian na segmentach.... tym

PORTC = (PORTC & 0xF0);

a to w zupełności wystarcza do ich wygaszenia....

nie widzę teraz twoich makr ALL_LED_OFF - ale jeśli robisz to przez wygaszenie segmentów to źle - powinno się wygasić poprzez zdjęcie napięcia ze wspólnych anod

potem dokonać ustawień nowego stanu na segmentach

a na końcu odpalić kolejny wyświetlacz poprzez włączenie odpowiedniej anody

tak czy inaczej ważne że w końcu ci coś zaskoczyło ;) cieszę się

_________________
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: 26 lut 2012, o 22:39 
Offline
Użytkownik

Dołączył(a): 26 lut 2012
Posty: 82
Pomógł: 0

Problem nie tkwił w wygaszaniu całego wyświetlacza tylko w stanach na segmentach, makro ALL_LED_OFF wygląda tak:
Kod:
#define ALL_LED_OFF PORTC |= (LED1_PIN | LED2_PIN | LED3_PIN)

gdzie:
Kod:
#define LED1_PIN _BV(PC3) //setki
#define LED2_PIN _BV(PC4) //dziesiatki
#define LED3_PIN _BV(PC5) //jednosci

Co powoduje ustawienie stanu wysokiego na bazach tranzystorów, czyli wygaszeniu wyświetlacza a nie segmentów.

Przy każdym wejściu do przerwania uC miał ustawiony stan wysoki na pinie który włączył podczas pierwszego przerwania co spowodowało, że na każdy wyświetlacz była podawana ta sama wartość.

I tak jak napisałem, ustawianie pinów PORTB w stan niski przy każdorazowym wejściu do przerwania zniwelowało problem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lut 2012, o 10:59 
Offline
Użytkownik

Dołączył(a): 26 lut 2012
Posty: 82
Pomógł: 0

Oczywiście dziękuję za pomoc, czasami potrzebne jest świeże spojrzenie na kod aby wyłapać błędy:)
Wieczorem biorę się za DS1820 więc pewnie tu wrócę;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lut 2012, o 14:42 
Offline
Moderator
Avatar użytkownika

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

mlekorlz napisał(a):
Wieczorem biorę się za DS1820 więc pewnie tu wrócę;)


Powodzenia i zapraszam serdecznie ponownie - po to jest nasze forum ;)

_________________
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: 27 lut 2012, o 19:19 
Offline
Użytkownik

Dołączył(a): 26 lut 2012
Posty: 82
Pomógł: 0

Jeszcze takie pytanko, posiłkując się schematem maskowania z książki w moim przypadku muszę zrobić:

Kod:
PORTC = (PORTC & 0x38) | (~licznik & odwrotność 0x38);


0x38h = 111000b więc
0x7h = 000111b

Niestety taki sposób nie działa, proszę o podpowiedź co robię źle bo nigdy nie byłem dobry w operacjach na bitach.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lut 2012, o 19:55 
Offline
Użytkownik

Dołączył(a): 26 lut 2012
Posty: 82
Pomógł: 0

Jednak nie przejdę od razu do termometra...

Idąc tropem listingu z książki:
Kod:
#define SEG_A (1 << 0)
#define SEG_B (1 << 1)
#define SEG_C (1 << 2)
#define SEG_D (1 << 3)

Co u mnie odpowiada za podawanie sygnałów na CD4543.

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

Tu interesuje nas na razie tylko pozycja 1,3,5.

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


Wyświetlacze odmówiły współpracy i zgasły:/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lut 2012, o 21:13 
Offline
Moderator
Avatar użytkownika

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

Zaraz zaraz - bo coś za dużo pytań w jednym ale zdaje się że pisałeś iż używasz sprzętowego dekodera dla wyświetlacza 7segm tak ? jeśli tak to coś nie pokręciłeś z tymi segmentami ? przecież ty wcale nie musisz definiować znaków. Wysyłasz do 4543 liczbę 7 i taka ukazuje ci się na wyświetlaczu LED od razu ....

Odnośnie maskowania to dobrze zacząłeś myśleć - musisz mieć maskę

0b111000 ale dla niej przeciwstawną będzie 0b11000111 przecież

_________________
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: 27 lut 2012, o 21:36 
Offline
Użytkownik

Dołączył(a): 26 lut 2012
Posty: 82
Pomógł: 0

Ale ekstra;) nie wiedziałem, że wystarczy PORTB=6; i już mam wyświetlone:)

Zrobiłem maskowanie:
Kod:
PORTC = (PORTC & 0b111000) | (~licznik & 0b11000111);


Ale niestety wyświetlacze się nie włączają, nie potrafię tego zrozumieć:/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lut 2012, o 22:00 
Offline
Moderator
Avatar użytkownika

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

mlekorlz napisał(a):
Ale ekstra;) nie wiedziałem, że wystarczy PORTB=6; i już mam wyświetlone:)

Zrobiłem maskowanie:
Kod:
PORTC = (PORTC & 0b111000) | (~licznik & 0b11000111);


Ale niestety wyświetlacze się nie włączają, nie potrafię tego zrozumieć:/


Bo troszkę za bardzo się śpieszysz i masz rację nie do końca przećwiczyłeś rozdział z teorii zarówno o przesunięciach bitowych oraz maskowaniu ;) ....

najpierw maskujesz bity, które chcesz użyć w porcie - zerując je:

Kod:
PORTC = ( PORTC &0b11000111 ) ....


widzisz to ?

potem maskujesz licznik:

Kod:
 ( ~licznik & 0b00111000 )


czyli przygotowujesz sobie grunt żeby na końcu połączyć tylko to miejsce gdzie masz swoje 3 bity

Kod:
PORTC = ( PORTC &0b11000111 )  | ( ~licznik & 0b00111000 );


a ty próbujesz w pośpiechu zgadywać i na chybił trafił maskowania robić ;) ---- musi przecież zajść operacja OR

_________________
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: 27 lut 2012, o 22:55 
Offline
Użytkownik

Dołączył(a): 26 lut 2012
Posty: 82
Pomógł: 0

Wyświetlacze odliczają od 999 w dół aż miło;)

Kod licznika dla leniuchów;)

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


Maskowanie zrobione, widzę błąd, że robiłem to kompletnie odwrotnie niż miało być. Jutro powtarzam rozdział o bitach i w końcu ruszam z termometrem:)

Jutro wprowadzę poprawki kosmetyczne do kodu, schemat układu już mam, wrzucę do projektów sprzętowych, myślę, że będzie fajny tutorial dla amatorów.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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