Editing Embedded Programming Tips and Tricks
Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.
The edit can be undone.
Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 1: | Line 1: | ||
− | =Fast Division= | + | ===Fast Division=== |
On microcontrollers without a divide instruction very fast division can be done by bit shifting a variable right.<br> | On microcontrollers without a divide instruction very fast division can be done by bit shifting a variable right.<br> | ||
Each shift does a divide by two.<br> | Each shift does a divide by two.<br> | ||
Line 19: | Line 19: | ||
Also be sure the variable size is large enough to store the multiplied value.<br> | Also be sure the variable size is large enough to store the multiplied value.<br> | ||
− | |||
− | When writing embedded code you will quite often need to | + | ===Timed Events Using Interrupts=== |
− | Over your entire project there maybe many different | + | |
+ | When writing embedded code you will quite often need to run code at a regular interval. (for example flashing an led. | ||
+ | Over your entire project there maybe many different events you wish to occur at different rates. | ||
To do this it can be useful to dedicate one of the microcontrollers hardware timers to perform all these timing tasks. | To do this it can be useful to dedicate one of the microcontrollers hardware timers to perform all these timing tasks. | ||
− | + | It is bad practice to put lots of code inside an interrupt handler so the best approach is to set flags and then test these flags inside your main program loop. | |
− | |||
− | |||
− | + | Such a system might look like this | |
+ | ==AVR== | ||
<pre> | <pre> | ||
− | + | uint16_t clk1000ms=1; | |
− | + | uint16_t clk100ms=1; | |
+ | uint8_t clk10ms=1; | ||
− | |||
− | |||
− | |||
ISR (TIMER0_OVF_vect) | ISR (TIMER0_OVF_vect) | ||
{ | { | ||
− | if (clk1000ms!= | + | if (clk1000ms!=0) |
{ | { | ||
clk1000ms++; | clk1000ms++; | ||
− | if (clk1000ms>=10001) clk1000ms= | + | if (clk1000ms>=10001) clk1000ms=0; |
} | } | ||
− | if (clk100ms!= | + | if (clk100ms!=0) |
{ | { | ||
clk100ms++; | clk100ms++; | ||
− | if (clk100ms>=1001) | + | if (clk100ms>=1001) clk500ms=0; |
} | } | ||
− | if (clk10ms!= | + | if (clk10ms!=0) |
{ | { | ||
clk10ms++; | clk10ms++; | ||
− | if (clk10ms>=101) clk10ms= | + | if (clk10ms>=101) clk10ms=0; |
} | } | ||
// Timer clock is 1mhz, timer is 8bit. | // Timer clock is 1mhz, timer is 8bit. | ||
Line 66: | Line 64: | ||
{ | { | ||
− | if (clk1000ms== | + | if (clk1000ms==0) |
{ | { | ||
// put code here to run every second | // put code here to run every second | ||
− | clk1000ms = | + | clk1000ms = 1; |
} | } | ||
− | if (clk100ms== | + | if (clk100ms==0) |
{ | { | ||
// put code here to run 10 times a second | // put code here to run 10 times a second | ||
− | clk100ms = | + | clk100ms = 1; |
} | } | ||
− | if (clk10ms== | + | if (clk10ms==0) |
{ | { | ||
// put code here to run 100 times a second | // put code here to run 100 times a second | ||
− | clk10ms = | + | clk10ms = 1; |
} | } | ||
} | } | ||
</pre> | </pre> |