//Escribir un programa qeu de de forma arbitraria modifique la frecuencia y el ancho del pulso.
//Donde "F" incrementa la frecuencia, "f" lo contrario, y "V" incrementa el pulso (volumen), y "v" minuscula lo contrario, la salida sera en PH6
// ticks = ? t = 1/440 Hz
// = ((Fcpu/256)/440) -1 = 142-1
#include <avr/io.h>
#define INC_VALUE 5
uint8_t volumen = 50;
void UART0_INI()
{
UCSR0A = 0; //U2X = 0 (Double speed)
UCSR0B = (0<<RXCIE0) | (0<<TXCIE0) | (0<<UCSZ02)| (1<<RXEN0) | (1<<TXEN0); // Interrpution Enable | 9bits-data?| Recieve disabled | Transmit Enable
UCSR0C = (1<UMSEL00) | (0<<UPM00) | (0<<USBS0) | (3<<UCSZ00); // Mode | Parity disabled | 2bit-stop | 8bit-Size
UBRR0 = 8; //115200 e=-3.5%
//sei();
}
void UART0_PUTS(char *str)
{
while(*str)
{
UART0_PUTCHAR(*str); //Toma el dato
str++; //Aumenta el apuntador
}
}
void UART0_PUTCHAR(char data)
{
while(!(UCSR0A & (1<<UDRE0)))
;
UDR0 = data;
}
char UART0_GETCHAR ()
{
//while(!UART0_DATA_AVBL)
// ;
while(!(UCSR0A & (1<<RXC0)))
;
return UDR0;
}
void TIMER_INI()
{
//Initialize Timer0 for OC0A (PB7) outuput
TCCR2A = (2 << COM0B0) | (3 << WGM00); //non-inverted PWM on OC2B. FAST PWM ENABLE, OCRA top
OCR2A = 142-1; //~440hz
OCR2B = (OCR2A * volumen); //50%
TCCR2B = (1 << WGM22 ) | (6 << CS00); //Timer enabled
}
int main(void)
{
//Configure PH6 as output
DDRH |= 1 << PH6;
TIMER_INI();
UART0_INI();
UART0_PUTS("TECLEO\n");
while(1)
{
char tecla = UART0_GETCHAR();
UART0_PUTCHAR(tecla);
switch(tecla){
case 'F':
if(OCR2A >= INC_VALUE)
OCR2A-=INC_VALUE;
break;
case 'f':
if(OCR2A <= (255 - INC_VALUE))
OCR2A+=INC_VALUE;
break;
case 'V':
if(volumen <= (255 - INC_VALUE))
volumen+=INC_VALUE;
break;
case 'v':
if(volumen > (INC_VALUE))
volumen-=INC_VALUE;
break;
}
OCR2B = (OCR2A * volumen) / 100; //50%
}
return 0;
}