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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

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

Сообщение urry »

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

union {
float f;
char arr[4];
}un_fl;
un_fl.f=1.234;
Реклама
Sergi
Мучитель микросхем
Сообщения: 412
Зарегистрирован: Ср янв 04, 2012 11:57:40
Откуда: Алчевск

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

Сообщение Sergi »

2 isx
может скобки добавить? Вот так if ((koord + schet) ==( koord + atoi(RAZMER)))
Реклама
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

isx писал(а):Добрый вечер) Что то с кодом моим не понятное.
Не подскажете что может быть?
могу подсказать :в строке инициализации переменой.
если переменную не объявить как static и вызывать в какой либо подпрограмме (функция или прерывание) допустимо что она будет сбрасываться в ноль.
а вообще чтобы точнее сказать нужно видеть код.

еще могу посоветовать делать преобразование

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

atoi(RAZMER)
один раз в начале кода для экономии тактов.
2 isx
может скобки добавить? Вот так if ((koord + schet) ==( koord + atoi(RAZMER)))
а у сравнения разве приоритет выше сложения,чтобы его за скобки?

приоритет операций си
В поисках истины человек развивается.
Аватара пользователя
БАТАРЕЙКУС
Потрогал лапой паяльник
Сообщения: 347
Зарегистрирован: Сб фев 07, 2009 19:21:25

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

Сообщение БАТАРЕЙКУС »

urry писал(а):

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

union {
float f;
char arr[4];
}un_fl;
un_fl.f=1.234;
спасибо большое то что надо. :lol:
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

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

Сообщение isx »

Спасибо огромное)) Проинициализировал переменную так:

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

volatile static int koord = 0;
и всё стало ОК :)
Реклама
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

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

Сообщение isx »

Вот ещё назрел вопрос :)
Имеется двигатель, счётное устройство (считает количество произведённых оборотов) и датчик Холла. Необходимо сделать программно такую проверку: если двигатель делает 1 оборот и показания датчика не меняются, то вся система останавливается и летит в ошибку.
Сначала хотел сделать так:

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

if (pusk == 1) {
delay_ms(1000);
   if  (schet_old == schet) {LCD = "OSHIBKA!!"} 
Но сейчас только узнал что delay останавливает все процессы (в том числе и подсчёт оборотов).
Есть не очень рациональная мысль. Рассчитать количество циклов МК за 1 секунду, ввести переменную с подсчётом этих циклов, и исходя из того что двигатель делает 750 об/мин. рассчитать количество циклов за оборот, а после уже сравнить schet_old и schet.
Может найдутся более здравые идеи :)) ? Или если нет, то как можно узнать сколько циклов МК проводит за 1 секунду?
Реклама
Аватара пользователя
hybroid
Друг Кота
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

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

Сообщение hybroid »

isx писал(а):более здравые идеи
Использовать таймер и прерывание таймера.
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

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

Сообщение isx »

Может я ошибаюсь, но по моему таймер осуществляет подсчёт непосредственно с ноги МК, а мне нужна программная реализация.
Если конкретней, то :
Перед началом операции и в последующем, каждую секунду переменной schet_old присваивается значение schet (до того как программа сравнит их). Переменная schet хранит количество оборотов считанных с датчика Холла и с каждым полуоборотом вала прибавляет (или отнимает, в зависимости от направления) единицу. Запуск двигателя производится путём присваивания переменной pusk значения 1. Если pusk == 1 , и спустя секунду значение schet осталось равным schet_old, то вылетаем в ошибку...
Аватара пользователя
hybroid
Друг Кота
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

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

Сообщение hybroid »

Ничего не запрещает тикать таймеру, как обычным часам. С ноги - это один из режимов.
Вам нужен таймер, вываливающий прерывание раз в секунду и в прерывание творящий всю описанную вами логику :) Читайте про таймеры в даташите. Или в гугле, тонны уже исписано, это основы периферии МК.
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

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

Сообщение isx »

Ну раз так, то похоже настало время для их изучения :)
Спасибо! Буду пробовать)
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

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

Сообщение isx »

Вот к примеру я реализовываю такую программу: (тактовая Частота 8МГц, задержка 1 секунда.)

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


#include <avr/io.h>  
unsigned char temp;  
unsigned char temp2;  
void wait1 (void)  
{
TCNT1 = 0;
while (TCNT1 < 7812){};  
}    
 
int main(void)  
{  
TCCR1A = 0x00;  
TCCR1B = (1 << CS12)|(0 << CS11)|(1 << CS10);


temp = temp + 1;

  wait1();
temp2 = temp2 + 1;

}

Я так понимаю здесь как только мы доходим до wait все процессы замирают, но как сделать чтоб замирал только подсчёт temp2 , а temp продолжал считать все такты МК?
Аватара пользователя
hybroid
Друг Кота
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

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

Сообщение hybroid »

Не вижу у вас ни настроек таймера, ни прерываний от него. Делать надо через прерывания. У вас такой же костыль, как и обычный delay, только зря таймер израсходовали.
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

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

Сообщение isx »

А не могли бы вы вкратце объяснить, каким образом прерывание мне сможет помочь.. Я ато прочитал про него, но по какому алгоритму здесь реализовать не пойму никак....
Аватара пользователя
hybroid
Друг Кота
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

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

Сообщение hybroid »

Поможет тем, что не надо программно сидеть и ждать, пока таймер куда-то досчитает. Таймер считает и вы в это же время делаете что-то умное. Потом случилось прерывание, в нём быстро сделали другую логику - и ффпирёд дальше, как ни в чём не бывало.
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

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

Сообщение isx »

А....вон оно что))) Спасибо ...будем пробовать)
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

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

Сообщение isx »

Что то с прерываниями беда у меня...
Поставил перед основным циклом :

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

ISR (TIMER1_COMPA_vect)
{                    
if (start == 1) {
if (koordold == schet) {start = 3; error = 2; goto errors;} else {koordold = schet;}};
}               
В начале основного выставил:

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

TCCR1A = 0x00;
TCCR1B = (1 << CS12)|(0 << CS11)|(1 << CS10)|(1 << WGM12); 
TCNT1 = 0x00;
OCR1A = 7812;
TIMSK |= (1 << OCIE1A); 
Добавил #include <interrupt.h>....
В итоге пишет на строку с "ISR (TIMER1_COMPA_vect)" такое ругательство: "Error: : declaration syntax error"
Подскажите пожалуйста, в чём может быть причина? :dont_know:
Аватара пользователя
Goodefine
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

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

Сообщение Goodefine »

Вынесите обработчик из main..
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

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

Сообщение ut1wpr »

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

ISR (TIMER1_COMPA_vect)
{                    
if (start == 1) {
if (koordold == schet) {start = 3; error = 2; goto errors;} else {koordold = schet;}};
}
Метки errors внутри обработчика не видно. Значит у вас объявлен переход (!) из тела обработчика в иную точку.
Вам придется в той точке завершать логический блок командой возврата из хэндлера. Иначе придется каким-то иным образом позаботится о восстановлении контента.
Почитайте литературу по организации прерываний и их обслуживании. Выход из любого обработчика должен восстанавливать контент и адрес возврата.
С уважением,
Виктор.
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

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

Сообщение isx »

Вынес за main, убрал Goto. Ситуация не изменилась...
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Может весь код нам покажете, чтобы не гадать что там у вас?(вложением)
Желательно еще сказать какой компилятор.
В поисках истины человек развивается.
Ответить

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