Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
10 years, 5 months ago.
the delay function which i have written is not making my led blink can anyone suggest me way.....
<<code>>
- define PRESCALAR 25000 (asuming 25mhz so that (25000/25mhz)= 1 msec
Serial pc(USBTX, USBRX);
DigitalOut myled(LED1);
void pclock() {
LPC_SC->PCONP|=(1<<1);/pconp for timer
LPC_SC->PCLKSEL0|=(0<<2);cclk/4
} void inittimer()
{
pc.printf("timer\n");
LPC_TIM0->CTCR|=(0<<0); SELECT TIMER
LPC_TIM0->PR= PRESCALAR-1;/ ASSIGN PRESCALAR
int value=LPC_TIM0->PR;
pc.printf("%d\n",value);
LPC_TIM0->TCR|=(1<<0); enable timer
LPC_TIM0->TCR|=(1<<1);/ RESET TIMER
} void delay ( unsigned int millisec)
{
pc.printf("millisec\n");
LPC_TIM0->TCR|=(1<<1);/n RESET TIMER
LPC_TIM0->TCR|=(1<<0); enable timer
pc.printf("%d\n",LPC_TIM0->TC);
while(LPC_TIM0->TC < millisec);
LPC_TIM0->TCR|=(0<<0); disable timer
pc.printf("disabled\n");
}
int main() {
pclock();
inittimer();
while(1)
{
myled=1;
delay(500);
myled=0;
delay(500);
}
}
1 Answer
10 years, 5 months ago.
define PRESCALAR 25000 (asuming 25mhz so that (25000/25mhz)= 1 msec Serial pc(USBTX, USBRX); DigitalOut myled(LED1); void pclock() { LPC_SC->PCONP|=(1<<1);/pconp for timer LPC_SC->PCLKSEL0|=(0<<2);cclk/4 } void inittimer() { pc.printf("timer\n"); LPC_TIM0->CTCR|=(0<<0); SELECT TIMER LPC_TIM0->PR= PRESCALAR-1;/ ASSIGN PRESCALAR int value=LPC_TIM0->PR; pc.printf("%d\n",value); LPC_TIM0->TCR|=(1<<0); enable timer LPC_TIM0->TCR|=(1<<1);/ RESET TIMER } void delay ( unsigned int millisec) { pc.printf("millisec\n"); LPC_TIM0->TCR|=(1<<1);/n RESET TIMER LPC_TIM0->TCR|=(1<<0); enable timer pc.printf("%d\n",LPC_TIM0->TC); while(LPC_TIM0->TC < millisec); LPC_TIM0->TCR|=(0<<0); disable timer pc.printf("disabled\n"); } int main() { pclock(); inittimer(); while(1) { myled=1; delay(500); myled=0; delay(500); } }
Looks like I can't respond anymore with an answer, only with comments. First of all, add <</code>> also at the end, then it gets properly formatted.
What happens if your print the value of LPC_TIM0->TC in the while loop? Then you can see if it increments and how fast. The standard speed is by the way 24MHz with a /4 prescaler (96MHz core frequency). Also doing |= (0<<0) doesn't set a bit to zero, for that you need:
LPC_TIM0->TCR&=~(1<<0);
Edit: That is also directly your issue, from the user manual:
Quote:
When one, the Timer Counter and the Prescale Counter are synchronously reset on the next positive edge of PCLK. The counters remain reset until TCR[1] is returned to zero.
Since you are assigning bits with a logical or, it never leaves reset. If you do in the third line of your delay function:
LPC_TIM0->TCR=(1<<0);
It should work. Not it just sets that register to 00000000001. Since the only two bits are reset and enable, that disables the reset and keeps it enabled.
posted by 27 May 2014Assigned to
10 years, 5 months ago.This means that the question has been accepted and is being worked on.
Please place your code between
<<code>> and <</code>>
(on seperate lines), now it is unreadable.Also what did you try to debug yourself? For example print the value of the timer to see how fast it is increasing.
posted by Erik - 27 May 2014hi have attached my link pls gothrought it adn help me
posted by Ashok K 27 May 2014hi erik i have written my code pls check and reply..
posted by Ashok K 27 May 2014