Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdint.h>
- #include <stdbool.h>
- #include "include/AT91SAM9263.h"
- #define PIO_PER_B (volatile unsigned int *) AT91C_PIOB_PER //enables PIO control of corresponding pin
- #define PIO_OER_B (volatile unsigned int *) AT91C_PIOB_OER //enables output
- #define PIO_SODR_B (volatile unsigned int *) AT91C_PIOB_SODR//sets data on the I/O line
- #define PIO_CODR_B (volatile unsigned int *) AT91C_PIOB_CODR //clears data on I/O line
- #define PMC_PCER (volatile unsigned int *) AT91C_PMC_PCER
- #define PIO_PER_C (volatile unsigned int *) AT91C_PIOC_PER
- #define PIO_OER_C (volatile unsigned int *) AT91C_PIOC_OER
- #define PIO_SODR_C (volatile unsigned int *) AT91C_PIOC_SODR
- #define PIO_CODR_C (volatile unsigned int *) AT91C_PIOC_CODR
- #define PIO_ODR_C (volatile unsigned int *) AT91C_PIOC_ODR //disable output (enables input) on I/O line
- #define PIO_PUER_C (volatile unsigned int *) AT91C_PIOB_PPUER //pull-up
- #define PIO_PDSR_C (volatile unsigned int *) AT91C_PIOC_PDSR //pin data status, when 0 on I/O line returns 0
- #define DELAY_TIME 100
- #define LED1 (1 << 8) //PB8
- #define LED2 (1 << 29) //PC29
- #define RIGHTCLIC (1 << 4) //PC4
- #define LEFTCLIC (1 << 5) //PC5
- #define PID4 (1 << 4) //enable clock input for port C
- #define PIT_MR (volatile unsigned int *) AT91C_PITC_PIMR //RW mode register
- #define PIT_PIVR (volatile unsigned int *) AT91C_PITC_PIVR //reading this register clears counter and flag
- #define PIT_SR (volatile unsigned int *) AT91C_PITC_PISR //status register, when counting =0
- #define PITIEN (1<<25) //interapt register
- #define PITEN (1<<24) // PIT enable
- #define DELAY_IN_SEC (0.001)
- #define PIV ( (DELAY_IN_SEC / (160*0.000000001) ) - 1)
- void delay_ms (int delay){
- delay *=10;
- unsigned int i;
- for(i = 0; i < delay; i++){
- volatile unsigned int j;
- for(j=0; j<1275; j++);
- }
- }
- void ConfigureLEDs (void)
- {
- *PIO_PER_B = LED1;
- *PIO_OER_B = LED1;
- *PIO_PER_C = LED2;
- *PIO_OER_C = LED2;
- *PIO_SODR_B = LED1;
- *PIO_SODR_C = LED2;
- }
- void ConfigureButtons (void) {
- //enable peripherial control of both pins
- *PIO_PER_C = RIGHTCLIC;
- *PIO_PER_C = LEFTCLIC;
- //disable output, which means that the port works as input
- *PIO_ODR_C = RIGHTCLIC;
- *PIO_ODR_C = LEFTCLIC;
- *PIO_PUER_C = RIGHTCLIC;
- *PIO_PUER_C = LEFTCLIC;
- //enable clock
- *PMC_PCER = PID4;
- }
- void PIT_Init (void) {
- *PIT_MR = PIV;
- *PIT_MR &= ~(PITIEN | PITEN);
- //1, program delay
- volatile unsigned int clear = *PIT_PIVR; //reset counter and clear flag
- }
- void PIT_delay_ms (int delay_in_ms ) {
- volatile unsigned int clear;
- int counter = 0;
- for(counter; counter < delay_in_ms; counter++) {
- *PIT_MR |= PITEN; // start timer
- while(*PIT_SR == 0){} //wait for the flag
- *PIT_MR &= ~(PITEN); //stop timer
- clear = *PIT_PIVR; //clear clock
- }
- }
- void CheckButton (void) {
- if ( *PIO_PDSR_C == (1 << 4 ) ) {
- *PIO_CODR_C = LED2;
- }
- if ( *PIO_PDSR_C == (1 << 5 ) ) {
- *PIO_SODR_C = LED2;
- }
- }
- int main(void) {
- ConfigureLEDs();
- ConfigureButtons();
- PIT_Init();
- while(1){
- int counter;
- *PIO_CODR_B = LED1; //turn on LED1
- for(counter = 0; counter < 100; counter++){
- PIT_delay_ms(10);
- CheckButton();
- }
- *PIO_SODR_B = LED1; //turn off LED2
- for(counter = 0; counter < 100; counter++){
- PIT_delay_ms(10);
- CheckButton();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement