Cómo almacenar el valor OCR1A en ATmega16

0

Estoy trabajando en un proyecto de robótica. Usando los temporizadores en ATmega16, estoy controlando los servomotores. Al incrementar el valor de OCR1A, estoy manipulando el servomotor. Después de obtener la posición deseada del servo, quiero almacenar el valor de OCR1A para esa posición para poder usarlo luego para obtener la misma posición.

OCR1A es un registro de 16 bits. ¿Cómo puedo almacenar este valor? ¿Las variables harán el trabajo?

    
pregunta user3052614

1 respuesta

2
#include <avr/io.h>

// declaration of a global variable
unsigned int my_global_16bit_variable;

int main(void)
{
    // declaration of a local variable
    unsigned int my_local_16bit_variable = 0;

    my_local_16bit_variable = OCR1A;   // assign value to the local variable
    my_global_16bit_variable = OCR1A;   // assign value to the global variable

    while(1)
    {

    }
}

La variable local solo es válida dentro de main, se puede acceder a la variable global desde cualquier lugar.

Si pretende utilizar la variable, se comparte entre una función y una interrupción, entonces debe declararse como global volátil.

#include <avr/io.h>

// declaration of a global variable
volatile unsigned int my_global_16bit_variable;
.....

Para almacenar una variable en el eeprom interno de AVR

#include <avr/io.h>
#include <avr/eeprom.h>

// macro for easier usage
#define read_eeprom_word(address) eeprom_read_word ((const uint16_t*)address)
#define write_eeprom_word(address,value) eeprom_write_word ((uint16_t*)address,(uint16_t)value)

//declare an eeprom variable
unsigned int EEMEM   my_eeprom_word;

int main(void)
{

write_eeprom_word(&my_eeprom_word,OCR1A);       // store value in eeprom

OCR1A = read_eeprom_word(&my_eeprom_word);     // restore from eeprom

    while(1)
    {

    }
}

La longitud de la variable se muestra en stdint.h

Tipos de enteros que tienen exactamente el ancho especificado

typedef signed char     int8_t
typedef unsigned char   uint8_t
typedef signed int  int16_t
typedef unsigned int    uint16_t
typedef signed long int     int32_t
typedef unsigned long int   uint32_t
typedef signed long long int    int64_t
typedef unsigned long long int  uint64_t

Puedes usar unsigned int o unt16_t , prefiero el formato uintxx_t

    
respondido por el alexan_e

Lea otras preguntas en las etiquetas