Jak na více pulsů "přes sebe" (procesor + timer)

Dotazy na technické problémy, vlastní řešení technických problémů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
jiriS
Příspěvky: 609
Registrován: 14 led 2014, 01:00
Bydliště: Ašsko
Kontaktovat uživatele:

#16 Příspěvek 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.

termit256
Příspěvky: 10071
Registrován: 06 pro 2007, 01:00

#17 Příspěvek 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.

Uživatelský avatar
jiriS
Příspěvky: 609
Registrován: 14 led 2014, 01:00
Bydliště: Ašsko
Kontaktovat uživatele:

#18 Příspěvek 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

Uživatelský avatar
rob_brno
Příspěvky: 209
Registrován: 12 říj 2012, 02:00

#19 Příspěvek 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.

Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 01:00

#20 Příspěvek 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;
    }
  }
}

Odpovědět

Zpět na „Poradna“