Přerušení od časovače pomocí QuickStartu

Posted by Petr Hapal on 30 January 2013 | 0 Comments

Tags: , , , ,

V minulém příspěvku jsem ukazoval, jak rozblikat LED diodu pomocí GPIO a softwarové pauzy. Dnes chci ukázat jak rychle nakonfigurovat kaskádní zapojení časovačů pomocí QuickStartu. Cílem tohoto příspěvku není popsat jak časovače fungují, ale ukázat, jak snadná je jejich kofigurace pomocí QuickStartu. Časovače a interrupt controlér bude probrán v některém z dalších příspěvků.

Na obrázku níže je znázorněn blokový diagram toho, o co se pokusíme. Chceme každou sekundu spouštět přerušení pomocí kaskárního zapojení dvou časovačů. Každý časovač je možné nakonfigurovat jako děličku s poměrem až 1: 128 * 65536. Začněte vytvořením nového QuickStart projektu tak, jak jsem to popisoval v předchozím příspěvku.

Blokové schéma spojení časovačů

Začněme konfugurovat. Časovač 0 bude mít svůj vstup připojen na systémovou sběrnici, která běží na frekvenci 32MHz v případě MC56F8006, 40MHz v případě MC56F81xx nebo 60MHz v případě MC56F83xx. Vstupní předdělička bude nastavena na 1/32 - toto vytvoří 1MHz na vstupu časovače (MC56F8006). Časovač bude čítat nahoru až do compare události, poté se znovu zinicializuje na hodnotu load registru (0) a překlopí výstupní příznak (OFLAG). Časovač 0 pak bude mít na svém výstupu frekvenci 1kHz (frekvence výstupního příznaku). Nezapomeňte zaškrtnout chekbox QT_0 pro povolení časovače 0. Viz konfigurace na obrázku.

Konfigurace časovače 0

Časovač 1 bude připojen na výstup časovače 0 a bude čítat směrem nahoru při překlopení výstupního příznaku časovače 0 až do hodnoty compare, poté se zinicializuje na hodnotu load registru (0) a vyvolá přerušení. Vyplňte název ISR funkce do pole "ISR name". Viz konfigurace níže.

Konfigurace časovače 1

Dalším krokem je povolení periferních hodin v systémovém modulu do časovačů 0 a 1.

Povolení hodin

Zkonfigurujme GPIO pro LED diody jako výstupy (stejné nastavení jako v předchozím příspěvku). Viz další obrázek.

Konfigurace GPIO

Finálním krokem je kontrola nastavení interrupt kontroléru. V poli "26. Timer 1 Compare/Overflow/Edge" by měl být název ISR rutiny, kterou jste vyplnili při konfiguraci časovače 1. Vše završíme kliknutím na ikonu Save a zavřením konfiguračního dialogu.

Nastavení interrupt kontroléru

V tomto bodě je na čase editovat zdrojový kód. Je nutné zavolat konfigurační rutiny všech periferií a vytvořit rutinu přerušení. Vše je vidět ve výtahu zdrojového kódu:

#pragma interrupt
void QT1_ISR(void)
{
    /* smazat compare flag */
    ioctl(QTIMER_1, QT_CLEAR_FLAG, QT_COMPARE_FLAG);
    /* preklopit gpio bity */
    ioctl(GPIO_A, GPIO_TOGGLE_PIN, BIT_3 | BIT_4 | BIT_5);
}

void main (void)
{
    /* zinicializovat SYS modul */
    ioctl(SYS, SYS_INIT, NULL);
    /* zinicializovat COP modul */
    ioctl(COP, COP_INIT, NULL);
    /* zinicializovat vsechny GPIO moduley */
    ioctl(GPIO, GPIO_INIT_ALL, NULL);
    /* zinicializovat timer 0 */
    ioctl(QTIMER_0, QT_INIT, NULL);
    /* zinicializovat timer 0 */
    ioctl(QTIMER_1, QT_INIT, NULL);
    /* zinicializovat interrupt controller a povolit preruseni */
    ioctl(WINTC, WINTC_INIT, NULL);
    /* povolit preruseni */
    archEnableInt();

    while(1)
    {
         /* periodicky nakrmit watchdog */
         ioctl(COP, COP_CLEAR_COUNTER, NULL);
    }
}

Klíčová slova #pragma interrupt říkají překladači, že funkce je obsluhou přerušní (ISR). Překladač na začátek funkce přidá instrukce pro uložení registrů na zásobník a obnovení registrů včetně instrukce RTI na konec funkce.

Jakmile aplikaci spustíte měly by LED diody měnit svůj stav s periodou 1 sekunda. V řežimu ladění si můžete zkusit přitat breakpoint do rutiny přerušení pomocí kliknutí na symbol "-" na začátku každého řádku nebo stiskem F9. Je také možno přepnout zobrazení editoru do režimu assembler a nebo mixed. Na obrázku níže je náhled na editor a rutinu přerušení v režimu mixed. Je vidět výsledný překlad zdrojového kódu. Jak vidno možnosti QuickStartu jsou velmi silné - ioctl(GPIO_A, GPIO_TOGGLE_PIN, BIT_3 | BIT_4 | BIT_5); se přeložilo jako jediná instrukce. Jak jsem již zmiňoval dříve - QuickStart je povětšinou sada maker, takže kompilace je velmi efektivní.

Režim mixed

Poznámka pod čarou

Osobně QuickStart nepoužívám a toto je také poslední příspěvek, kde jsem jej použil. Jsem toho názoru, že je důležité pochopit jak architektura a periferie fungují. Hlavním cílem těchto příspěvků bude jejich podrobný popis. Začnu nejspíše GPIO a interrupt kontrolérem.

project.zip

Zaslat komentář

Komentáře

Nikdo na této stránce ještě nepřidal komentář.

RSS kanál pro komentáře na této stránce | RSS kanál pro všechny komentáře