wtorek, 27 czerwca 2023

[1] PSOC 4100S Plus - Hello World, Mruganie diodami

W tym poście chciałbym przyjrzeć się układowi CY8CKIT-149 PSOC 4100S Plus od Cypress Semiconductor (teraz Infineon).

Schemat wykorzystywanej przeze mnie płytki można pobrać pod tym adresem

Przydatnym dokumentem będzie także dokument startowy dla tej płytki, który można znaleźć pod tym linkiem.

Projekt przygotuję w środowisku PSOC Creator.

Po uruchomieniu czystego projektu dla układu PSOC4100S dostajemy czysty schemat podłączenia. Całość projekt, strukturą przypomina rzeczy z CubeMx od STM. 


Zgodnie z schematem podłączenia do dyspozycji dla użytkownika są dioda i przycisk:


Dodatkowo diody są podłączone pod slidery oraz przyciski dotykowe:


Wobec tego podłączenie jest następujące:

  • P3[7] Przycisk (Wciśnięcie zwiera do masy)
  • P3[4] Dioda niebieska (Sterowanie VCC) 
  • P2[2] Dioda zielona (Sterowanie GND)
  • P2[0] Dioda zielona (Sterowanie GND)
  • P1[6] Dioda zielona (Sterowanie GND)
  • P1[4] Dioda zielona (Sterowanie GND)
  • P1[2] Dioda zielona (Sterowanie GND)
  • P1[0] Dioda zielona (Sterowanie GND)
  • P5[7] Dioda zielona (Sterowanie GND)
  • P5[5] Dioda zielona (Sterowanie GND)
  • P5[2] Dioda zielona (Sterowanie GND)
Teraz należy odpowiednio skonfigurować piny. Do tego celu wykorzystam interfejs graficzny.

Piny dokładam w pliku TopDesign.cysch:


Wyprowadzenia muszą być skonfigurowane w następujący sposób. 

Dioda:


Przycisk:


W przycisku należy pamiętać o stanie początkowym, oraz podłączeniu rezystora podciągającego do VCC. 

Następnie te piny są przypisane do zakładki pins. Gdzie można je przypisać do poszczególnych wyprowadzeń.


Po przypisaniu pinów całość wygląda w następujący sposób:


Teraz można ustawić parametry systemu: 


Po czym można przejść do zbudowania aplikacji. Po jej wykonaniu dostaniemy informację o poprawnym wykonaniu operacji oraz o ilości zużytej pamięci:

  1. Flash used: 1936 of 131072 bytes (1,5%).
  2. SRAM used: 1640 of 16384 bytes (10,0%). Stack: 1024 bytes. Heap: 256 bytes.
  3. --------------- Build Succeeded: 06/27/2023 11:29:23 ---------------

W pliku projekt.h są dostępne nazwy plików z konfiguracją przygotowanych pinów:

  1. #include "Diode_Green_1.h"
  2. #include "Diode_Green_1_aliases.h"

Do obsługi zostały wygenerowane następujące funkcje:

  1. void Diode_Green_1_Write(uint8 value)
  2. uint8 Diode_Green_1_Read(void)
  3. uint8 Diode_Green_1_ReadDataReg(void)
  4. void Diode_Green_1_SetInterruptMode(uint16 position, uint16 mode)
  5. uint8 Diode_Green_1_ClearInterrupt(void)

Całość została powielona dla wszystkich zdefiniowanych pinów. W związku z tym, że diody zielone są sterowane przez załączenie GND, natomiast dioda niebieska przez VCC. Procedura uruchomienia wszystkich diod wygląda następująco:

  1. #include "project.h"
  2.  
  3. int main(void)
  4. {
  5.     CyGlobalIntEnable; /* Enable global interrupts. */
  6.  
  7.     /* Place your initialization/startup code here (e.g. MyInst_Start()) */
  8.     Diode_blue_Write(1);
  9.     Diode_Green_1_Write(0);
  10.     Diode_Green_2_Write(0);
  11.     Diode_Green_3_Write(0);
  12.     Diode_Green_4_Write(0);
  13.     Diode_Green_5_Write(0);
  14.     Diode_Green_6_Write(0);
  15.     Diode_Green_7_Write(0);
  16.     Diode_Green_8_Write(0);
  17.     Diode_Green_9_Write(0);
  18.     for(;;)
  19.     {
  20.         /* Place your application code here. */
  21.     }
  22. }

