ЗЫ. Жаль, не могу повлиять на Вашу карму.
Ой!
ну а чего вы хотели, если в коде есть только включение, но нет отключения?ROMan2947 писал(а):при нажатии загорается и не гаснет совсем
Код: Выделить всё
ISR (INT0_vect)
{
PORTC ^= (1<<1);
}Я по такой же аналогии думал,но меня смущал тот момент, что в примере все работает именно по коду указанному выше...ARV писал(а):ну а чего вы хотели, если в коде есть только включение, но нет отключения?ROMan2947 писал(а):при нажатии загорается и не гаснет совсеми в главном цикле убрать запрет прерываний! как же вы будете работать с прерываниями, если запрещаете их?Код: Выделить всё
ISR (INT0_vect) { PORTC ^= (1<<1); }
WiseLord писал(а):Вообще-то asm("nop") (в видео) и cli() (у Вас) в цикле - это совершенно разные вещи.
WiseLord писал(а):Вообще-то asm("nop") (в видео) и cli() (у Вас) в цикле - это совершенно разные вещи.
И пример в видео тоже не ахти - светодиод зажжётся только один раз при первом нажатии кнопки и больше свое состояния не поменяет. А то и вообще и без нажатия зажжётся на старте контроллера.
ARV писал(а):я вам сказал, что и как исправить, чтобы заработало в протеусе. в реале могут быть проблемы с дребезгом контактов кнопки.
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/iom16.h>
#define LED_DDR DDRC
#define LED_PORT PORTC
#define LED (1<<1)
#define BTN_DDR DDRD
#define BTN_PIN PIND
#define BTN (1<<2)
static char status = 0;
ISR (INT0_vect)
{
if (status)
LED_PORT &= ~LED;
else
LED_PORT |= LED;
status = !status;
}
int main(void)
{
BTN_DDR &= ~BTN; // Set as input
LED_DDR |= LED; // Set as output
GICR |= (1<<INT0); // Enable INT0
MCUCR &= ~(1<<ISC10); // Any logical change
sei();
while (1) {
}
return 0;
}
WiseLord писал(а):Посмотрите на что-то вродеСпойлер
Код: Выделить всё
#include <avr/io.h> #include <avr/interrupt.h> #include <avr/iom16.h> #define LED_DDR DDRC #define LED_PORT PORTC #define LED (1<<1) #define BTN_DDR DDRD #define BTN_PIN PIND #define BTN (1<<2) static char status = 0; ISR (INT0_vect) { if (status) LED_PORT &= ~LED; else LED_PORT |= LED; status = !status; } int main(void) { BTN_DDR &= ~BTN; // Set as input LED_DDR |= LED; // Set as output GICR |= (1<<INT0); // Enable INT0 MCUCR &= ~(1<<ISC10); // Any logical change sei(); while (1) { } return 0; }
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/iom16.h>
#define LED_DDR DDRC
#define LED_PORT PORTC
#define LED (1<<1)
#define BTN_DDR DDRD
#define BTN_PORT PORTD
#define BTN (1<<2)
ISR (INT0_vect)
{
//small delay here
BTN_PORT&BTN?LED_PORT &= ~LED:LED_PORT |= LED;
}
int main(void)
{
BTN_DDR &= ~BTN; // Set as input
LED_DDR |= LED; // Set as output
GICR |= (1<<INT0); // Enable INT0
MCUCR &= ~(1<<ISC10); // Any logical change
sei();
while (1) {
}
return 0;
}Код: Выделить всё
#define F_CPU 14745600UL
#include <avr/io.h>
#include "avr/interrupt.h"
volatile uint8_t ATOMIZER_PWM_DUTY_CYCLE = 0;
void f1_pwm_init(void);
void f1_pwm_start(void);
void f1_pwm_set_dutycycle(uint8_t);
void f1_pwm_init(void){
// fast pwm
TCCR1A |= _BV(WGM10);
TCCR1B |= _BV(WGM12);
// OC1A - DIRECT ; OC1B - REVERSE
TCCR1A |= _BV(COM1A1) | _BV(COM1B0) | _BV(COM1B1);
// set counter register to 255
TCNT1H = 0x00;
TCNT1L = 0xFF;
DDRD |= _BV(DDD4) | _BV(DDD5);
}
void f1_pwm_start(void){
TCCR1B |= _BV(CS10);
}
void f1_pwm_set_dutycycle(uint8_t direct_value){
ATOMIZER_PWM_DUTY_CYCLE = direct_value;
cli();
OCR1AH = 0x00;
OCR1AL = ATOMIZER_PWM_DUTY_CYCLE / 2;
OCR1BH = 0x00;
OCR1BL = ATOMIZER_PWM_DUTY_CYCLE / 2;
sei();
}
int main(void)
{
f1_pwm_init();
f1_pwm_start();
f1_pwm_set_dutycycle(60);
while(1){
}
}



сорри накосячил пока выдирал не симулирующуюся часть кода из общей массы, подправил пост теперь все соответствует реальностиWiseLord писал(а):Переменная F1_PWM_DUTY_CYCLE не используется и никак не связана с ATOMIZER_PWM_DUTY_CYCLE. Кстати, откуда вторая вообще взялась? Как это вообще компилируется?
поменял mhz на MHz и все заработало, спасибо за помощь, вопрос снят.ARV писал(а):4. в опциях МК в протеусе задана тактовая частота в МИЛЛИгерцах. вводите частоту так, как в F_CPU, т.е. в герцах: 14745600
Код: Выделить всё
void day29_w ()
{
a = ((year+2000) % 4 == 0); // проверяем условие что число года делится нацело на 4
b = ((year+2000) % 100 == 0); // проверяем условие что число года делится нацело на 100
c = ((year+2000) % 400 == 0); // проверяем условие что число года делится нацело на 400
day29=(((a)&&(!b)||(c))==1);
};Код: Выделить всё
((year+2000) % 4 == 0)