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:
#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.
#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.
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:
#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
- zpožďovací smyčkou
- obsluhou přerušení čítače
- PWM
- Vytvořte nový projekt s procesorem CY8C27134-24PXI (postup jsme si ukázali minule)
- V nastavení vlastností portů nastavte u pinu P0.4 vlastnost Drive na Strong. Tím řekneme, že pin P0.4 bude výstupní.
- Vložte následující kód:
#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.
- Opět vytvořte nový projekt
- Nastavte parametr VC1 na 12. Tím dostaneme další zdroj hodin o frekvenci 24MHz/12 = 2MHz.
- Nastavte parametr VC2 na 2. Tím dostaneme další zdroj hodin o frekcenci 2MHz/2 = 1MHz
- Nastavte parametr VC3 Source na VC3 a Parametr VC3 na 100, tím dostaneme další zdroj hodin o frekvenci 1MHz/100 = 10kHz
- 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.
- Ve vlastnostech modulu nastavte Clock na VC3, tím bude Couter16 takotován frekvencí 10kHz.
- Dále zvolte Enable na High, aby byl modul spuštěn
- CompareOut a TerminalOut nastavte na none. Funkce těchto vlastností bude vysvětlena později.
- Period nastavte na 9999 a CompareValue na 0. Tím si určíme, že čítač přeteče jednou za 10000 taktů hodin.
- CompareType nás celkem nezajímá, může nabývat jakýchkoliv hodnot.
- ClockSync by mělo být nastaveno na SyncToSysCLK.
- InverEnable necháme na normal. Nechceme invertovat povolovací vstup.
- 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.
#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í)
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:
- Opět vytvořte nový projekt.
- Vložte uživatelská modul PWM16 a jako "PWM16" jej pojmenujte
- Clock source nastavte na CPU_32_KHz.
- Enable opět nastavte na High.
-
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.
- 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.
- Nyní už je třeba propojit GlobalOutEven_4 a P0.4.
- Kliknout na P0.4
- Select...
- GlobalOutEven_4
- Dokončíme nastavení bloku PWM
- Terminal Out nastavte na None.
- Period na 31999, PulseWidth na 15999.
- Ostatní parametry, dle nastavení čítače v minulém příkladě.
#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
Komentáře k článku
článek zatím nikdo nekomentoval

