Stránka 2 z 2
Napsal: 30 srp 2014, 20:22
od jiriS
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.
Napsal: 31 srp 2014, 08:52
od termit256
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.
Napsal: 31 srp 2014, 11:43
od jiriS
Já to pochopil tak, že po příchodu zprávy podle její hodnoty se nastaví konkrétní výstup z dvanácti možných.
Jirka
Napsal: 03 zář 2014, 13:00
od rob_brno
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.
Napsal: 04 zář 2014, 22:05
od frpr666
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;
}
}
}