Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[c][atmega32]Zegrar NIXIE - sterowanie portami

margas4542 03 Sep 2011 12:35 3174 27
  • #1
    margas4542
    Level 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.
    Code: c
    Log in, to see the code
  • #2
    michalko12
    MCUs specialist
    Daj jakiś schemat i napisz konkretnie z czym masz problem
  • #3
    margas4542
    Level 16  
    Daje schemat
    [c][atmega32]Zegrar NIXIE - sterowanie portami[/img]
  • #4
    michalko12
    MCUs specialist
    margas4542 wrote:
    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.
  • #5
    margas4542
    Level 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
    michalko12
    MCUs specialist
    Patrząc na to:
    Code: c
    Log in, to see the code

    Code: c
    Log in, to see the code

    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
    Code: c
    Log in, to see the code
  • #7
    margas4542
    Level 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.
  • #8
    michalko12
    MCUs specialist
    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
    margas4542
    Level 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
    michalko12
    MCUs specialist
    margas4542 wrote:
    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
    margas4542
    Level 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
    margas4542
    Level 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
    michalko12
    MCUs specialist
    margas4542 wrote:
    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.

    Code: c
    Log in, to see the code
  • #15
    margas4542
    Level 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ć..
    Code: c
    Log in, to see the code
  • Helpful post
    #16
    michalko12
    MCUs specialist
    margas4542 wrote:
    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
    nsvinc
    Level 35  
    Code: C
    Log in, to see the code

    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
    michalko12
    MCUs specialist
    nsvinc wrote:
    Code: C
    Log in, to see the code

    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.

    Code: c
    Log in, to see the code
  • #19
    margas4542
    Level 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.
    Code: c
    Log in, to see the code
  • #20
    nsvinc
    Level 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
    margas4542
    Level 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
    gaskoin
    Level 38  
    nsvinc wrote:

    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.
  • #23
    nsvinc
    Level 35  
    Cóż, klamerki oprócz tego że ładne, to jeszcze poprawiają czytelność ;]
    Dodatkowo, lekko irytują ośmiospacjowe taby...
  • #24
    margas4542
    Level 16  
    Przepisałem kod ale TO TYLKO NIE FUNKCJONUJĄCY SZKIELET do wglądu..
    Code: c
    Log in, to see the code
  • Helpful post
    #25
    User removed account
    User removed account  
  • #26
    margas4542
    Level 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
    margas4542
    Level 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"....
    Code: c
    Log in, to see the code
  • #28
    margas4542
    Level 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].
    Code: c
    Log in, to see the code