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.

Pisanie prostej petli w C

robson132 17 Lip 2015 10:37 774 7
  • #1 17 Lip 2015 10:37
    robson132
    Poziom 20  

    Witam.
    Jestem początkującym programistą z językiem c dopiero zaczynam.
    Póki co trenuję na układzie atmega i dioda led .
    W jaki sposób mogę napisać pętle w której dioda będzie migała od chwili "naciśnięcia i zwolnienia przycisku" i przestanie migać po ponownym naciśnięciu i zwolnieniu przycisku?
    Mam taki kod:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod
    [/code][/syntax]

    w jaki sposób napisać taką pętle?

    0 7
  • #2 17 Lip 2015 10:53
    mondo90
    Poziom 13  

    Najprostszy test na miganie diodą to coś takiego:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    W taki sposób dioda będzie migać dokładnie co jedną sekundę.

    Jeśli chcesz zapalać diodę led po wciśnięciu przycisku to musisz ustawić jeden pin jako wejście i sprawdzać jego stan. Następnie na tej podstawie zapalasz diodę. Stan dnaego portu sprawdzasz za pomocą PINx.

    0
  • #3 17 Lip 2015 11:06
    robson132
    Poziom 20  

    Widzę że nie zajrzałeś do mojego kodu :D
    Wiem jak napisać taki program, żeby dioda zapalała się i gasła po naciśnięciu przycisku..
    Mi chodzi o program w którym po naciśnięciu przycisku i jego zwolnieniu dioda zacznie mrugać w sposób ciągły. Przerwanie migania dokona się po powtórnym naciśnięciu przycisku.

    0
  • Pomocny post
    #4 17 Lip 2015 11:17
    mondo90
    Poziom 13  

    Ok, pisanie programu zostawię Tobie, natomiast podam Ci co trzeba zrobić. Mając już ustawione wszystkie piny jak należy (wejścia/wyjścia) chyba najlepiej napisać coś takiego:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    I teraz musisz zaprzęgnąć przerwania, dokładniej ustawiasz przerwanie od wciśnięcia przycisku i w tym przerwaniu zmieniasz stan zmiennej *state* na przeciwny. Wszystko ;)

    Mam nadzieje, że rozumiesz ? ;)

    1
  • #5 17 Lip 2015 14:30
    dondu
    Moderator Mikrokontrolery Projektowanie

    mondo90 napisał:
    Najprostszy test na miganie diodą to coś takiego:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    W taki sposób dioda będzie migać dokładnie co jedną sekundę.

    Zastanów się co napisałeś vs kod programu :)


    mondo90 napisał:
    I teraz musisz zaprzęgnąć przerwania, ...

    Spokojnie, do przerwań mu jeszcze daleko ... najpierw musi nauczyć się podstaw języka.

    @robson132
    Twój program z pierwszego postu nie zawiera pętli głównej. W trakcie kompilacji zostaje ona dodana na końcu programu w rezultacie czego mikrokontroler zachowuje się tak jakby się zawiesił.

    http://mikrokontrolery.blogspot.com/2011/03/drzaskowy-pamietnik-wstep.html
    http://mikrokontrolery.blogspot.com/2011/02/kurs-jezyka-c-spis-tresci.html

    0
  • #6 17 Lip 2015 14:48
    mondo90
    Poziom 13  

    dondu napisał:
    Zastanów się co napisałeś vs kod programu


    Racja, kod programu nie będzie tak działał że co sekunda dioda zmieni stan a raczej będzie cały czas zapalona. Aby migała musisz dodać jeszcze jedno opóźnienie za *dioda_led_off;*. Ponieważ napisałeś, że rozumiesz tę część zadania więc nie będę się rozwodził, choć faktem jest że mój kod(a raczej kodzik) nie działałby tak jak napisałem. (Dzięki dondu za wyłapanie ;)


    dondu napisał:
    Spokojnie, do przerwań mu jeszcze daleko ... najpierw musi nauczyć się podstaw języka.


    Zgadzam się, przerwania zasugerowałem bo są odpowiedzią na jego problem. Bez nich zadanie jest praktycznie niewykonalne ;)
    dondu napisał:

    Twój program z pierwszego postu nie zawiera pętli głównej. W trakcie kompilacji zostaje ona dodana na końcu programu w rezultacie czego mikrokontroler zachowuje się tak jakby się zawiesił.


    Hmm, a ja tam widzę main'a. Widzę też, że używasz nieodpowiednich nazw do tego co robisz np.:
    Cytat:
    #define LED_ON PORTB ^= LED_PIN


    Wcale nie włącza diody led, a zmienia stan pinu na przeciwny. Może to i szczegół, ale w większych programach będziesz się strasznie gubił tak pisząc.

    0
  • #7 17 Lip 2015 15:07
    robson132
    Poziom 20  

    W pierwszym poście wrzuciłem zły kod, to jest ten prawidłowy:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    kolego mondo90 jakbyś mógł mie to przerobić według twojego sposobu i skomentować dokładnie każdy krok, żebym wiedział co skąd sie bierze byłbym wdzięczny.

    1
  • #8 17 Lip 2015 20:18
    dondu
    Moderator Mikrokontrolery Projektowanie

    mondo90 napisał:
    dondu napisał:
    Spokojnie, do przerwań mu jeszcze daleko ... najpierw musi nauczyć się podstaw języka.

    Zgadzam się, przerwania zasugerowałem bo są odpowiedzią na jego problem. Bez nich zadanie jest praktycznie niewykonalne ;)

    Oj, przesadziłeś :) Bez problemu napisze kod bez przerwań.


    mondo90 napisał:
    dondu napisał:

    Twój program z pierwszego postu nie zawiera pętli głównej. W trakcie kompilacji zostaje ona dodana na końcu programu w rezultacie czego mikrokontroler zachowuje się tak jakby się zawiesił.

    Hmm, a ja tam widzę main'a.

    Nie pisałem o braku funkcji main() tylko o braku pętli głównej, której swoją drogą w Twoim kodzie także nie ma.

    mondo90 napisał:
    Może to i szczegół, ale w większych programach będziesz się strasznie gubił tak pisząc.

    Nie szczegół, to bardzo słuszna uwaga :)

    0