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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 13 cze 2025, o 06:14


    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 ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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


    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    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: 27409
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 27409
    Lokalizacja: Szczecin
    Pomógł: 1043

    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 ] [ Zaznacz wszystko ]
    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: 27409
    Lokalizacja: Szczecin
    Pomógł: 1043

    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 ] [ Zaznacz wszystko ]
    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 ] [ Zaznacz wszystko ]
    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: 27409
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 27409
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 27409
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 27409
    Lokalizacja: Szczecin
    Pomógł: 1043

    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 ] [ Zaznacz wszystko ]
    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 4 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