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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Опытный кот
Сообщения: 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
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 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);

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

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

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

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

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

Сообщение levaclaus »

точно, согласен. Но в общем мои вычисления верны?
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

В общем - да. Но деление на 100 и на 400 - лишнее.
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Не всегда лишнее. Так, 1900 делится на 4, но это не високосный год.
Хотя учитывая (year+2000) автора, он явно не собирается работать с такими годами, так что да, в диапазоне 1901..2099 функция будет работать с одним только %4.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7361
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Хочу в пятом кейле сделать такую конструкцию: есть регистр, который описан как uint32_t. Я хочу его прочитать в переменную, но я еще хочу работать с его битовыми полями и потому определил структуру. Но, естесственно, я не могу сделать прямое присваивание регистра к этой структуре. Поэтому я обычно делал union:

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

union {
  struct time_reg prev_time;
  uint32_t prev_time_word;
}
В IARе этот фокус прокатывал, присваивание делал prev_time_word, а дальше работал с полями prev_time. А вот кейл заявляет, что nothing declared и к полям prev_time доступа у меня нет.

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

Сообщение ARV »

в более-менее свежих версиях компиляторов должны поддерживаться анонимные структуры:

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

union{
   struct{
       int field1;
       int field2;
   };
   long field3;
} my_var;
ну и вообще лично я бы рекомендовал определить сначала тип-структуру, а потом в union уже использовать поле данного типа:

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

typedef struct {
   int field1;
   int field2;
} my_type;

union{
   my_type field1;
   long field2;
} my_var;
если регистр отображается в адресное пространство ОЗУ, то можно "совместить" этот регистр с нужным типом-union, чтобы не считывать его в отдельную переменную, а сразу работать с его содержимым.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Встал на лапы
Сообщения: 139
Зарегистрирован: Чт фев 11, 2016 18:35:37

Сообщение L.O.D »

levaclaus писал(а):пытаюсь высчитать високосный\обычный год ... Верно ли это все?
Да, только лучше бы подсократить:

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

bool    LeapYear(int year)
{
   return ( year%4 == 0 && year%100 != 0 || year%400 == 0 );
};
"+2000" опущено, для ясности.
Аlex писал(а):Для вычисления високосного года, вот этого :

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

((year+2000) % 4 == 0)
достаточно.
Да, вплоть до 4 октября 1582 года так и считали, но на следующий день - 15 октября 1582 года - стали считать по принципу, заложенному в код выше.
WiseLord писал(а):так что да, в диапазоне 1901..2099 функция будет работать с одним только %4.
А потом придет "Проблема 2100 года". :)
- Из овощей я больше всего люблю пельмени... © Соседский Мальчик
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 183
Зарегистрирован: Вт сен 14, 2010 23:07:10
Откуда: Ростов

Сообщение baron_P »

Доброго времени суток.
Есть глупый вопрос по логике использования функций в программе на C. Допустим, в основном цикле программы МК у меня выполняются некотороые преобразования с несколькими переменными. Я хочу разгрести бардак, распихав преобразования по фукнциям. Т.е. вызов первой функции - обработка данных с АЦП, вызов второй - подготовка их к выводу на дисплей, вызов третьей - обработка нажатия кнопоки. Но после работы каждой фукнции, в основной программе должны измениться несколько перменных (т.е. return'ом не обойдешься). Можно через работу с адресами переменных выводить полученные в функциях значения в основную программу, но как-то это извращенно выглядит.
Может я чего опять недопонял и есть как-то менее изуверский способ вынести элементы программы в отдельные функциональные блоки, которые смогут передавать друг другу данные?
We do what we must because we can (c) GLaDOS
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

baron_P писал(а):Можно через работу с адресами переменных выводить полученные в функциях значения в основную программу, но как-то это извращенно выглядит.
Ну почему ? Передача указателя (адреса переменной) в функцию - один из способов обработки данных внутри функции. Ничего извращённого в этом нет.
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Можно еще не размещать эти переменные в main цикле, а описать их перед функкциями, тогда они станут глобальными, и к ним можно будет обращаться с любого места в программе...
Хотя конечно лучше чтобы глобальных переменных было по минимуму... но с другой стороны, редкая программа обходится без глобальных переменных...
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 183
Зарегистрирован: Вт сен 14, 2010 23:07:10
Откуда: Ростов

Сообщение baron_P »

Аlex писал(а):
baron_P писал(а):Можно через работу с адресами переменных выводить полученные в функциях значения в основную программу, но как-то это извращенно выглядит.
Ну почему ? Передача указателя (адреса переменной) в функцию - один из способов обработки данных внутри функции. Ничего извращённого в этом нет.
У меня в голове эта возня с адресами не укладывается нормально: приходится потом много-много раз ошибки вычесывать. Может, конечно, если часто такой метод применять, то привыкну, но пока сложно.

Глобальные переменные - тоже решение. Я о них в таком контексте не думал почему-то.
We do what we must because we can (c) GLaDOS
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск

Сообщение Chip115 »

Всем привет! Нужна помощь в выборе книги по программированию.
Надоело быдлокодить. Мозг требует новой информации. Есть ли что-нибудь ориентированное на структуру программы с адекватными примерами, про взаимодействие процессов, может даже будет затронута тема RTOS? Прочел книгу ди-халта (не помню как называется), в процессе изучения материал из книги С. Макконнелл «Совершенный код». Книга чертовски полезная, но ориентированна больше на чистоту кода, улучшения чтабельности кода и минимизацию ошибок.
Перекачал кучу. Ничего не нашел, что интересно подходит под описание выше. Решил спросить бывалых.
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Контактная информация:
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

Вот тут есть хорошая подборка книг.
http://forum.shelek.ru/index.php/topic,28557.0.html
Держит паяльник хвостом
Аватара пользователя
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Сообщение Apparatchik »

ARV писал(а): если регистр отображается в адресное пространство ОЗУ, то можно "совместить" этот регистр с нужным типом-union, чтобы не считывать его в отдельную переменную, а сразу работать с его содержимым.
Можно пример пожалуйста.

P.S. и есче вопрос: можно ли в одной структуре определять больше битовых полей чем разрядность системы?
«И всё-таки она вертится!»
Ответить

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