//*---------------------------------------------------------------------------- //* ATMEL Microcontroller Software Support - ROUSSET - //*---------------------------------------------------------------------------- // DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE // DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, // OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. //*---------------------------------------------------------------------------- //* File Name : main.c //* Object : main application written in C //* Creation : JPP 16/Sep/2005 //*---------------------------------------------------------------------------- // Include Standard files #include "project.h" #include #include "rprintf.h" /* Global variables */ #define SPEED ( AT91B_MAIN_OSC /1000) unsigned int LedSpeed = SPEED *2 ; const int led_mask[AT91B_NB_LEB]= {AT91B_LED1, AT91B_LED2, AT91B_LED3, AT91B_LED4}; unsigned int p = 111; unsigned int b = 222; void init_serial (void); void init_SPI (void); int sendchar (int ch); // int uart0_putc(int ch); int uart0_putchar (int ch); int uart0_puts ( char* s ); int uart0_kbhit( void ); int uart0_getc ( void ); int i=0; int test; // zur prüfung von registerwerten int test2; int SendeWert=2730; // int abfrage=1; // Tatenentprellung long int EmpfangeWert; int stand=1; // Shiften des einzulesenen Wertes kontrollieren int SW_abfrage=0; // dient der Tastenentprellung int DRDY; // ADC sendet DRDY wenn Daten zur Abholung bereit sind //*-------------------------------------------------------------------------------------- //* Function Name : change_speed //* Object : Adjust "LedSpeed" value depending on SW1 and SW2 are pressed or not //* Input Parameters : none //* Output Parameters : Update of LedSpeed value. //*-------------------------------------------------------------------------------------- void change_speed ( void ) {//* Begin if ( (AT91F_PIO_GetInput(AT91D_BASE_PIO_SW) & AT91B_SW1) == 0 ) { if ( LedSpeed > SPEED ) LedSpeed -=SPEED ; } if ( (AT91F_PIO_GetInput(AT91D_BASE_PIO_SW) & AT91B_SW3) == 0 ) { if ( LedSpeed < AT91B_MAIN_OSC ) LedSpeed +=SPEED ; } }//* End //*-------------------------------------------------------------------------------------- //* Function Name : wait //* Object : Software waiting loop //* Input Parameters : none. Waiting time is defined by the global variable LedSpeed. //* Output Parameters : none //*-------------------------------------------------------------------------------------- void wait ( void ) {//* Begin unsigned int waiting_time ; //change_speed () ; for(waiting_time = 0; waiting_time < LedSpeed; waiting_time++) ; }//* End void SendeWertHoch(void) { SendeWert++; } //*-------------------------------------------------------------------------------------- //* Function Name : Main //* Object : Software entry point //* Input Parameters : none. //* Output Parameters : none. //*-------------------------------------------------------------------------------------- int main(void) {//* Begin volatile int i; // unsigned long keystate; i = 0xDEAD; AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, ( 1 << AT91C_ID_PIOA ) | ( 1 << AT91C_ID_PIOB ) | ( 1 << AT91C_ID_US0 ) ) ; AT91F_RSTSetMode( AT91C_BASE_RSTC , AT91C_RSTC_URSTEN ); init_serial(); //------------------------------------------------------------------- // Konfiguration der IO's //------------------------------------------------------------------- AT91F_PIOA_CfgPMC(); AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, AT91C_PIO_PA11 ) ; // SYNC (out) AT91F_PIO_CfgInput(AT91C_BASE_PIOA, AT91C_PIO_PA20); // Daten (in), zur high/low prüfung von /DRDY //------------------------------------------------------------------- // Konfiguration der SPI Schnittstelle (Funktionstest: 19.12.2006) //------------------------------------------------------------------- AT91F_SPI0_CfgPMC(); // PMC AT91F_SPI0_CfgPIO(); // PIO Config. AT91F_SPI_Reset(AT91C_BASE_SPI0); // Rücksetzen des SPI0 (*(volatile unsigned int*) 0xFFFE0000) = 0x00000001; // SPI0: SPI_CR -> SPI enable (*(volatile unsigned int*) 0xFFFE0004) = 0x00000001; // SPI0: Mode Register, Setzen von MSTR (Master/Slave Mode) (*(volatile unsigned int*) 0xFFFE0030) = 0x08001940; // SPI0: Chip Select Register,Anzahl der Transferbits=12 // und Teilungsfaktor mainCLK/19hex = 1,9MHz AT91F_SPI_Enable(AT91C_BASE_SPI0); // Einschalten des SPI0 //----------------------------------------------------------------- // CLK für ADC muss erzeugt werden mittels pck //----------------------------------------------------------------- AT91F_PMC_CfgPIO(); // config für pck Clock (*(volatile unsigned int*)0xFFFFFC40) = 0x00000005; // @PB0 -> pck1 : config. PMC_PCKR -> CSS=MainCLK, PRES=4 => MainCLK 18MHz // -> 9,5MHz (*(volatile unsigned int*)0xFFFFFC00) = 0x00000101; // PMC_SCER,PMC enable -> CLK an //------------------------------------------------------------------- // //------------------------------------------------------------------- AT91F_PIO_SetOutput( AT91C_BASE_PIOA, AT91C_PIO_PA11 ); // SYNC high for (;;) // Loop forever { if ( ((AT91F_PIO_GetInput(AT91D_BASE_PIO_SW) & AT91B_SW1) == 0) && (SW_abfrage == 0) ) // wird Schalter SW1 gedrückt -> /SYNC low { SW_abfrage = 1; AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, AT91C_PIO_PA11 ) ; // SYNC low wait(); AT91F_PIO_SetOutput( AT91C_BASE_PIOA, AT91C_PIO_PA11 ); // SYNC high } DRDY = (*(volatile unsigned int*)0xFFFFF43C); // "Return PIO input value" DRDY = DRDY >> 20; // Auswertung von /DRDY, shiften von PA20 an die 0-bit position DRDY = DRDY & 0x00000001; // alles weg löschen außer 0bit if((DRDY == 0) && (SW_abfrage == 1) ) // { EmpfangeWert = 0; stand=1; for (i=2;i>=1;i--) { AT91F_SPI_PutChar(AT91C_BASE_SPI0,SendeWert,0); // senden von Wert "SendeWert" über chipselect cs=0 EmpfangeWert |= (AT91F_SPI_GetChar(AT91C_BASE_SPI0) & 0x00000FFF); test = (*(volatile unsigned int*)0xFFFE0010); // was steht im 1bit (RDRF) wenn 1 dann ist receive reg. voll test2 = (AT91F_SPI_GetChar(AT91C_BASE_SPI0)); if (stand != 0) // damit der eingelesene Wert nur einmal geshiftet wird { EmpfangeWert = EmpfangeWert << 12; // um 12bit shiften stand=0; } } SW_abfrage = 0; rprintf("empfangener Wert: %x\n",EmpfangeWert); } } // End for for(;;) } // End for main