PSoC - blikáme

V minulém díle jsme si popsali některá globální nastavení procesorů PSoC. Je na čase si ukázat jak nabytých znalostí využít prakticky. Naším "Hello World" bude rozblikání procesoru PSoC.


Vzhledem k tomu, co jsme si řekli minule přeskočím proces vytváření projektu (pojmenujeme si ho například BLIK) a přejdeme rovnou k dílu. Ovšem naše úloha se dá řešit hned několika způsoby. Například:
  • zpožďovací smyčkou
  • obsluhou přerušení čítače
  • PWM
Myslím, že nebude na škodu vyzkoušet si všechny varianty. Začneme s prvně jmenovanou. Použijeme zpožďovací smyčku. Postup si popíšeme v jednotlivých krocích:
  1. Vytvořte nový projekt s procesorem CY8C27134-24PXI (postup jsme si ukázali minule)
  2. V nastavení vlastností portů nastavte u pinu P0.4 vlastnost Drive na Strong. Tím řekneme, že pin P0.4 bude výstupní.
  3. Vložte následující kód:
#include <m8c.h>      
#include "PSoCAPI.h"  

void main()
{
    unsigned int i;
    while (1)
    {
        for (i=0; i<10000; i++);
        PRT0DR ^= 0x10;
    }
}


Myslím si, že kód není nutné dále komentovat. Program běží v nekonečné smyčce, kdy při každém průchodu je zpožděn 10000 cykly a následně je invertován pin P0.4. PRT0DR je datový registr portu 0.

Další způsob již bude složitější, ale ukážeme si na něm, jak pracovat s přerušením. Použijeme k tomu blok čítače.
  1. Opět vytvořte nový projekt
  2. Nastavte parametr VC1 na 12. Tím dostaneme další zdroj hodin o frekvenci 24MHz/12 = 2MHz.
  3. Nastavte parametr VC2 na 2. Tím dostaneme další zdroj hodin o frekcenci 2MHz/2 = 1MHz
  4. Nastavte parametr VC3 Source na VC3 a Parametr VC3 na 100, tím dostaneme další zdroj hodin o frekvenci 1MHz/100 = 10kHz
  5. Vložte do projektu modul Couter16 a pojmenujte ho jako Couter16. Kliknutím pravého tlačítka a zvolením PLACE se modul "usadí" na prvních dvou digitálních blocích.
  6. Ve vlastnostech modulu nastavte Clock na VC3, tím bude Couter16 takotován frekvencí 10kHz.
  7. Dále zvolte Enable na High, aby byl modul spuštěn
  8. CompareOut a TerminalOut nastavte na none. Funkce těchto vlastností bude vysvětlena později.
  9. Period nastavte na 9999 a CompareValue na 0. Tím si určíme, že čítač přeteče jednou za 10000 taktů hodin.
  10. CompareType nás celkem nezajímá, může nabývat jakýchkoliv hodnot.
  11. ClockSync by mělo být nastaveno na SyncToSysCLK.
  12.  InverEnable necháme na normal. Nechceme invertovat povolovací vstup.
  13. Dále do projektu vložte Modul LED. Jako port nastavte 0 a pin P0.4. Je to rozdíl oproti minulé verzi, kde jsme přímo zapisovali hodnotu do datového registru portu, v tuto chvíli budeme využívat k této činnosti uživatelský modul.
Nyní již ke zdrojovému kódu:

#include <m8c.h>       
#include "PSoCAPI.h"   

#pragma interrupt_handler Counter16_INT

void Counter16_INT(void)
{
    LED_Invert();
}

void main()
{
    Counter16_Start();
    Counter16_EnableInt();
    M8C_EnableGInt;
    LED_Start();
   
while(1);
}


Kód si vysvětlíme po částech:
#pragma interrupt_handler Counter16_INT
nám říká, že někde v jiné části projektu máme skok na obsluhu přerušení, kterou máme napsanou v jazyce C. Samotnou obsluhu pak vykonává funkce void Couter16_INT(void). Skok je však napsán v assembleru, konkrétně ve zdrojovém kódu modulu Couter16 a to v souboru Counter16int.asm.

_Counter16_ISR:

   ;@PSoC_UserCode_BODY@ (Do not change this line.)
   ;---------------------------------------------------
   ; Insert your custom code below this banner
   ;---------------------------------------------------
   ;   NOTE: interrupt service routines must preserve
   ;   the values of the A and X CPU registers.

    ljmp _Counter16_INT
   ;---------------------------------------------------
   ; Insert your custom code above this banner
   ;---------------------------------------------------
   ;@PSoC_UserCode_END@ (Do not change this line.)


   reti


Podtržítko před návěštím značí, že odkazované návěští je napsáno v jazyce C.

  • Funkce Counter16_Start(); spustí blok counteru
  • Counter16_EnableInt(); povolí přerušení od toho modulu
  • M8C_EnableGInt; globálně povolí přerušení
  • LED_Start(); spustí blok LED (a nastaví)
Po nahrání do procesoru, by stejně jako předchozí i tento měl rozblikat LED.

Třetí a myslím, že nejzajímavější možností, je nechat blikání plně na HW systému. A to konkrétně na bloku PWM. Stačí jej správně nastavit ve vizuálním náveháři, v kódu jedním řádkem spustit a o nic jiného se již nestaráme. Jdeme na to:

  1. Opět vytvořte nový projekt.
  2. Vložte uživatelská modul PWM16 a jako "PWM16" jej pojmenujte
  3. Clock source nastavte na CPU_32_KHz.
  4. Enable opět nastavte na High.
  5. CompareOut nastavte na hodnotu Row_0_Output_0. Tím si vyvedeme PWM výstup na výstupní sběrnici digitálních bloků. Tu musíme propojit dále.

  6. Row_0_Output_0 musíme dále propojit na pin P0.4, to lze pouze přes další interní signál GlobalOutEven_4. Napojení provedeme kliknutím na obdelníček ukončující Row_0_Output_0 a nastavením dle obrázku.
  7. Nyní už je třeba propojit GlobalOutEven_4 a P0.4.
    1. Kliknout na P0.4
    2. Select...
    3. GlobalOutEven_4
  8. Dokončíme nastavení bloku PWM
  9. Terminal Out nastavte na None.
  10. Period na 31999PulseWidth na 15999.
  11. Ostatní parametry, dle nastavení čítače v minulém příkladě.
Nyní už zbývá dopsat zdrojový kód:

#include <m8c.h>      
#include "PSoCAPI.h"

void main()
{
    PWM16_Start();
   
while(1);
}


Kompletní zdrojové kódy jsou ke stažení:
Příště si ukážeme jak využít uartu

Komentovat článek

Jméno:  
Zpráva:

Komentáře k článku

- 17.3.2010 12:17