ATMEGA64 má dva 8-bit a dva 16-bit timery, takže bys vše mohl pokrýt jednoduše. Jen má dost nožiček (64) a dodává se jen v pouzdrech TQFP a MLF.
Osobně bych to asi řešil tak, že v případě překrývajících se pulsů bych vypočítal délku překrytí a do timeru zapsal rozdíl v běhu přerušovací rutiny.
Jak na více pulsů "přes sebe" (procesor + timer)
Moderátor: Moderátoři
Nastav citac na preteceni treba za 50us, no a pokud bude potreba vyslat 1ms pulz, nastavis nejaky bajt v ram na 20 a na dany port 1. V obsluze preruseni zkontrolujes vsechny tyto "citace" jestli nemaji hodnotu nula, ty ktere nemaji snizis o 1 a pripadne vypnes pin na portu pokud dosahnou nuly. Takhle si jich muzes dat tolik, kolik ji stihnes v obsluze preruseni na danem MCU zpracovat.
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.
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.
Mám něco podobného pro nepřekrývající signál, takto:
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.
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.
Podle toho kolik potřebuješ časovačů, tolik si uděláš proměnných ton1, ton2, ton3,... a funkcí setTonX()...
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;
}
}
}