// Built with BFTC Rev. 1.0.0, lun 25 agosto 2014 15:58:19

/*

    Copyright 2014 Digital Technology Art SRL

    This file is part of Blackfin Toolchain (BFTC) project.

 

    BFTC is free software: you can redistribute it and/or modify

    it under the terms of the GNU General Public License as published by

    the Free Software Foundation, either version 3 of the License, or

    (at your option) any later version.

 

    BFTC is distributed in the hope that it will be useful,

    but WITHOUT ANY WARRANTY; without even the implied warranty of

    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

    GNU General Public License for more details.

 

    You should have received a copy of the GNU General Public License

    along with Nome-Programma.  If not, see <http://www.gnu.org/licenses/>.

*/

 

// Show how to implement an 8 channel fast counter on port PG[7:0].

// The counter is capable to count with a frequency higher then 500KHz

// In another way it show the interrupt efficency

//

#include "main.h"

 

unsigned counter[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };

unsigned mask[8] = { 1, 2, 4, 8, 16, 32, 64, 128 };

 

// Interrupt service procedure

//

void PGCallback()

{

   int     i;

   for(i = 0; i < 8; i++)

       if(*pPORTGIO & mask[i])

       {

           counter[i]++;

           // Clear the interrupt request

           *pPORTGIO_CLEAR = mask[i];

       }

}

 

unsigned char Menu()

{

   printf("\n");

   printf("COMMANDS ******************\n");

   printf("0 - Clear counts\n");

   printf("D - Display counts\n");

   printf("> ");

   return GetChar_Uart0();

}

 

int main(void)

{

   int     com, i;

    Set_PLL(16, 4);     // CORE: 25MHz * 16 = 400MHz, SCLK: 400MHz / 4 = 100MHz

    Set_Port();         // Set the port according to project set

    Set_Uart0(115200);  // printf is redirected to UART0

   // Set an interrupt on the rising edge of the PG0 port

   Set_PortGInterruptService(PG0 | PG1 | PG2 | PG3 | PG4 | PG5 | PG6 | PG7, PGCallback);

   Set_PortGInterruptEnable(PG0 | PG1 | PG2 | PG3 | PG4 | PG5 | PG6 | PG7, true);

    while(1)            // Main loop

    {

       com = Menu();

       switch(com)

       {

           case '0':   for(i = 0; i < 8; i++)

                           counter[i] = 0;

                       break;

           case 'D':   for(i = 0; i < 8; i++)

                           printf("%8u ", counter[i]);

                       printf("\n");

                       break;

       }

    }

    return 0;

}