We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hi, this is my first thread in this forum and at the beginning i want to apologize for my English OK, I've just written small program with timer0 and interrupt. I want to toggle one of the LED on board, but...It doesn't work and I really don't know what's wrong with this code. Each LED is lit and nothing more... Could you help with it ? Thank you in advance and best regards :)
#ifdef __USE_CMSIS #include "LPC17xx.h" #endif #include <cr_section_macros.h> #include <NXP/crp.h> // Variable to store CRP value in. Will be placed automatically // by the linker when "Enable Code Read Protect" selected. // See crp.h header for more information __CRP const unsigned int CRP_WORD = CRP_NO_CRP ; // TODO: insert other include files here // TODO: insert other definitions and declarations here int main(void) { LPC_GPIO2->FIODIR |= 1 << 29; LPC_SC->PCONP |= 1 << 1; LPC_SC->PCLKSEL0 |= 1 << 3; LPC_TIM0->TCR |= 0x00000002; LPC_TIM0->MCR |= 0x00000003; LPC_TIM0->MR0 |= 6000000; NVIC_EnableIRQ(TIMER0_IRQn); LPC_TIM0->TCR |= 0x00000001; while(1){} return 0 ; } void TIMER0_IRQHandler (void) { if((LPC_TIM0->IR & 0x01) == 0x01) { LPC_TIM0->IR |= 1 << 0; LPC_GPIO2->FIOPIN ^= 1 << 29; } }
OK, I've just corrected my code and now works better. I know how to read ADC register, I make it in main loop but the logic of LEDs is still bad. It works only one way - you talked about it. The LEDs don't turn off but turning on works very well. Any snippet ? And small prompt ? Thank you for all answers and advices... :)
My code:
/* =============================================================================== Name : main.c Author : Version : Copyright : Copyright (C) Description : main definition =============================================================================== */ #ifdef __USE_CMSIS #include "LPC17xx.h" #endif #include <cr_section_macros.h> #include <NXP/crp.h> // Variable to store CRP value in. Will be placed automatically // by the linker when "Enable Code Read Protect" selected. // See crp.h header for more information __CRP const unsigned int CRP_WORD = CRP_NO_CRP ; // TODO: insert other include files here #include <math.h> #include <stdio.h> // TODO: insert other definitions and declarations here int adc_config(void); uint16_t prevVal,curVal,errCnt; uint16_t readADC(); int main(void) { int i; errCnt = 0; const unsigned int led_state[] = { 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff }; LPC_GPIO2->FIODIR = 0x000000FF; adc_config(); while(1) { i = readADC(); //printf("i = %d",i); LPC_GPIO2->FIOSET = led_state[(i >> 9) & 7]; } return 0 ; } int adc_config(void) { LPC_SC->PCONP |= 1 << 12; // power for adc LPC_ADC->ADCR |= (1 << 5) | (1 << 21); // bit for ADC0.5 input and PDN mode is operational LPC_SC->PCLKSEL0 |= 0; //clock for ADC - adcclk = pclk/4 = 3Mhz LPC_PINCON->PINSEL3 |= (1 << 30) | (1 << 31); //activate adc function on pin P1.31 //LPC_ADC->ADINTEN = 1 << 8; //enable interrupts for channel 0 //NVIC_EnableIRQ(ADC_IRQn); } /*void ADC_IRQHandler(void) { }*/ uint16_t readADC() { LPC_ADC->ADCR |= 1 << 24;// start conversion. while(!(LPC_ADC->ADGDR & (1 << 31))); // wait for completion of coversion curVal = (LPC_ADC->ADGDR >> 4) & 0x0fff; if(errCnt >= 3) { prevVal = curVal; } if(abs((curVal - prevVal) > 20)) { curVal = prevVal; errCnt++; } else { errCnt = 0; } prevVal = curVal; return curVal; }
Not sure if you actually used the processor user manual, or if you just looked at any blinky application.
But when you did find the FIOSET register - didn't you then also find any FIOCLR register?
By the way - I see you wrote a hysterese function to reduce problems with noise from the potentiometer. But why did you select a variable name errCnt? Where is the error?
Another thing - why is curVal a global variable? You give it a value the first thing you do in the readADC() function - and then you return the value of curVal - so no need to retain the value of it until next call...
OK, I did it. Now it works good :) LEDs turns off too :) I only added one line:
LPC_GPIO2->FIOCLR =~(led_state[(i >> 9) & 7]);
When I negate table's value and send it to FIOCLR register LEDs turns off. I knew about this register, but as I said I have many habits from AVR...I forgot that, if I want to turn off LEDs I must write "1" to the bits of FIOCLR.
But AVRs also have SET and CLEAR registers for their port bits - don't they?!
In a previous post he mentioned ATmega32 so no, there is no set/clr. There is only a direction , port and input read register (DDR, PORT,PIN)
Alex