Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "at91sam9263.h"
- // peripheral B (L_LED)
- #define PIOB_OER (volatile unsigned int*) 0xFFFFF410 // output enable register
- #define PIOB_PER (volatile unsigned int*) 0xFFFFF400 // PIO enable register
- #define PIOB_SODR (volatile unsigned int*) 0xFFFFF430 //set output data register
- #define PIOB_CODR (volatile unsigned int*) 0xFFFFF434 //clear output data register
- // peripheral C (BUTTONS and R_LED)
- #define PIOC_ODR (volatile unsigned int*) 0xFFFFF614 //disable output register
- #define PIOC_OER (volatile unsigned int*) 0xFFFFF610 // output enable register
- #define PIOC_PER (volatile unsigned int*) 0xFFFFF600 // PIO enable register
- #define PIOC_SODR (volatile unsigned int*) 0xFFFFF630 //set output data register
- #define PIOC_CODR (volatile unsigned int*) 0xFFFFF634 //clear output data register
- #define PIOC_PUER (volatile unsigned int*) 0xFFFFF664 //enables pull-up register
- #define PIOC_PUDR (volatile unsigned int*) 0xFFFFF660 //disables pull-up resistor
- #define PIOC_PDSR (volatile unsigned int*) 0xFFFFF63C //pin data status resistor
- //clock enable
- #define PMC_PCER (volatile unsigned int*) 0xFFFFFC10
- #define PIT_SR (volatile unsigned int*) 0xFFFFFD34 //status reg
- #define PIT_MR (volatile unsigned int*) 0xFFFFFD30 // mode reg
- #define PIT_PIVR (volatile unsigned int*) 0xFFFFFD38 // PIT value reg
- // const
- #define TRUE 1
- #define FALSE 0
- #define CYCLES_PER_MILISECOND 6250
- #define MILISECONDS_PER_SECONDS 1000
- #define LEFT_LED (1<<8) //B peripheral
- #define RIGHT_LED (1<<29) //C peripheral
- #define LEFT_BUTTON (1<<5) //C peripheral
- #define RIGHT_BUTTON (1<<4) //C peripheral
- #define CLOCK (1<<4)
- #define PITEN_ON (1<<24)
- #define ON_TIME 1
- #define OFF_TIME 2
- dbgu_print_ascii(const char *a) {}
- int button_pressed = FALSE;
- int diode_on = FALSE;
- int global_interrupt_flag = FALSE;
- unsigned int local_counter = 0;
- void PIT_delay_IRQ(float seconds);
- void toggle_led();
- void cfg_output();
- void cfg_input();
- int isButtonPressed(unsigned int button);
- void right_led_turn_on();
- void right_led_turn_off();
- void left_led_turn_on();
- void left_led_turn_off();
- void PIT_delay_IRQ(float seconds){ // the lowest possible value is 0.001s (1 milisecond)
- unsigned int PIT_loops = seconds * MILISECONDS_PER_SECONDS;
- AT91C_BASE_PITC->PITC_PIMR = (0x000FFFFFU & CYCLES_PER_MILISECOND); //turn on PITEN MODE
- int i = 0;
- while(TRUE){
- if((*PIT_SR) & (1<<0)){
- *PIT_PIVR; // reset
- ++i;
- if(i >= PIT_loops){
- break;
- } else if (i == (PIT_loops - 1)){
- //global_interrupt_flag = TRUE;
- //toggle_led();
- AT91C_BASE_PITC->PITC_PIMR = (AT91C_PITC_PITIEN & 0xFFFFFFFFU);
- }
- }
- }
- }
- void PIT_interrupt_handler(void){
- if(AT91C_BASE_PITC->PITC_PIMR & (AT91C_PITC_PITIEN)){
- toggle_led();
- }
- }
- void cfg_interrupts(){
- // disabling interrupt command register
- AT91C_BASE_AIC->AIC_IDCR = 1 << AT91C_ID_SYS;
- //configuring pointer for timer interrupt handler
- AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS] = (unsigned int) PIT_interrupt_handler;
- //configuring trigger method
- AT91C_BASE_AIC->AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED | AT91C_AIC_PRIOR_HIGHEST;
- //clear interrupt command register for peripherals
- AT91C_BASE_AIC->AIC_ICCR = 1 << AT91C_ID_SYS;
- //enable interrupt command register for peripherals
- AT91C_BASE_AIC->AIC_IECR = 1 << AT91C_ID_SYS;
- //enable PIT timer interrupt
- AT91C_BASE_PITC->PITC_PIMR = AT91C_PITC_PITIEN | AT91C_PITC_PITEN;
- }
- void task_2(){
- while(TRUE){
- left_led_turn_off();
- //PIT_delay(OFF_TIME);
- left_led_turn_on();
- //PIT_delay(ON_TIME);
- }
- }
- void task_1(){
- while(TRUE){
- if(is_button_pressed(LEFT_BUTTON)){
- left_led_turn_on();
- } else {
- left_led_turn_off();
- }
- }
- }
- void main(void) {
- cfg_input();
- cfg_output();
- cfg_interrupts();
- PIT_delay_IRQ(5);
- }
- void cfg_output(){
- *PIOB_PER = LEFT_LED;
- *PIOB_OER = LEFT_LED;
- *PIOB_SODR = LEFT_LED;
- *PIOC_PER = RIGHT_LED;
- *PIOC_OER = RIGHT_LED;
- right_led_turn_off();
- left_led_turn_off();
- }
- void cfg_input(){
- *PIOC_PER = LEFT_BUTTON | RIGHT_BUTTON;
- *PIOC_ODR = LEFT_BUTTON | RIGHT_BUTTON;
- *PIOC_PUER = LEFT_BUTTON | RIGHT_BUTTON;
- *PMC_PCER = (CLOCK);
- }
- void toggle_led() {
- if(diode_on) {
- left_led_turn_off(); //turns diode off by clearing output data register
- diode_on = FALSE;
- } else {
- left_led_turn_on();
- diode_on = TRUE;
- }
- }
- int is_button_pressed(unsigned int button){
- return (!(button & *PIOC_PDSR)) ? TRUE : FALSE;
- }
- void delay(int cycles){
- volatile int c = 0;
- while(c < cycles){
- c++;
- }
- }
- void right_led_turn_on(){
- *PIOC_CODR = RIGHT_LED;
- }
- void right_led_turn_off(){
- *PIOC_SODR = RIGHT_LED;
- }
- void left_led_turn_on(){
- *PIOB_CODR = LEFT_LED;
- }
- void left_led_turn_off(){
- *PIOB_SODR = LEFT_LED;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement