//*---------------------------------------------------------------------------- //* 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); 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 test1; int test2; int SendeWert=4095; // 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 int EmpfangeHigh; int EmpfangeLow; int SchleifenZaehler; int high=0; int low=0; int lock; int low_min=0x00000FFF; int low_max=0; int low_diff=0; int high_min=0x00000FFF; int high_max=0; int high_diff=0; //*-------------------------------------------------------------------------------------- //* 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 for(i = 2; i >=1; i--) ; }//* End void SendeWertHoch(void) { SendeWert++; } void init_SPI(void) { //------------------------------------------------------------------- // Konfiguration der SPI Schnittstelle (Funktionstest: 19.12.2006) //------------------------------------------------------------------- AT91F_SPI0_CfgPMC(); // PMC AT91F_SPI0_CfgPIO(); // PIO Config. AT91F_SPI_Disable(AT91C_BASE_SPI0); // SPI0 ausschalten 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) = 0x08001942; // SPI0: Chip Select Register,Anzahl der Transferbits=12 // und Teilungsfaktor mainCLK/19hex = 1,9MHz // NCPHA = 1 AT91F_SPI_Enable(AT91C_BASE_SPI0); // Einschalten des SPI0 } //*-------------------------------------------------------------------------------------- //* 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(); init_SPI(); //------------------------------------------------------------------- // 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 //----------------------------------------------------------------- // 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 SchleifenZaehler = 0; 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; lock=0; AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, AT91C_PIO_PA11 ) ; // SYNC low wait(); AT91F_PIO_SetOutput( AT91C_BASE_PIOA, AT91C_PIO_PA11 ); // SYNC high // init_SPI(); } DRDY = (*(volatile unsigned int*)0xFFFFF43C); // laut Beschreibung: "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) ) // { EmpfangeHigh = 0; // für die ersten 12bit (mit dem MSB) EmpfangeLow = 0; // für die zweiten 12bit (mit LSB) AT91F_SPI_PutChar(AT91C_BASE_SPI0,SendeWert,0); // senden von Wert "SendeWert" über chipselect cs=0 while (((*(volatile unsigned int*)0xFFFE0010) & 0x00000001) == 0); // abwarten bis das RDRF bit gesetzt wird EmpfangeHigh = AT91F_SPI_GetChar(AT91C_BASE_SPI0); // Daten aus dem register lesen high = (high + EmpfangeHigh); while (((*(volatile unsigned int*)0xFFFE0010) & 0x00000002) == 0); // solange TDRE gleich null ist sind nicht alle Daten gesendet worden // init_SPI(); AT91F_SPI_PutChar(AT91C_BASE_SPI0,SendeWert,0); // senden von Wert "SendeWert" über chipselect cs=0 while (((*(volatile unsigned int*)0xFFFE0010) & 0x00000001) == 0); EmpfangeLow = AT91F_SPI_GetChar(AT91C_BASE_SPI0); low = (low + EmpfangeLow); SW_abfrage = 0; rprintf("\n high Wert: %x, low Wert: %x\n",EmpfangeHigh,EmpfangeLow); SchleifenZaehler++; if (high_max < EmpfangeHigh) // high: Bildung von Maximalwert { high_max = EmpfangeHigh; } if (low_max < EmpfangeLow) // low: Bildung von Maximalwert { low_max = EmpfangeLow; } if((high_min > EmpfangeHigh) && (EmpfangeHigh > 0)) // high: Minimalwert { high_min = EmpfangeHigh; } if((low_min > EmpfangeLow) && (EmpfangeLow > 0)) // low: Minimalwert { low_min = EmpfangeLow; } high_diff = high_max - high_min; // high: Differenzwert low_diff = low_max - low_min; // low: Differenzwert } if (SchleifenZaehler >= 100) { high = (high / SchleifenZaehler); low = (low / SchleifenZaehler); rprintf("\n Mittelwert aus %u Werten-> high: %x, low Wert: %x\n",SchleifenZaehler,high,low); rprintf("Aus %u Messungen in hex = high_max: %x, high_min: %x\n",SchleifenZaehler,high_max,high_min); rprintf("Aus %u Messungen in hex = low_max: %x, low_min: %x\n",SchleifenZaehler,low_max,low_min); rprintf("in hex= high_Differenz: %x, low_Differenz: %x \n",high_diff,low_diff); high=0; low=0; low_min=0x00000FFF; low_max=0; low_diff=0; high_min=0x00000FFF; high_max=0; high_diff=0; SchleifenZaehler = 0; } } // End for for(;;) } // End for main