Hola a todos.
Tengo un problema y necesito ayuda con un programa que estoy haciendo en donde manejo de instrucciones externas.
Compila correctamente y al momento de simularlo en Proteus trabaja tal como lo programé, pero al momento de descargarlo en mi ATMega2056 se muestra una interrupción pero no ejecuta las tareas dentro de ésta.
Principalmente lo que hace el programa es encender y apagar un led mientras no se presente alguna interrupción.
En el momento que se presenta la interrupción INT0 comenzará a incrementarse la intensidad de iluminación de otro led a través de un PWM y en el momento que se presenta la interrupción INT1 se decrementa la intensidad de iluminación del mismo led.
El programador que estoy utilizando es el USBasp y el microcontrolador es el que está montado en una tarjeta Arduino Mega la cual fue borrada para poder trabajar sobre Atmel Studio en C.
Dejo el código de mi programa:
Tengo un problema y necesito ayuda con un programa que estoy haciendo en donde manejo de instrucciones externas.
Compila correctamente y al momento de simularlo en Proteus trabaja tal como lo programé, pero al momento de descargarlo en mi ATMega2056 se muestra una interrupción pero no ejecuta las tareas dentro de ésta.
Principalmente lo que hace el programa es encender y apagar un led mientras no se presente alguna interrupción.
En el momento que se presenta la interrupción INT0 comenzará a incrementarse la intensidad de iluminación de otro led a través de un PWM y en el momento que se presenta la interrupción INT1 se decrementa la intensidad de iluminación del mismo led.
El programador que estoy utilizando es el USBasp y el microcontrolador es el que está montado en una tarjeta Arduino Mega la cual fue borrada para poder trabajar sobre Atmel Studio en C.
Dejo el código de mi programa:
C:
/*
* Dolly_project.c
*
* Created: 25/10/2018 11:51:02 a. m.
* Author : Eduardo-WCM
*/
//#ifndef F_CPU
#define F_CPU 16000000UL // set the CPU clock
//#endif
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define Max_Level 255
volatile char brightness = 0;
void PWM_UP()
{
while((PIND&0x01)==0x01 && brightness < 250)
{
brightness += 10;
OCR3A = brightness;
OCR3B = brightness;
_delay_ms(50);
}
}
void PWM_DOWN()
{
while ((PIND&0x02)==0x02 && brightness>=30)
{
brightness -= 10;
OCR3A = brightness;
OCR3B = brightness;
_delay_ms(50);
}
}
ISR (INT0_vect)
{
PORTA = (1<<PINA4)|(1<<PINA5)|(1<<PINA6);
EIFR |= (1<<INTF0);
PWM_UP();
EIFR &=~ (1<<INTF0);
}
ISR (INT1_vect)
{
EIFR |= (1<<INTF1);
PWM_DOWN();
EIFR &=~ (1<<INTF1);
}
// initialize PWM
void Config()
{
//---------------------- INTERRUPTS ---------------------------------
// cli(); //Disable interrupts
EICRA |= (1<<ISC11)|(1<<ISC10)|(1<<ISC01)|(1<<ISC00); // Interrupts are activated in rising edge
PCICR |= (1<<PCIE0);
EIMSK |= (1<<INT0)|(1<<INT1); // Enable Int1 and Int0
sei(); //Enable Interrupts
//----------------------- PWM ---------------------------------------
// initialize timer0 in PWM mode
// Waveform Generation Mode: Phase correct PW Mode, 8-bit, TOP = 0x00FF, Update OCR3x at BOTTOM, TOV3 Flag Set on TOP
TCCR3A |= (1<<WGM30);
// Compare Output Mode: Phase correct PWM, non-inverting mode, A, B and C Registers are activated
TCCR3A |= (1<<COM3A1)|(1<<COM3B1)|(1<<COM3C1);
// Clock Select: clk/64 => CS32|CS31|CS30 = 0|1|1 */
TCCR3B |= (0<<CS32)|(1<<CS31)|(1<<CS30);
// Set Timer3 pins as output : Channel A :(PE3/OC3A/AIN1) Channel B :(PE4/OC3B/INT4) Channel C :(PE5/OC3C/INT5)
DDRE |= (1<<DDE3)|(1<<DDE4)|(1<<DDE5);
DDRA = 0xFF;
DDRB = 0xFF;
DDRC = 0xFF;
DDRD = 0xF0;
_delay_ms(10);
}
int main(void)
{
Config();
OCR3A = brightness;
OCR3B = brightness;
while(1)
{
PORTA |= (1<<PINA0);
_delay_ms(50);
PORTA &=~ (1<<PINA0);
_delay_ms(50);
}
return 0;
}