Пн янв 16, 2017 14:20:25
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 13.01.2017
Author :
Company :
Comments:
Chip type : ATmega32L
Program type : Application
AVR Core Clock frequency: 16,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 512
*****************************************************/
#include <mega32.h>
#include <delay.h>
#include <sleep.h>
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
}
// Declare your global variables here
//int flag_on, flag_off;
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0xFF;
DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTD=0x7F;
DDRD=0x80;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz
// Mode: Fast PWM top=0xFF
// OC2 output: Non-Inverted PWM
ASSR=0x00;
TCCR2=0x69;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: On
// INT1 Mode: Any change
// INT2: Off
GICR|=0x80;
MCUCR=0x04;
MCUCSR=0x00;
GIFR=0x80;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// USART initialization
// USART disabled
UCSRB=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC disabled
ADCSRA=0x00;
// SPI initialization
// SPI disabled
SPCR=0x00;
// TWI initialization
// TWI disabled
TWCR=0x00;
#asm("sei")
while (1)
{
if(PIND.3==1 && OCR2<0xFF)
{
TCCR2=0x6D;
OCR2=OCR2+0x01;
delay_ms(10);
}
if(PIND.3==0 && OCR2>0x00) //закрыли дверь
{
TCCR2=0x6D;
OCR2=OCR2-0x01;
delay_ms(10);
}
if(PIND.3==0 && OCR2==0x00) //лампа погасла
{
TCCR2=0x00; //отключение ШИМ
PORTD.7=0;
//MCUCR=0x00;
sleep_enable(); ////// ЗДЕСЬ ЛОЖИМСЯ СПАТЬ
idle(); //////
}
if(PIND.3==1 && OCR2==0xFF)
{
TCCR2=0x6D;
PORTD.7=1;
}
Вт янв 17, 2017 08:55:07
Вт янв 17, 2017 22:38:01
Ср янв 18, 2017 14:56:25
ferio писал(а):мое событие - переход или из 1 в 0, или из 0 в 1. а не постоянный уровень.
Ср янв 18, 2017 15:13:17
В какой-то меге есть такая возможность?krash_artem писал(а):А если после нажатия менять настройку постоянного уровня?
Ср янв 18, 2017 15:40:59
Ср янв 18, 2017 18:48:05
В какой-то меге есть такая возможность?
ferio, Вам кнопку обязательно в роли тумблера использовать? Еще в мегах есть внешнее прерывание PCINT, не во всех.
Ср янв 18, 2017 19:00:41
Z_h_e писал(а):В какой-то меге есть такая возможность?
ferio писал(а):В какой-то меге есть такая возможность?
да, вот тоже идея ясна, а реализация нет. прерывание только по низкому уровню
Ср янв 18, 2017 19:01:22
Ср янв 18, 2017 19:06:15
krash_artem писал(а):Тогда почему бы не использовать прерывание по смене логического уровня? А уж в обработчике прерывания решать, что же именно делать.
Ср янв 18, 2017 19:07:10
Вы крайне невнимательны. Данное прерывание не работает в зимней спячке в режиме power-down.krash_artem писал(а):Тогда почему бы не использовать прерывание по смене логического уровня? А уж в обработчике прерывания решать, что же именно делать.
Ср янв 18, 2017 19:12:20
Ср янв 18, 2017 19:16:37
Смотрите ДШ и выберете МК под задачу. Мега32 имеет не лучшую периферию из avr и для такой задачи хват 1КБ флеш с запасом и количество пинов рабочих Вам только два нужно.Я не против использования другого МК, если мне точно скажете , что вариант с PCINT рабочий, завтра пойду - куплю, мега32 просто под рукой была....
7.1.3 Power-down Mode
When the SM[1:0] bits are written to 10, the SLEEP instruction makes the MCU enter Powerdown mode. In this mode, the Oscillator is stopped, while the external interrupts, and the Watchdog continue operating (if enabled). Only an External Reset, a Watchdog Reset, a Brown-out
Reset, an external level interrupt on INT0, or a pin change interrupt can wake up the MCU. This
sleep mode halts all generated clocks, allowing operation of asynchronous modules only.
Вы не гадайте. Берите МК, читайте на него ДШ.krash_artem писал(а):Да уж и снова я мимо. Так, а если INT2?
Ср янв 18, 2017 19:37:35
Ср янв 18, 2017 19:45:24
Чт янв 19, 2017 04:34:41
krash_artem писал(а):Z_h_e писал(а):Вы не гадайте. Берите МК, читайте на него ДШ.
Пробуждение от ИНТ2 имеется и оно работает только по фронтам.
Чт янв 19, 2017 06:21:51
ferio писал(а):захожу в генератор кода CVAR. по int2 там только или Falling или Rising, any change нет(
ps. я возьму другой мк и попробую PCINT, возможно получится
Чт янв 19, 2017 06:22:52
Чт янв 19, 2017 08:37:39
krash_artem писал(а):Ну да, просто работаем по фронтам. После срабатывания прерывания по одному фронту, переключаемся на срабатывание по другому фронту.
Чт янв 19, 2017 19:04:01
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 13.01.2017
Author :
Company :
Comments:
Chip type : ATmega32L
Program type : Application
AVR Core Clock frequency: 16,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 512
*****************************************************/
#include <mega32.h>
#include <delay.h>
#include <sleep.h>
// External Interrupt 1 service routine
interrupt [EXT_INT2] void ext_int2_isr(void)
{
}
// Declare your global variables here
//int flag_on, flag_off;
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0xFF;
DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=P State1=T State0=T
PORTB=0x04;
DDRB=0x00;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTD=0x7F;
DDRD=0x80;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz
// Mode: Fast PWM top=0xFF
// OC2 output: Non-Inverted PWM
ASSR=0x00;
TCCR2=0x69;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: On
// INT2 Mode: Rising Edge
GICR|=0x20;
MCUCR=0x00;
//MCUCSR=0x40;
GIFR=0x20;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// USART initialization
// USART disabled
UCSRB=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC disabled
ADCSRA=0x00;
// SPI initialization
// SPI disabled
SPCR=0x00;
// TWI initialization
// TWI disabled
TWCR=0x00;
#asm("sei") //PIND.3==1 - INT1
while (1)
{
if(PINB.2==1 && OCR2<0xFF) //открыли двери
{
TCCR2=0x6D;
OCR2=OCR2+0x01;
delay_ms(10);
}
if(PINB.2==0 && OCR2>0x00) //закрыли дверь
{
TCCR2=0x6D;
OCR2=OCR2-0x01;
delay_ms(10);
}
if(PINB.2==0 && OCR2==0x00) //лампа погасла
{
TCCR2=0x00; //отключение ШИМ
PORTD.7=0;
//MCUCR=0x00;
MCUCSR=0x40;
sleep_enable(); ////// ЗДЕСЬ ЛОЖИМСЯ СПАТЬ
powerdown(); //////
}
if(PINB.2==1 && OCR2==0xFF) //лампа зажглась
{
TCCR2=0x6D;
PORTD.7=1;
MCUCSR=0x00;
sleep_enable();
powerdown();
}
}
}