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.

[C]Program typu "drut", biegające swiatełko

adampyndzel 14 Cze 2012 18:05 1060 18
  • #1 14 Cze 2012 18:05
    adampyndzel
    Poziom 16  

    Witam.

    Napisałem taki program:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    założenia były aby LED-y podłączone do portb zaświecały się po kolei. Instrukcja while(1) użyta aby wszystko szło w nieskończonej pętli natomiast pętla funkcji for aby wykonało się tylko 8 razy i od nowa. Jednak program coś nie działa tak jak powinien. Wykona się tylko raz wg założenia mojego a następnie miga tylko dioda podłączona do portb.0 ze znacznie mniejszą częstotliwością niż jak zapalały się po kolei.

    P.S. Uczę się, a to chyba mój no z 5 program.

    0 18
  • #2 14 Cze 2012 18:11
    tmf
    Moderator Mikrokontrolery Projektowanie

    Bo liczba jest tylko inkrementowana, a przesunięcie ponad 8 nie ma sensu. Zamiast liczba ma być chyba i?

    0
  • #3 14 Cze 2012 18:40
    adampyndzel
    Poziom 16  

    czyli co mam zrobić żeby było to przesunięcie powtarzane, zmieniłem na 7 przesunięć, a dlaczego musi być i jeśli to tylko ilość kroków.

    0
  • Pomocny post
    #4 14 Cze 2012 18:41
    sz4t4n
    Poziom 10  

    Wystarczy, że kolega do pętli while wpisze tylko to:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    pozdrawiam


    edit:
    oczywiście zamiast i<5 wpisz 8

    0
  • #5 14 Cze 2012 19:37
    adampyndzel
    Poziom 16  

    dzięki, a podpowiedz jeszcze jak można zrobić że diody będą się załączać w odwrotnym kierunku

    0
  • #6 14 Cze 2012 20:16
    stanleysts
    Poziom 27  

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #7 14 Cze 2012 20:19
    gaskoin
    Poziom 38  

    Nie wiem czy to poprawili, ale zmienne przesunięcia nie są za dobrze generowane dla avr. Kompilator robi takie przesunięcie w jakichś magicznych pętlach (zamiast np 1 << 6 robi 6 pętli po 1 << 1). Fajnie jakby ktoś kto się nie boi asemblera to sprawdził bo ja nie mam takiej możliwości chwilowo.

    0
  • #8 14 Cze 2012 20:21
    stanleysts
    Poziom 27  

    Ciekawe info, swoją drogą nie napisałem nigdy programu pod avr, tak więc nie wiem :D

    0
  • #9 14 Cze 2012 20:27
    adampyndzel
    Poziom 16  

    nie wiem co robię źle ale nie działa. porty w stanie niskim cały czas, próbowałem z poleceniem PORTB = (i>>1) ale nic z tego

    0
  • #10 14 Cze 2012 20:32
    sz4t4n
    Poziom 10  

    Spróbuj tego

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #11 14 Cze 2012 20:33
    gaskoin
    Poziom 38  

    stanleysts napisał:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Bo pętla for jest źle i się nigdy nie wykona, a (i >> 1) to wziąłeś chyba z kosmosu.

    0
  • #12 14 Cze 2012 20:36
    stanleysts
    Poziom 27  

    tak :/ przepraszam za błąd zamiast i<1 i=0.

    0
  • #13 14 Cze 2012 20:40
    tmf
    Moderator Mikrokontrolery Projektowanie

    gaskoin napisał:
    Nie wiem czy to poprawili, ale zmienne przesunięcia nie są za dobrze generowane dla avr. Kompilator robi takie przesunięcie w jakichś magicznych pętlach (zamiast np 1 << 6 robi 6 pętli po 1 << 1). Fajnie jakby ktoś kto się nie boi asemblera to sprawdził bo ja nie mam takiej możliwości chwilowo.


    Ale nie ma możliwości zrobić inaczej, bo AVR nie ma instrukcji assemblera przesuwającej od razu o n bitów. Przesuwać można tylko po 1 bicie. Ew. czasami można mieszać z tetradami.

    0
  • #14 14 Cze 2012 20:40
    adampyndzel
    Poziom 16  

    No cóż niestety nie zadziałał program od sz4t4n :/ chyba, a nawet na pewno musi istnieć jakieś rozwiązanie przesuwania bitu w drugą stronę.

    0
  • #15 14 Cze 2012 20:43
    stanleysts
    Poziom 27  

    Istnieje takie przesuwanie bitów jak zostało pokazane.

    a nie robisz czasem tego na PORTB a nie PORTD?

    0
  • #17 14 Cze 2012 20:46
    sz4t4n
    Poziom 10  

    stanleysts napisał:
    Istnieje takie przesuwanie bitów jak zostało pokazane.

    a nie robisz czasem tego na PORTB a nie PORTD?



    racja, pomyliłem się. Spróbuj zmienić PORTD na PORTB i musi działać ;)

    0
  • #18 14 Cze 2012 20:54
    adampyndzel
    Poziom 16  

    no dobra rozkminiłem, nie wiem czemu na to od razu nie wpadłem jak to oczywiste.

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    tak więc piewszy program w C napisany dla własnej motywacji :)

    Dodano po 7 [minuty]:

    a jeśli chodzi o zmianę PORTD na PORTB to zauważyłem i po zmianie nadal nie działało. Oprogramowanie jakie używam to Eclipse i mam jeszcze jedno pytanie, nie będę zakładał nowego tematu. Dlaczego jeśli ustawiłem w Properties>Target Hardware MCU Clock Frequency na 16000000 czyli 16MHz taki jaki jest rezonator to po wpisaniu np opoznienia 1000ms nie jest prawidłowe i nie zgadza się z zegarem dobrze działającym

    0
  • #19 14 Cze 2012 20:59
    gaskoin
    Poziom 38  

    Bo program działa na wewnętrznym 1MHz. Źródło zegara można zmienić jedynie fusebitami.

    stanleysts napisał:
    tak :/ przepraszam za błąd zamiast i<1 i=0.


    >=

    0