Zdeněk Krejčí

Zdeněk Krejčí

Stránky na téma programování v C++
Hardware:
Deska OLIMEX ADuC-P7026 a CPU ARM7_TDMI s ADUC7026
Zde je odkaz na shéma desky a funkční příklad který stačí zkompilovat a nasypat do vašeho CPU.
Úvod
 
Začal bych GPIO neboli vstupně/výstupní piny Jednak proto že asi nejsem sám když řeknu že na začátku se dychtím po tom abych viděl nějakou konkrétní práci nového CPU, jako je to krásné blikání LEDkami že :-)A jednak so jsem sám zjistil právě tahle část Vás vlastně naučí vše co potřebujete k nastavování(ovládání) registrů a ostatních periférií.
...........
Vstupně/výstupní porty
Nejdříve nějký ten základ:
Takže ADUC7019,20,21,22,24,25,26,27 obsahují 40 general-purpose(hlavní určení) bi-directional(obousměrných) I/O pinů.
Všechny piny akceptují 5V uroveň.Většina IO pinů jsou víceůčelové.A v defaultním nastavení jsou GPIO nastaveny do GPIO modu.

Všechny GPIO piny mají interní pull-up rezistor zhruba 100kohm a jejich dovolené proudové zatížení je 1,6mA na pin.Pokud bude z více pinů odebíráno 1,6mA tak maximální počet je 20 pinů.
Následující GPIO piny mají programovatelný pull-up  P0.0,P0.5,P0.6,P0.7
a osmý pin P1.
GPIO piny jsou seskupené do 5 portů Port0 až Port4.Každý port je kontrolovánčtyřmi nebo pěti MMR, x reprezentuje číslo portu.

GPIO Registry:

GPxCON Kontrolní registry Portu x
     (Nastavuje funkce každého pinu Portu x)

GPxPAR  Programování parametrů pro Porty 0,1,3
     (GPxDAT musí být nastaven po změnách v GPxPAR)

GPxDAT Konfigurace portů x a data registrů
     (Nastavení jestli vstupní nebo výstupní piny Portu x)

GPxSET  Datové registry nastavení Portů x
    
GPxCLR  Datové registry mazání Portů x

Takže pro jednoduchý příklad blikání ledky řekněme první ledky portu 4 tj P0.4 nám stačí nastavit pin 0 Portu 4 jako výstupní. Ještě poznamenám že daný port se nachází neboli začíná na adrese 0xFFFFF460 tuto hodnotu můžete vidět v datasheetu pod tabulkou 41 na straně 61.Nebo také v include gpio.h která je právě definovaná jako náš port #define GP4DAT ke kterému budeme níže přistupovat ...

Takže jak jsem řekl nastavíme P0.4 jako výstup
GP4DAT = 0x01000000;
no a rozsvítíme ledku
GP4DAT |=  0x00010000;

no a to je celé :-)

Kompletní příklad:
Příklad předpokládá znalost bitových operací jakou jsou ( | a & )
int main(void)
{   
    GP4DAT = 0x01000000;// P0.4 Nastavime P0.4 jako výstup   
    delay(2000000UL);        // Zpoždění

    while (1) {
        GP4DAT |=  0x00010000;        // Rozsvitil LED neboli nastavit P0.4
        delay(2000000UL);                  // Zpoždění
        GP4DAT &= ~0x00010000;    // Zhasnout LED neboli nulovat P0.4
        delay(2000000UL);                 // Zpoždění
    }
   
    return 0;
}

Ted bych detailně vysvětlil jak je to vše možné:
Zároveň předpokládám že znáte základy jako je rozdíl mezi bit a byte.Pro uplnost bit je jeden bit(bit=částečka) jednoho byte(bajtu=slovo).
Vezmeme ted první řádek a to je nastavení prvního pinu Portu 4 což je P0.4 jako výstup.
GP4DAT = 0x01000000;
Víme už že náš ADUC používá 32 bitové instrukce takže tato hodnota je 32 bitová. To znamená že pro ulehčení a pochopení si rozdělíme tuto hex hodnotu na 8 bitová slova:

                       byte 1  byte 2  byte 3  byte 4
GP4DAT = 0x   01        00         00       00;

takže je vidět že 32 bitové slovo se skládá z 4 byte a každý byte má 8 bitů.
takže když si dále rozdělíme první byte (byte 1) na binární hodnotu dostaneme

00000001

o ostatní byte ty co by následovali za tímhle byte se nestarejte nejsou ted důležité jsou pro jinné funkce a nejsou ted důležité.
Jelikož počítáme vždy z prava do leva tak máme na prvním mýstě 1, neboli bit 0 je nastaven, neboli bit 0 je H. Cože ten náš P0.
V datasheetu je vidět tabulka jestli L nebo H na daném bitu znamená (nastaven jako vstup nebo výstup).

Jako další názorný příklad běžící světlo které nebudu vysvětlovat pokuste se na to přijít sami...

int main(void)
{   
GP4DAT = 0xFF000000;
     
               
delay(20000UL);
   
   
  while(1){
   
    unsigned int pass = 16;
   
    while(!(pass>23)){
       GP4DAT |=1<
      delay(200000UL);
      pass++;
    }
   
    while(!(pass<=16)){
      pass--;
  
       GP4DAT &=~(1<
      delay(200000UL);
   
    }
  }
   
    return 0;
}

Pokračování příště...

Name
Email
Comment
Or visit this link or this one