peter@521: /* peter@521: This file is part of CanFestival, a library implementing CanOpen Stack. peter@521: peter@521: Copyright (C): Edouard TISSERANT and Francis DUPIN peter@521: ARM Port: Peter CHRISTEN peter@521: peter@521: See COPYING file for copyrights details. peter@521: peter@521: This library is free software; you can redistribute it and/or peter@521: modify it under the terms of the GNU Lesser General Public peter@521: License as published by the Free Software Foundation; either peter@521: version 2.1 of the License, or (at your option) any later version. peter@521: peter@521: This library is distributed in the hope that it will be useful, peter@521: but WITHOUT ANY WARRANTY; without even the implied warranty of peter@521: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU peter@521: Lesser General Public License for more details. peter@521: peter@521: You should have received a copy of the GNU Lesser General Public peter@521: License along with this library; if not, write to the Free Software peter@521: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA peter@521: */ peter@521: peter@521: // Include Standard LIB files peter@521: #include "AT91SAM7X-EK.h" peter@521: #include peter@521: #include "config.h" peter@521: #include "io_macro.h" peter@521: /************************* CANopen includes **********************************/ peter@521: #include "canfestival.h" peter@521: #include "objdict.h" peter@521: #include "can_AT91.h" peter@521: peter@521: // Waiting time between AT91B_LED1 and AT91B_LED2 peter@521: #define WAIT_TIME AT91B_MCK peter@521: peter@521: #define PIO_INTERRUPT_LEVEL 6 peter@521: #define SOFT_INTERRUPT_LEVEL 2 peter@521: #define FIQ_INTERRUPT_LEVEL 7 // Always high peter@521: peter@521: // External Function Prototype peter@521: extern void timer_init (unsigned int time); peter@521: void sys_init(); peter@521: peter@521: // Global variable peter@521: extern int timer0_interrupt; peter@521: peter@521: unsigned int leds = 0; peter@521: unsigned int keys,keys_old,keys_edge; peter@521: peter@521: unsigned char string_down[] = "1234567890x"; peter@521: unsigned char string_up[20]; peter@521: unsigned char val_down = 1; peter@521: unsigned char val_up; peter@521: unsigned char val_pdo = 1; peter@521: peter@521: // nodes peter@521: #define MEMORY_MODULE 0 peter@521: #define OUTPUT_MODULE 1 peter@521: #define IO_MODULE 2 peter@521: peter@521: // node ids peter@521: #define ID_MEMORY_MODULE 0x20 peter@521: #define ID_OUTPUT_MODULE 0x21 peter@521: #define ID_IO_MODULE 0x22 peter@521: peter@521: //---------------------------------------------------------------------------- peter@521: // Function Name : main peter@521: // Object : Main interrupt function peter@521: // Input Parameters : none peter@521: // Output Parameters : TRUE peter@521: //---------------------------------------------------------------------------- peter@521: int main(void) peter@521: // Begin peter@521: { peter@521: sys_init(); // Initialize system peter@521: timer_init(10); peter@521: canInit(CAN_BAUDRATE); // Initialize the CANopen bus peter@521: initTimer(); // Start timer for the CANopen stack peter@521: __enable_interrupt(); peter@521: setState(&ObjDict_Data, Initialisation); // Init the state peter@521: setNodeId (&ObjDict_Data, 0x7F); peter@521: setState(&ObjDict_Data, Operational); // Put the master in operational mode peter@521: peter@521: peter@521: for (;;) peter@521: { peter@521: if (timer0_interrupt) peter@521: { peter@521: timer0_interrupt = 0; peter@521: AT91F_PIO_SetOutput(AT91C_BASE_PIOB, 0x01); peter@521: peter@521: keys = ~AT91F_PIO_GetInput(AT91D_BASE_PIO_SW)>>21 & 0x1F; peter@521: peter@521: keys_edge = keys & ~keys_old; // edge detection peter@521: keys_old = keys; peter@521: peter@521: // static Message m = Message_Initializer; // contain a CAN message peter@521: peter@521: // if (canReceive(&m)) // a message received peter@521: // canDispatch(&ObjDict_Data, &m); // process it peter@521: peter@521: if (checkbit(keys_edge,0)) // edge on key 0 peter@521: { peter@521: masterSendNMTstateChange (&ObjDict_Data, 0x00, NMT_Start_Node); peter@521: // startSYNC(&ObjDict_Data); peter@521: } peter@521: peter@521: if (checkbit(keys_edge,1)) // edge on key 1 peter@521: { peter@521: masterSendNMTstateChange (&ObjDict_Data, 0x00, NMT_Reset_Node); peter@521: // stopSYNC(&ObjDict_Data); peter@521: } peter@521: peter@521: if (checkbit(keys,2)) // edge on key 2 peter@521: { peter@521: if (!(DO1 <<= 1)) // generate running light peter@521: DO1 = 1; peter@521: sendPDOevent (&ObjDict_Data); peter@521: } peter@521: peter@521: if (checkbit(keys_edge,3)) // edge on key 3 peter@521: { peter@521: } peter@521: peter@521: peter@521: leds = DI1; peter@521: peter@521: AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, (leds << 19)); peter@521: AT91F_PIO_SetOutput(AT91C_BASE_PIOB, ~(leds << 19) & AT91B_LED_MASK); peter@521: peter@521: AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, 0x01); peter@521: } peter@521: } peter@521: } peter@521: peter@521: void sys_init() peter@521: /****************************************************************************** peter@521: Initialize the relays, the main states and the modbus protocol stack. peter@521: INPUT LOCK_STATES *lock_states peter@521: OUTPUT void peter@521: ******************************************************************************/ peter@521: { peter@521: // Enable User Reset and set its minimal assertion to 960 us peter@521: AT91C_BASE_RSTC->RSTC_RMR = AT91C_RSTC_URSTEN | (0x4<<8) | (unsigned int)(0xA5<<24); peter@521: peter@521: // First, enable the clock of the PIOs peter@521: AT91F_PMC_EnablePeriphClock (AT91C_BASE_PMC, 1 << AT91C_ID_PIOA) ; peter@521: AT91F_PMC_EnablePeriphClock (AT91C_BASE_PMC, 1 << AT91C_ID_PIOB) ; peter@521: peter@521: // then, we configure the PIO Lines corresponding to switches peter@521: // to be inputs. peter@521: AT91F_PIO_CfgInput(AT91C_BASE_PIOA, AT91B_SW_MASK) ; peter@521: // then, we configure the PIO Lines corresponding to AT91B_LEDx peter@521: // to be outputs. No need to set these pins to be driven by the PIO because it is GPIO pins only. peter@521: AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, AT91B_LED_MASK | 0xFF) ; peter@521: // Clear the AT91B_LED's. On the EK we must apply a "1" to turn off AT91B_LEDs peter@521: AT91F_PIO_SetOutput(AT91C_BASE_PIOB, AT91B_LED_MASK) ; peter@521: peter@521: AT91F_PIO_CfgOutput(AT91C_BASE_PIOA,AT91B_CAN_TRANSCEIVER_RS) ; peter@521: // Clear PA2 <=> Enable Transceiver Normal Mode (versus Standby mode) peter@521: AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,AT91B_CAN_TRANSCEIVER_RS) ; peter@521: peter@521: }