Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmega8 - Odpowiednie miganie diód w C - kłopot z programem

miki1515 06 Maj 2014 09:38 1038 12
  • #1 06 Maj 2014 09:38
    miki1515
    Poziom 9  

    Witam! Od kilku dni męczę się z pewnym zadaniem, polegającego na sterowaniu diodami. Problem polega na zapaleniu diody na porcie PC1 przez czas times, następnie razem na portach PC1 i PC2 przez czas timed, potem tylko PC2 przez czas times, potem PC2 i PC3 przez timed itd. Napisałem program i niby wszystko dobrze, bo jak chce zapalić pojedyncze diody lub podwójne to wszystko działa. Problem pojawia się jak chcę sterować nimi w pętli. Domyślam się, że może chodzić o przesuwanie bitów, ale powiem szczerze, że nie do końca rozumiem co się tam dzieję... Prosiłbym o sprawdzenie, sugestie, czy nawet fragmenty kodu.
    Dziękuję za wszelką pomoc.

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0 12
  • #2 06 Maj 2014 09:46
    BlueDraco
    Specjalista - Mikrokontrolery

    A na czym ten problem konkretnie polega? Co Ci się nie podoba w działaniu programu?

    0
  • #3 06 Maj 2014 10:35
    zumek
    Poziom 39  

    A jak myślisz , co się dzieje z Twoimi diodami po wykonaniu poniższej instrukcji :?:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #4 06 Maj 2014 13:01
    miki1515
    Poziom 9  

    Przepraszam, trochę nie sprecyzowałem problemu. Oczywiście instrukcja PORTC=0x00;
    była wpisana w czasie prób, aby program działał poprawnie.
    Aktualnie bez instrukcji PORTC=0x00; w pętli while program po podaniu zasilania działa następująco:
    1) nic się nie zapala przez dłuższy czas times
    2) zapalają się dwie diody portów PC1 i PC2 na czas krótszy timed
    3) zapala się dioda portu PC1 na czas dłuższy times
    4) zapalają się dwie diody portów PC1 i PC2 na czas dłuższy times
    5) zapalają się trzy diody portów PC1, PC2, PC3 na czas dłuższy times
    6) zapalają się dwie diody portów PC2 i PC3 na czas krótszy timed
    7) zapalają się trzy diody portów PC2, PC3, PC4 na czas dłuższy times
    8) zapalają się dwie diody portów PC3 i PC4 na czas krótszy timed
    9) zapalają się wszystkie diody PC1-PC4 na czas krótszy timed
    10) zapalają się trzy diody portów PC1, PC3, PC4 na czas dłuższy times
    11) zapalają się dwie diody portów PC1 i PC4 na czas krótszy timed
    12) zapalają się trzy diody portów PC1, PC2, PC4 na czas dłuższy times
    13) zapalają się dwie diody portów PC1 i PC2 na czas dłuższy times
    itd.
    Dziękuję za szybką pomoc.

    Dodano po 41 [minuty]:

    Po dodaniu negacji binarnej w definiowaniu wyjść, uzyskałem lepszą pracę układu:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Ale nadal po zapaleniu się pierwszej diody, a następnie drugiej nagle zapalają się wszystkie diody. Nie mam pojęcia z czego to wynika... Załączam film obrazujący aktualną pracę układu:

    0
  • #5 06 Maj 2014 13:22
    gaskoin
    Poziom 38  

    ~ powinieneś mieć przy operacjach z & a nie z |

    0
  • #6 06 Maj 2014 13:29
    miki1515
    Poziom 9  

    Niestety, też tak próbowałem i nie działa tak jak założyłem. Po zamianie negacji miejscami diody migają w odwrotny sposób, czego można było się spodziewać, ale nadal jest taki moment, gdy wszystkie diody są zapalone.

    0
  • #7 06 Maj 2014 14:15
    BlueDraco
    Specjalista - Mikrokontrolery

    Zacznij od pokazania schematu. Prawdopodobnie masz diody połączone anodą z uC,a katodą z masą, więc zapalenie i gaszenie trzeba zrobić odwrotnie, niż miałeś to w pierwszej wersji.
    Instrukcje zapalania i gaszenia w drugiej wersji są błędne (to napisał powyżej gaskoin).

    0
  • #9 06 Maj 2014 15:01
    miki1515
    Poziom 9  

    Tak, anoda była połączona z uC, poprawiłem, ale praca układu dalej jest zła. Zastanawia mnie skąd jest ta przerwa w zapalaniu diód...

    Co do artykułu to z pewnością przeczytam, ale teraz zależy mi, aby ten program szybko popchnąć.
    Dzięki za pomoc.

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0
  • #10 06 Maj 2014 23:04
    miki1515
    Poziom 9  

    Trochę poczytałem i rzeczywiście źle myślałem. Poprawiłem, ale jest nadal jeden problem: po zapaleniu diody z portu PC1 , a następnie dwóch z PC1 i PC2 wszystko gaśnie na cas krótszy timed, dalej program leci normalnie, aż do zakończenia pętli i z powrotem pojawia się problem.
    W czym może tkwić błąd?
    Diody są połączone anodą do uC.

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    Pytanie trochę z innej beczki... Takie sterowanie mogłoby realizować pracę silnika skokowego bipolarnego przez układy Darlingtona, czy tranzystory MOSFET?

    0
  • Pomocny post
    #11 06 Maj 2014 23:41
    BlueDraco
    Specjalista - Mikrokontrolery

    To znaczy, że program działa poprawnie - dokładnie tak, jak go napisałeś. Przecież masz:
    A1B2_ON;
    _delay_ms(timed);
    A1B2_OFF;
    _delay_ms(timed);
    B2_ON;

    0
  • #12 07 Maj 2014 00:33
    miki1515
    Poziom 9  

    Dzięki wielkie, gapa ze mnie :) Jeszcze tylko zastanawia mnie ten silnik skokowy?

    0
  • #13 07 Maj 2014 09:18
    gaskoin
    Poziom 38  

    Jak chcesz ręcznie, to za 1zł kupisz gotowego scalaka. Za parę złotych więcej kupisz gotowy scalak, z którym sterowanie ogranicza się do dwóch pinów - kierunek i czy ma się kręcić.

    0