Często zachodzi potrzeba reakcji nie tyle na stan jakiejść zmiennej co na jej zmianę. Taki sposób podejścia do tematu nosi nazwę reakcji na zbocze sygnału. Wyróżniamy tutaj:

- zbocze narastające 

- zbocze opadające

Aby za każdym razem, gdy potrzebuję takiej funkcjonalności, nie pisać nowego fragmentu kodu, stworzyłem prostą funkcję realizującą to zadanie:

- zawartość pliku Triggery.h

#ifndef TRIGGERY_H_
#define TRIGGERY_H_
#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
void TRIG(bool input,void (*f)(void),uint8_t no,uint8_t rise);
enum Trig_zbocze {Falling,Rising};
enum Trig_zbocze Trise;
enum Trig_numer {Trig0,Trig1,Trig2,Trig3,Trig4,Trig5,Trig6,Trig7};
enum Trig_numer Tno;
#endif /* TRIGGERY_H_ */

- zawartość pliku Triggery.c

#include "Triggery.h"
uint8_t stan;
void TRIG(bool input,void (*f)(void),uint8_t no,uint8_t rise)
{
 if (input && !(stan & (1<<no)))
 {
 stan|=(1<<no);
 if (rise)
 f();
 }
 if (!input && (stan & (1<<no)))
 {
 stan&=~(1<<no);
 if(!rise)
 f();
 }
return;
}

Funkcja ta działa na zasadzie przerzutnika:

- jeżeli na wejściu pojawi się "true" to zapisuje to do zmiennej pomocniczej a zmienna ta jednocześnie uniemożliwia kolejne wejście do jej zapisu (trochę zakręciłem:) )

- teraz funkcja przy każdym wywołaniu sprawdza sobie czy jej warunek wejściowy nadal jest spełniony

- jeżeli nie jest spełniony to zdejmuje swój "zatrzask" z poprzedniej części kodu

- moment zdjęcia "zatrzasku" równoznaczny jest z wykryciem zbocza opadającego

Zrozumienie kodu może utrudniać Ci to, że jest on zrealizowany dla 8iu niezależnych triggerów. Jednak wystarczy, że zamiast zmiennej 8io bitowej użyjemy boolowskiej:

if (sygnalWE && !zatrzask)
 {
 zatrzask=true;
 //wpisz tu twoj kod dla zbocza narastajacego
 }
 if (!sygnalWE && zatrzask)
 {
 zatrzask=false;
 //wpisz tu twoj kod dla zbocza opadajacego
 }

Użycie kodu w programie jest następujące:

TRIG(jakaszmienna==17,*zrobcos,Trig0,Rising)

 

Do pobrania:

Użyj opcji uploadu plików, aby przekazać mi kod do sprawdzenia. Postaram się zajrzeć do niego tak szybko jak będzie to możliwe. Paczkę z poprawionym kodem umieszczę w tym samym miejscu.

 

 

Jeżeli wystąpi sytuacja, w której zostanie wyświetlona zawartość folderu z innego działu - należy wyczyścić cache przeglądarki! Następnie przeładować stronę.


Komentarze  

 
# DavidDavid 2016-11-24 08:45
I appreciate, cause I found just what I was looking for. You have ended my 4 day long hunt! God Bless you man. Have a great day. Bye
Odpowiedz | Odpowiedz z cytatem | Cytować
 

Licznik odwiedzin

Mapa odwiedzin



 

Copyright © ST WebSite 2017

Stronę hostuje FutureHost. []

Strona korzysta z plików cookie. Dane przechowywane na Twoim komputerze służą wyłą…cznie do poprawienia funkcjonalnoś›ci witryny. Jeżeli tego nie akceptujesz - powinieneś› ją… opuś›cić‡.

Akceptujesz ciasteczka z tej witryny?