We appreciate your visit to Implement and test a function called get elapsed time to compute the elapsed time from power up in an ATMEGA328P microcontroller using C Language on. This page offers clear insights and highlights the essential aspects of the topic. Our goal is to provide a helpful and engaging learning experience. Explore the content and find the answers you need!
Answer :
For implementing the code, you can run it on your Arduino Uno board or simulate it using Tinkercad to test the functionality and verify the elapsed time calculations.
The implementation and testing of the function called get_elapsed_time that computes the elapsed time from power-up in an ATMEGA328P microcontroller is a crucial part of microcontroller programming. The program would use a designated 16-bit timer in normal mode, with overflow interrupt handling.
Time calculation would be accurate to the nearest timer update "tick."Here is a sample program that you can use for your implementation and testing of the function in TinkerCad Circuits, which is provided in "Lecture 9: Implementing Timer Overflow ISR." Use Timer 1 and set it up in normal operational mode so that it overflows about once every 0.25 seconds. Create a global 32-bit unsigned integer variable called counter.
Implement an interrupt service routine that increments counter by 1 every time the timer overflows. Implement a function called get_elapsed_time() that returns the elapsed time since program start, accurate to the nearest timer stick", as a double-precision floating-point value. Follow the detailed specification laid out in comments in the program skeleton below.
The code implementation for the function called get_elapsed_time that computes the elapsed time from power-up in a ATMEGA328P microcontroller is as follows:
#include
#include
#include
#include
#include
#include
#include
#include
void uart_setup(void);
void uart_put_byte(unsigned char byte_val);
void uart_printf(const char * fmt, ...);
void setup(void) {
// (a) Initialise Timer 1 in normal mode so that it overflows
// with a period of approximately 0.25 seconds.
TCCR1B |= (1 << WGM12) | (1 << CS12) | (1 << CS10);
OCR1A = 62499;
TCCR1A = 0x00;
TIMSK1 = (1 << TOIE1);
sei();
// (d) Send a debugging message to the serial port using
// the uart_printf function defined below. The message should consist of
// your student number, "n10507621", followed immediately by a comma,
// followed by the pre-scale factor that corresponds to a timer overflow
// period of approximately 0.25 seconds. Terminate the
// debugging message with a carriage-return-linefeed pair, "\r\n".
uart_printf("n10507621,256\r\n");
}
volatile uint32_t counter = 0;
ISR(TIMER1_OVF_vect)
{
counter++;
}
double get_elapsed_time()
{
double tick = 1.0 / 16000000.0; // clock tick time
double elapsed = (double)counter * 0.25;
return elapsed;
}
// -------------------------------------------------
// Helper functions.
// -------------------------------------------------
// Make sure this is not too big!
char buffer[100];
void uart_setup(void) {
#define BAUD (9600)
#define UBRR (F_CPU / 16 / BAUD - 1)
UBRR0H = UBRR >> 8;
UBRR0L = UBRR & 0b11111111;
UCSR0B = (1 << RXEN0) | (1 << TXEN0);
UCSR0C = (3 << UCSZ00);
}
void uart_printf(const char * fmt, ...) {
va_list args;
va_start(args, fmt);
vsnprintf(buffer, sizeof(buffer), fmt, args);
for (int i = 0; buffer[i]; i++) {
uart_put_byte(buffer[i]);
}
}
#ifndef __AMS__
void uart_put_byte(unsigned char data) {
while (!(UCSR0A & (1 << UDRE0))) { /* Wait */ }
UDR0 = data;
}
#endif
int main() {
uart_setup();
setup();
for (;;) {
double time_now = get_elapsed_time();
uart_printf("Elapsed time = %d.%03d\r\n", (int)time_now, (int)((time_now - (int)time_now) * 1000));
_delay_ms(1000);
}
return 0;
}
Notes: Ensure you do not use the static qualifier for global variables, as this causes variables declared at file scope to be made private and will prevent AMS from marking your submission.
Learn more about code:
https://brainly.com/question/30270911
#SPJ11
Thanks for taking the time to read Implement and test a function called get elapsed time to compute the elapsed time from power up in an ATMEGA328P microcontroller using C Language on. We hope the insights shared have been valuable and enhanced your understanding of the topic. Don�t hesitate to browse our website for more informative and engaging content!
- Why do Businesses Exist Why does Starbucks Exist What Service does Starbucks Provide Really what is their product.
- The pattern of numbers below is an arithmetic sequence tex 14 24 34 44 54 ldots tex Which statement describes the recursive function used to..
- Morgan felt the need to streamline Edison Electric What changes did Morgan make.
Rewritten by : Barada