czwartek, 15 sierpnia 2013

Szybkie przejście z 8 bit na 32 bit

Jeżeli brakuje Ci mocy obliczeniowej w Twoim projekcje, w którym dotychczas korzystałeś z 8 bitowych mikrokontrolerów warto zainteresować się szybszym 32 bitowym mikrokontrolerem LPC 1114.
Co prawda nie znajdziesz go w obudowie DIP tylko SMD, lecz SMD nie jest tak trudne w wykorzystaniu w "domowych" projektach.
Jeżeli nie możesz, nie potrafisz skonstruować projektu z użyciem SMD, zawsze możesz zakupić gotowy moduł na pokładzie z LPC 1114, np. takie jak:
  1.  Mini M0,
  2. Port LPC1114,
  3. AVT1620 Cortexino 
Na początek nie potrzebujesz żadnego programatora, do programowania wykorzystasz interfejs RS-232 z odpowiednią transalacją poziomów logicznych do 3,3 V. Świetnie nadaje się układ MAX3232, a jeżeli nie posiadasz portu RS-232 tylko USB to układ FT232R lub podobny.

AVR'y mają trzy 8 bitowe rejestry służące do operacji na portach:

DDRx  - rejestry kierunku
PORTx - rejestry wyjściowe
PINx  - rejestry wejściowe

Podobnie jest w 32 bitowym LPC 1114:

LPC_GPIOx->DIR - rejestry kierunku
LPC_GPIOx->DATA - rejestry wyjściowe / wejściowe



Poniżej przykład w AVR ustawiający kierunek wyjścia pinu 1 portu A oraz ustawienie na nim stanu niskiego:


DDRA |= (1<<PA1); // kierunek pinu 1 portu PA na wyjściowy
PORTA &= ~(1<<PA1); // ustawienie stanu niskiego na pinie PA1

Analogicznie do w/w przykładu steruje się portami w LPC 1114:

LPC_GPIO0->DIR |= (1<<1); // kierunek pinu portu PORT0 na wyjściowy
LPC_GPIO0->DATA &|= ~(1<<1); // ustawienie stanu niskiego na pinie P0_1

Pora na przykład Witaj Świecie  na LPC 1114, czyli mruganie diodą:

 
  1. #include "LPC11xx.h"
  2.  
  3. #define PIN_LED (1<<2)
  4.  
  5. int main(void)
  6. {
  7. uint32_t i, j;
  8.  
  9.  
  10. LPC_GPIO0->DIR |= PIN_LED; // ustawienie pinu P0_2 na wyjsciowy
  11.  
  12. while (1)
  13. {
  14. LPC_GPIO0->DATA |= PIN_LED; // stan wysoki na pinie P0_2
  15. for ( i = 0; i < 1000000; i++); // realizacja opoznienia (taki niby delay :)
  16. j++;
  17.  
  18. LPC_GPIO0->DATA &= ~PIN_LED; // stan niski na pinie P0_2
  19. for ( i = 0; i < 1000000; i++); // realizacja opoznienia (taki niby delay :)
  20. j++;
  21. }
  22. }