Jak na více pulsů "přes sebe" (procesor + timer)
Moderátor: Moderátoři
Nepises kolik vystupu vlastne potrebujes, a jaky MCU mas v umyslu pouzit, ale napr. ted delam neco s AT89LP51RD2 ktery ma mimo 3 citace bezne u podobnych 51 jeste dalsi programovatelne pole peti citacu.
NAstavím si přerušení od timeru na nějaké potřebné časové kvantum(záleží jaké délky pulzů potřebuješ). V obsluze interuptu se při každém tiku časového kvanta inkrementuje čítač.
Podle počtu výstupů je počet sekcí v obsluze interuptu hned za incrementací. V každé sekci je porovnání zda už běžící čítač dosáhl shody s čítačem plánované údálosti konkrétního výstupu - pokud ano provede se akce(např. negace stavu výstupu) s výstupem a vypočítá(stávající stav čítače plus čas okamžik další akce) se nová hodnota čítače plánované události.
Výhodou je že můžeš generovat signály i podmíněně nebo s různou proměnnou délkou atd.
Jako čítače je dobré použít například proměnné typu unsigned Long, aby se zaručilo správné přetékání proměnných.
Kód: Vybrat vše
typedef enum
{
RUN=0x02,
CPL=0x04
} ton_status;
volatile ton_status ton1;
volatile uint8_t ton1_value;
void main (void)
{
setup();
for(;;)
{
if(moje_udalost)
{
setTon1();
}
if (ton1==RUN)
{
Q1_oN;
}
else
{
Q1_oFF;
}
}
}
void setTon1 ( void)
{
if (ton1!=RUN)
{
ton1= RUN; //
ton1= 10; // 1ms
}
}
ISR( TIMER0_COMPA_vect) // every 100us
{
if (ton1==RUN)
{
ton1_value--;
if (ton1_value==0)
{
ton1=CPL;
}
}
}