Generador de onda cuadrada con Arduino UNO Wifi Rev2

Hola, el arduino uno wifi Rev2 usa el micro Atmega4809. Este micro tiene sus registros de timer distintos a los del atmega 328p. Quería saber si alguno hizo algún codigo de generar una onda cuadrada con dicho modulo, en internet no hay mucha info y el manual del fabricante del micro no es muy entendible.

Saludos!

Hi,
Que tipo de honda cuadrada quires general ya que puedes general una positiva o positiva/negativa. Que frecuencia? Aqui para general una honda cuadrada puedes usar el PWM.

Hola, una onda de 108 kHz, con duty de 50%.
Estaba probando el siguiente código: atmega4809-getting-started-with-tca-studio/Generating_a_Dual-slope_PWM_Signal/main.c at master · microchip-pic-avr-examples/atmega4809-getting-started-with-tca-studio · GitHub

pero no obtuve la frecuencia de salida deseada.

Por favor @kikez3 no pongas códigos que apuntes a otros sitios. El sitio cae (no creo que github) y el hilo pierde cohesion.
Hay lugar de sobra para que los pegues aquí usando las etiquetas como indican las normas.
Lo que planteas requiere bajarse la hoja de datos del ATmega4809 y en este momento pelearla por tu cuenta.
No es cierto que no haya nada, mira

  1. El ATmega4809 se usa en el NANO Every, mira este posteo
  1. Este crea una libreria EveryTimerB
https://github.com/Kees-van-der-Oord/Arduino-Nano-Every-Timer-Controller-B

#ifdef ARDUINO_ARCH_MEGAAVR
#include "EveryTimerB.h"
#define Timer1 TimerB2 // use TimerB2 as a drop in replacement for Timer1
#else // assume architecture supported by TimerOne ....
#include "TimerOne.h"
#endif

// code below will now work both on the MegaAVR and AVR processors
void setup() {
Timer1.initialize();
Timer1.attachInterrupt(myisr);
Timer1.setPeriod(1000000); // like the TimerOne library this will start the timer as well
}

void myisr() {
// do something useful every second
}

Muchas gracias por la ayuda. Pude lograr generar una señal cuadrada de 108 kHz. El problema está en que no puedo hacerlo en cualquier pin, de hecho solo puedo generarlo en los pines 0 de cada puerto. El problema lo tengo en la línea:

void PORT_init(void)
{
 /* set pin 0 of PORT A as output */
 PORTA.DIR |= PIN0_bm;
}

Si cambio PORTA por B, C, D,E anda sin problemas en el pin 0 de esos puertos. Pero yo necesito la salida sobre el D3, que según el pinout es PORTF, PIN5.

El código es:

#define PERIOD_EXAMPLE_VALUE        (0x004A)  // 
#define DUTY_CYCLE_EXAMPLE_VALUE    (0x0025)   //

volatile bool estado = LOW;

#include <avr/io.h>
/*Using default clock 16 MHz */

void TCA0_init(void);
void PORT_init(void);

void TCA0_init(void)
{
    /* set waveform output on PORT A, para puerto F cambiar por PORTF */
    //PORTMUX.TCAROUTEA = PORTMUX_TCA0_PORTA_gc;
    PORTMUX.TCAROUTEA = PORTMUX_TCA0_PORTF_gc;

    
    TCA0.SINGLE.CTRLB = TCA_SINGLE_CMP0EN_bm            /* enable compare channel 0 */
                      | TCA_SINGLE_WGMODE_DSBOTTOM_gc;    /* set dual-slope PWM mode */
    
    /* disable event counting */
    TCA0.SINGLE.EVCTRL &= ~(TCA_SINGLE_CNTEI_bm); 
    
    /* set PWM frequency and duty cycle (50%) */
    TCA0.SINGLE.PERBUF  = PERIOD_EXAMPLE_VALUE;       
    TCA0.SINGLE.CMP0BUF = DUTY_CYCLE_EXAMPLE_VALUE;  
    
    TCA0.SINGLE.CTRLA = TCA_SINGLE_CLKSEL_DIV1_gc        /* set clock source (sys_clk/4) -- para 108 kHz: TCA_SINGLE_CLKSEL_DIV2_gc, para 1 kHz TCA_SINGLE_CLKSEL_DIV4_gc*/   
                      | TCA_SINGLE_ENABLE_bm;           /* start timer */
}

void PORT_init(void)
{    
    /* set pin 0 of PORT A as output: 0: D2, D3: es el pin 5 del puerto F */    
    //PORTA.DIR |= PIN0_bm;

    PORTF.DIR |= PIN5bm;
    
}

void setup()
{


    PORT_init();    
    TCA0_init();
    
    /* Replace with your application code */

}

void loop(){

  


} 

Alguna idea? Gracias!

Estimado, busca la hoja de datos del Atmega4809 que usa el NANO Every.
El Nano Every suporta PWM en los siguientes pines

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.