logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[c][atmega32]Zegrar NIXIE - sterowanie portami

margas4542 03 Wrz 2011 12:35 3255 27
REKLAMA
  • #1 9890873
    margas4542
    Poziom 16  
    Miałem kilka lampek LC-513 i pomyślałem o zegarku - zrobiłem płytkę zamontowałem elementy i gdy przyszło pisać program wynikły problemy ze sterowaniem portami cyfr które są poprzez tranzystory podpięte do portów atmegi. Po kilku nieudanych próbach uporania się z tym kłopotem oraz brakiem możliwości sprawdzenia na pytce testowej która uległa uszkodzeniu postanowiłem poprosić kolegów o radę jak poprawnie napisać obsługę tych lampek.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 9893809
    michalko12
    Specjalista - Mikrokontrolery
    Daj jakiś schemat i napisz konkretnie z czym masz problem
  • #3 9893839
    margas4542
    Poziom 16  
    Daje schemat
    [c][atmega32]Zegrar NIXIE - sterowanie portami[/img]
  • REKLAMA
  • #4 9893904
    michalko12
    Specjalista - Mikrokontrolery
    margas4542 napisał:
    i gdy przyszło pisać program wynikły problemy ze sterowaniem portami cyfr które są poprzez tranzystory podpięte do portów atmegi.


    Możesz opisać jakiego rodzaju są te problemy? Nikt nie odpowiedział Ci na ten problem bo nikt nie wie co to za problem i nikomu nie chce się dekodować tego programu.
  • REKLAMA
  • #5 9893945
    margas4542
    Poziom 16  
    OK problem to dwa porty do których podłączyłem poszczególne cyfry lamp na których mają się wyświetlać dziesiątki-jednostki godzin lub dni , dziesiątki-jednostki minut lub miesięcy no i dziesiątki-jednostki sekund lub rok. Nie wiem jak napisać funkcję która zapalała by odpowiednią cyfrę danej lampy gdy np; zmienna godz1 [czas dziesiątek godzin] ma wartość od 0 do 9.
  • #6 9893992
    michalko12
    Specjalista - Mikrokontrolery
    Patrząc na to:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    trudno powiedzieć co jest problemem, czy to co opisałeś, czy brak znajomości C
    Proponuję zacząć od Ctrl+A, Delete, a następnie napisać prosty program licznika. Niech ci wyświetla liczbę z zakresu od 0 do 999999.

    Spróbuj najpierw napisać funkcję która przyjmie dwa argumenty określające lampę i cyfrę która ma być wyświetlona np
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #7 9894027
    margas4542
    Poziom 16  
    Gdybym dobrze znał C to zapewne nie pisałbym postów z zapytaniami i prośbą o pomoc na elektrodzie a listing jest poglądowy do przeróbki.
  • REKLAMA
  • #8 9894062
    michalko12
    Specjalista - Mikrokontrolery
    W sumie to chcesz, żeby dać ci gotowe rozwiązanie bo ty nie znasz C, tak?
    Mimo, że ktoś dobrze zna C nie oznacza, że potrafi rozwiązać problem.

    Jeśli nie znasz C to tym bardziej zacznij od prostych przykładów.
    Spróbuj napisać tą funkcję o której wcześniej pisałem, przy okazji trochę się poduczysz, a my wytkniemy wszystkie twoje błędy.
  • #9 9894070
    margas4542
    Poziom 16  
    Nie chodzi mi o gotowe rozwiązanie programu tego zegara tylko tak jak napisałem informację jak zdefiniować sterowanie cyframi bo gdybym dał dekoder BCD na 10 to sprawa byłaby o wiele prostsza.
  • #10 9894116
    michalko12
    Specjalista - Mikrokontrolery
    margas4542 napisał:
    Nie chodzi mi o gotowe rozwiązanie programu tego zegara tylko tak jak napisałem informację jak zdefiniować sterowanie cyframi bo gdybym dał dekoder BCD na 10 to sprawa byłaby o wiele prostsza.


    No właśnie, zrób taki dekoder programowo, sposobów jest kilka.

    Dodano po 1 [minuty]:

    Pamiętaj o tym, że masz multipleksowane sterowanie bo w tym swoim programie tego nie wziąłeś pod uwagę.
  • #11 9894143
    margas4542
    Poziom 16  
    Nie wiem czy dobrze rozumiem bo mówiłem o scalaku dekodującym BCD na 10 linii do których mógłbym podłączyć cyfry lamp wykorzystując 4 linie portów atmegi zamiast dziesięciu rozrzuconych po dwu portach.
  • #13 9894325
    margas4542
    Poziom 16  
    Wybacz ale kręcimy się w kółko bez konkretów bo czy w jakiś [jaki?] sposób przypisze adresy portów liczbom czy zrobię emulacje programową scalaka [jak?] tego też nie wiem to na jedno wychodzi bo efekt będzie taki sam.
  • #14 9894413
    michalko12
    Specjalista - Mikrokontrolery
    margas4542 napisał:
    Wybacz ale kręcimy się w kółko bez konkretów bo czy w jakiś [jaki?] sposób przypisze adresy portów liczbom czy zrobię emulacje programową scalaka [jak?] tego też nie wiem to na jedno wychodzi bo efekt będzie taki sam.


    Tu masz gotowca

    Nie stawiam na to że jest bezbłędny bo jest klepany w kilka minut.
    Chodzi tylko o idee.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #15 9894429
    margas4542
    Poziom 16  
    Dziękuje za kod bacznie się mu przyjrzę ale w międzyczasie napisałem coś takiego i chciałbym byś powiedział czy taka definicja ma szansę zdziałać..
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #16 9894453
    michalko12
    Specjalista - Mikrokontrolery
    margas4542 napisał:
    Dziękuje za kod bacznie się mu przyjrzę ale w międzyczasie napisałem coś takiego i chciałbym byś powiedział czy taka definicja ma szansę zdziałać..


    Nie, bo próbujesz w tablicy umieścić instrukcje, a nie konkretne wartości.
    Najbliżej tego co chciałeś uzyskać jest tablica wskaźników na funkcje, ale to już inna bajka.
  • #17 9896506
    nsvinc
    Poziom 35  
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Niestety, zonk. sizeof zwraca ilość bajtów zajmowanych, a nie ilość dostępnych indexów tablicy. Powyzszy warunek nie przejdzie tylko wtedy, jeśli "cyfra" będzie >=sizeof(cyfry) czyli 20. A index 20 zdecydowanie nie istnieje...

    Aczkolwiek ten zonk w najmniejszym stopniu nie wpływa na poprawność programu, dopóki "cyfra" faktycznie będzie trzymana w zakresie 0..9
  • #18 9897317
    michalko12
    Specjalista - Mikrokontrolery
    nsvinc napisał:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Niestety, zonk. sizeof zwraca ilość bajtów zajmowanych, a nie ilość dostępnych indexów tablicy. Powyzszy warunek nie przejdzie tylko wtedy, jeśli "cyfra" będzie >=sizeof(cyfry) czyli 20. A index 20 zdecydowanie nie istnieje...

    Aczkolwiek ten zonk w najmniejszym stopniu nie wpływa na poprawność programu, dopóki "cyfra" faktycznie będzie trzymana w zakresie 0..9


    A no zonk, ale tak jak mówiłem to jest klepane w kilka minut bez większego zastanawiania się w większości poprzez kopiuj/wklej. Jak się uprzeć to jeszcze by cos pewnie się znalazło.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #19 9898030
    margas4542
    Poziom 16  
    Głowię się nad tym kawałkiem twojego kodu oby go zaadaptować do programu i jak na razie nic sensownego nie wymyśliłem. Zmodyfikowałem swój kod ale zachwycony nim nie jestem a koncepcji jak napisać go bardziej sensownie też nie mam. Niestety pokutuje moja ograniczona wiedza na temat C. Trochę kodu do wglądu.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #20 9898105
    nsvinc
    Poziom 35  
    Nie chce mi się analizować zbytnio tego kodu, z powodu rażąco rażących błędów...
    Na pierwszy rzut oka delay-e zamiast wszystko oprzeć o przerwanie jakiegoś timera...
    Po drugie, jakoś tak dziwnie napisany switch?... W książkach każą używać klamer o ładnych kształtach "}" "{" wokół kodu w case o ile jest w nim więcej niż jedna instrukcja...

    Po trzecie, w tej samej pętli, co masz delaye i wyświetlanie, obsługujesz menu, i czytasz przyciski (gdzie znowu pojawia znienawidzony delay). Niestety cały kod kupy się nie trzyma, i nie dziwię się, że nie działa on tak jak chcesz...

    Koniecznie wywal wyświetlanie (i multiplexowanie) do ISRa dowolnego timera, i daj prockowi oddychać...

    Po drugie, przyciski podłącz pod przerwania zewnętrzne, i ich obsługę też przenieś do przerwania. I niech to przerwanie komunikuje się ze switchem obsługującym menu z wykorzystaniem semaforów/flag.
  • #21 9901290
    margas4542
    Poziom 16  
    Co do switch-a to sięgnąłem do książki gdzie pisze iż można stosować klamry aczkolwiek nie jest to konieczne. Co do przerwań to nie zastosowałem ich bo jak na razie nie potrafię ich właściwie zastosować pomimo oparcia się na książkowym przykładzie, po drugie czy naprawdę trzeba wszędzie stosować ?. Rozumiem że dla zaprawionego w boju z C praktyka mającego już programistyczne nawyki ten kod wywoła ciarki na plecach i ale nie bulwersują mnie cięgi które obrywam bo mam świadomość że błędów w kodzie nie uniknę.
  • #22 9901485
    gaskoin
    Poziom 38  
    nsvinc napisał:

    Po drugie, jakoś tak dziwnie napisany switch?... W książkach każą używać klamer o ładnych kształtach "}" "{" wokół kodu w case o ile jest w nim więcej niż jedna instrukcja...


    Pierwsze słysze:P ale faktycznie przydałyby się tam wcięcia, nie chodzi o to co chodzi czy nie chodzi, ale o to, że tego się nie da czytać w przedstawionej formie. Nie chodzi nawet o styl kodowania tylko o sformatowanie kodu.
  • #24 9901785
    margas4542
    Poziom 16  
    Przepisałem kod ale TO TYLKO NIE FUNKCJONUJĄCY SZKIELET do wglądu..
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #25 9904997
    Konto nie istnieje
    Konto nie istnieje  
  • #26 9908393
    margas4542
    Poziom 16  
    Za kod dziękuje. Na razie na płytce testowej zamiast lampek mam podłączone tylko dwa 10-cio punktowe paski led [bargrafy]. Cos jednak jest nie tak bo program choć zapala wszystkie ledki na bargrafie to nie reaguje na zmianę wartości zmiennej już ręcznie generowanej przez kolejne naciśnięcia switcha [do testu licznik w petli] mającej gasić poprzednia a zapalać następną ledke.
  • #27 9927071
    margas4542
    Poziom 16  
    Dalej próbuje obłaskawić to sterowanie portami bo otrzymane propozycje rozwiązań nie działają albo ja nie potrafię ich odpowiednio zaadoptować....napisałem taki fragment programu i miałem nadzieję że ruszy ale niestety KLAPA...czy ktoś mógłby podpowiedzieć co "nabroiłem"....
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #28 9933950
    margas4542
    Poziom 16  
    Nie potrafię zrobić tego multipleksu , próbowałem kilka rozwiązań i w końcu sięgnąłem po kod michaloko12 do którego odnosząc się dopisałem funkcje wyświetlania w przerwaniu ale niestety nie działa. Jak mam rozwiązać ten multipleks bo z pomocą książki tego nie zrobię [taka zachwalana a przykładów realizacji na lekarstwo]. Tak wygląda teraz [surówka].
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
REKLAMA