Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Опытный кот
Сообщения: 768
Зарегистрирован: Вс янв 19, 2014 00:55:09

Сообщение MOHCTEP »

Аlex и еще раз - спасибо за разъяснения! :) Теперь и я, с моим минимальным багажом СИ, вижу "удачность" такого подхода.
ЗЫ. Жаль, не могу повлиять на Вашу карму. :(
Ой! :shock: кармомет сработал! :)))
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 960
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда

Сообщение GARMIN »

Вот и разобрались с алгоритмом Брезенхема!
Контактная информация:
Реклама
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

Всем Доброго дня!!!!
Нашел код для работы с прерыванием, перечитал, пересмотрел многое по прерывание, но что-то программа не работает так как мне надо.
В примере где я его нашел все работает.

где, что я не учел прошу подсказать....

//Кнопка и светодиод.
//при нажатии кнопки светодиод загорается,при отжатии гаснет...
//у меня в протеусе изначально не горит, при нажатии загорается и не гаснет совсем....

// ATtiny16


#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>


ISR (INT0_vect)
{
PORTC|=(1<<1);

}


int main(void)

{
DDRC |=(1<<1);
PORTC&=~(1<<1);

MCUCR&=~(1<<0);
GICR|=(1<<6);

sei();

while(1)
{
cli();
};

}
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ROMan2947 писал(а):при нажатии загорается и не гаснет совсем
ну а чего вы хотели, если в коде есть только включение, но нет отключения?

Код: Выделить всё

ISR (INT0_vect)
{
PORTC ^= (1<<1);
}
и в главном цикле убрать запрет прерываний! как же вы будете работать с прерываниями, если запрещаете их?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

ARV писал(а):
ROMan2947 писал(а):при нажатии загорается и не гаснет совсем
ну а чего вы хотели, если в коде есть только включение, но нет отключения?

Код: Выделить всё

ISR (INT0_vect)
{
PORTC ^= (1<<1);
}
и в главном цикле убрать запрет прерываний! как же вы будете работать с прерываниями, если запрещаете их?
Я по такой же аналогии думал,но меня смущал тот момент, что в примере все работает именно по коду указанному выше...
вот ссылка на пример http://www.youtube.com/watch?v=8H7FOQp1 ... W6&index=7
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Вообще-то asm("nop") (в видео) и cli() (у Вас) в цикле - это совершенно разные вещи.

И пример в видео тоже не ахти - светодиод зажжётся только один раз при первом нажатии кнопки и больше свое состояния не поменяет. А то и вообще и без нажатия зажжётся на старте контроллера.
Контактная информация:
Реклама
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

WiseLord писал(а):Вообще-то asm("nop") (в видео) и cli() (у Вас) в цикле - это совершенно разные вещи.


Ну asm("nop") это я так понимаю на ассемблере разрешение прерывания. Ну я заменил его на Си как cli(); или я что-то недопонимаю...(
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

WiseLord писал(а):Вообще-то asm("nop") (в видео) и cli() (у Вас) в цикле - это совершенно разные вещи.

И пример в видео тоже не ахти - светодиод зажжётся только один раз при первом нажатии кнопки и больше свое состояния не поменяет. А то и вообще и без нажатия зажжётся на старте контроллера.



Блин вот такие видосы и сбивают с истинного пути...
поправьте пож. так как будет все работать, разберу все сначала...
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

я вам сказал, что и как исправить, чтобы заработало в протеусе. в реале могут быть проблемы с дребезгом контактов кнопки.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

ARV писал(а):я вам сказал, что и как исправить, чтобы заработало в протеусе. в реале могут быть проблемы с дребезгом контактов кнопки.


ну поставил я в модуль прерывания отключение светодиода,между вкл и отлк задержку вставил...но почему же у меня при нажатой кнопке светодиод все таки гаснет, а не продолжает гореть...программа обрабатывает код указанный в прерывании, почему снова не уходит в прерывание..??
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение 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;
}
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

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;
}

спасибо!!! но этот немного другая тема по-моему...
Опытный кот
Сообщения: 768
Зарегистрирован: Вс янв 19, 2014 00:55:09

Сообщение MOHCTEP »

А так?
Спойлер

Код: Выделить всё

#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;
}
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 183
Зарегистрирован: Ср янв 25, 2012 07:26:40

Сообщение acckyiboxxx »

Привожу вырезку из кода которая не хочет ни в какую симулироваться в протеусе , помогите понять почему.

Код: Выделить всё


#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){
		
	}
}
Изображение
Изображение
Изображение
Последний раз редактировалось acckyiboxxx Пт фев 19, 2016 11:59:53, всего редактировалось 1 раз.
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Переменная F1_PWM_DUTY_CYCLE не используется и никак не связана с ATOMIZER_PWM_DUTY_CYCLE. Кстати, откуда вторая вообще взялась? Как это вообще компилируется?
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

что именно у вас не симулируется, в чем проблема? в показанном куске кода вижу следующие проблемы:
1. #define F_CPU 14745600UL не должно присутствовать в коде. хотя "стандартом" допустимо, так делать не надо.
2. TCNT1H = 0x00; TCNT1L = 0xFF; вместо этого нормальные люди делают TCNT1 = 0xFF; и в других местах аналогично для всех 16-битных регистров периферии
3. TIMER2, который генерирует третий ШИМ по схеме (ОС2) не инициализируется в коде и, соответственно, ничего не делает
4. в опциях МК в протеусе задана тактовая частота в МИЛЛИгерцах. вводите частоту так, как в F_CPU, т.е. в герцах: 14745600
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 183
Зарегистрирован: Ср янв 25, 2012 07:26:40

Сообщение acckyiboxxx »

WiseLord писал(а):Переменная F1_PWM_DUTY_CYCLE не используется и никак не связана с ATOMIZER_PWM_DUTY_CYCLE. Кстати, откуда вторая вообще взялась? Как это вообще компилируется?
сорри накосячил пока выдирал не симулирующуюся часть кода из общей массы, подправил пост теперь все соответствует реальности
ARV писал(а):4. в опциях МК в протеусе задана тактовая частота в МИЛЛИгерцах. вводите частоту так, как в F_CPU, т.е. в герцах: 14745600
поменял mhz на MHz и все заработало, спасибо за помощь, вопрос снят.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

Сообщение levaclaus »

пытаюсь высчитать високосный\обычный год

Код: Выделить всё

   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);

  };
Верно ли это все?
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Для вычисления високосного года, вот этого :

Код: Выделить всё

((year+2000) % 4 == 0)
достаточно.
Даже можно 2000 убрать, ибо оно само делится нацело на 4.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

Сообщение levaclaus »

точно, согласен. Но в общем мои вычисления верны?
Ответить

Вернуться в «Разные вопросы по МК»