Poniżej modyfikacja, która pozwala na mruganie diodami co 1 sekundę. 

  1. int main(void)
  2. {
  3.     CyGlobalIntEnable; /* Enable global interrupts. */
  4.  
  5.     /* Place your initialization/startup code here (e.g. MyInst_Start()) */
  6.     for(;;)
  7.     {
  8.         Diode_blue_Write(!Diode_blue_Read());
  9.         Diode_Green_1_Write(!Diode_Green_1_Read());
  10.         Diode_Green_2_Write(!Diode_Green_2_Read());
  11.         Diode_Green_3_Write(!Diode_Green_3_Read());
  12.         Diode_Green_4_Write(!Diode_Green_4_Read());
  13.         Diode_Green_5_Write(!Diode_Green_5_Read());
  14.         Diode_Green_6_Write(!Diode_Green_6_Read());
  15.         Diode_Green_7_Write(!Diode_Green_7_Read());
  16.         Diode_Green_8_Write(!Diode_Green_8_Read());
  17.         Diode_Green_9_Write(!Diode_Green_9_Read());
  18.         CyDelay(1000);
  19.     }
  20. }

Wykorzystanie przycisku:

Odczytany stan przycisku będzie wynosił odpowiednio 0 dla przycisku wciśniętego (wciśnięcie przycisku zwiera pin od masy) oraz 1 dla nie wciśniętego (zastosowany wewnętrzny rezystor podciągający).

  1. #include "project.h"
  2.  
  3. static void SetAllDiodesON(void)
  4. {
  5.     Diode_blue_Write(1);
  6.     Diode_Green_1_Write(0);
  7.     Diode_Green_2_Write(0);
  8.     Diode_Green_3_Write(0);
  9.     Diode_Green_4_Write(0);
  10.     Diode_Green_5_Write(0);
  11.     Diode_Green_6_Write(0);
  12.     Diode_Green_7_Write(0);
  13.     Diode_Green_8_Write(0);
  14.     Diode_Green_9_Write(0);
  15. }
  16.  
  17. static void SetAllDiodesOFF(void)
  18. {
  19.     Diode_blue_Write(0);
  20.     Diode_Green_1_Write(1);
  21.     Diode_Green_2_Write(1);
  22.     Diode_Green_3_Write(1);
  23.     Diode_Green_4_Write(1);
  24.     Diode_Green_5_Write(1);
  25.     Diode_Green_6_Write(1);
  26.     Diode_Green_7_Write(1);
  27.     Diode_Green_8_Write(1);
  28.     Diode_Green_9_Write(1);
  29. }
  30.  
  31. int main(void)
  32. {
  33.     CyGlobalIntEnable; /* Enable global interrupts. */
  34.     uint8_t state = 0;
  35.    
  36.     SetAllDiodesOFF();
  37.     /* Place your initialization/startup code here (e.g. MyInst_Start()) */
  38.     for(;;)
  39.     {
  40.         if(Button_Read() == 0 && state == 1)
  41.         {
  42.             state = 0;
  43.             SetAllDiodesON();
  44.         }
  45.         else if((0 == state) && (Button_Read() == 1))
  46.         {
  47.             state = 1;
  48.             SetAllDiodesOFF();
  49.         }
  50.         CyDelay(200);
  51.     }
  52. }

Pliki do projektu można pobrać z dysku Google pod tym linkiem.