Свежие обсуждения
Микроконтроллеры

Поясните по Си

1 8

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

#define SET_PWM(v) OCR0A=(v)

Что значит эта строка - что мы в ней задаём ?

Далее - как я понимаю отработка какого-то прерывания :

uint8_t overflow;
volatile uint8_t freq_correct;
volatile uint8_t enabled;

Что в этих строках задано ?

ISR(TIMER1_COMPA_vect){

Это я понимаю начало процедуры обработки пррывания по совпадения А для таймера 1

PORTD ^= 1PD1;

Как я понимаю равнозначно SBI PORTD, 1 ?

if(enabled){
SET_PWM(255);
}

Переменная "enabled" нигде не определяется но активно изменяется (1 или 0) - что это ?

overflow = 1;
OCR1A += 32768;

Что за конструкция += ? Уже спрашивал - но не понял. Гугл дает очень много информации но не по делу.
}

Следующая процедура как я понял :

int16_t integral;
Что это значит ? Объявление переменной "int16_t" ?

ISR(TIMER1_CAPT_vect){
static uint16_t old_icr;
uint16_t icr;
uint16_t y;
int16_t a;
Что это за конструкция (выше)

....

if(y < 1000) return;

Если Y1000 то из процедуры сразу выходим - так ?


 

А Шпака бегло пролистать? Все вопросы отпадут...

 

Wladimir_TS:
#define SET_PWM(v) OCR0A=(v)
Что значит эта строка - что мы в ней задаём ?

Это макрос - замена операции низкого уровня чем-то более удобоваримым.
SET_PWM(255); равнозначно OCR0A=255;

Wladimir_TS: uint8_t overflow;
volatile uint8_t freq_correct;
volatile uint8_t enabled;
Что в этих строках задано ?

обявлены переменные overflow, freq_correct и enabled.

Wladimir_TS: PORTD ^= 1PD1;
Как я понимаю равнозначно SBI PORTD, 1 ?

Инвертирование бита PD1, только у Вас ошибочно написано 1PD1, должно быть PD1.

Wladimir_TS: Переменная "enabled" нигде не определяется но активно изменяется (1 или 0) - что это ?

Так она же объявлена выше.

Wladimir_TS:
OCR1A += 32768;
Что за конструкция += ? Уже спрашивал - но не понял. Гугл дает очень много информации но не по делу.

Прибавление 32768 к текущему значению OCR1A .

Wladimir_TS: int16_t integral;
Что это значит ? Объявление переменной "int16_t" ?

Объявление переменной integral, типа int16_t.
Фу, устал
Вообще-то, poruchik прав.
C изучать надо по книжкам.

 

Wladimir_TS: Объявление переменной "int16_t

Переменная integral , её тип int16_t

 

Tadas: Вообще-то, poruchik прав.
C изучать надо по книжкам.

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

 

Wladimir_TS: Уже спрашивал - но не понял.

Я тогда Вам отвечал подробно на этот вопрос. Если не поняли, тогда не вижу смысла что-то дальше объяснять, не в коня корм, не ваше это, забейте.
Ну или начинайте изучать азы программирования на Си.

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

 

poruchik: А Шпака бегло пролистать? Все вопросы отпадут...

Ссылочку ткните ?

Арс: Я тогда Вам отвечал подробно на этот вопрос. Если не поняли, тогда не вижу смысла что-то дальше объяснять, не в коня корм, не ваше это, забейте.

Знаю, что не в коня - пфтаюсь освоить языки высокого уровня уже лет 15 - но не лезет. С другой стороны есть слово НАДО, и никуда не денешся. Клин клином вышибают... схемотехники все меньше нужны - а программисты разбегаются. Свое пишу на ассемблере, а чужое приходиться править - да и ту программу на ассемблер не перенести - там дальше страшенная математика...

А теперь по существу :

Tadas: SET_PWM(255); равнозначно OCR0A=255;

Тоесть слово на слово - OCR0A=255 это встроенная в компилятор команда - так ?

Вопрос кстати - а где в программе прописывать тип кристалла - визуально нету нигда, но компилируется ...... (компилятор - штатный к AVR Studio.. (AVR GCC вроде зовется))

Tadas: Wladimir_TS: uint8_t overflow;
volatile uint8_t freq_correct;
volatile uint8_t enabled;
Что в этих строках задано ?

обявлены переменные overflow, freq_correct и enabled.

А что тода значит "volatile" ?
А "static" ?

а что значит ххх_t ? в типе - unit8 как-то понятнее - значит _t это какое-то добавление ?

Tadas: Прибавление 32768 к текущему значению OCR1A .

А так будет корректно ? : OCR1A = OCR1A+32768 ?

 

Wladimir_TS, OCR1A = OCR1A+32768; // Да, это то же самое, что и OCR1A+=32768;
Такая запись служить для упрощения кода, еще есть другие вариации: a=a*b; эквивалентно a*=b; Такая же история с делением, вычитанием и побитовыми операциями.
Ах да, еще про остаток забыл, вот так это будет а%=10; равносильно а=а%10;
А static служит для объявления статических переменных, то есть если переменную объявили в какой-либо функции, вызвали, она произвела какие-то действия, завершилась, и, если потом снова вызвать эту функции, то значение переменной с пометкой static сохранится с прошлого вызова.

 

Wladimir_TS: А что тода значит "volatile" ?
А "static" ?

Wladimir_TS: Ссылочку ткните ?

Который год ....лентяй Вы батенька...
http://padabum.com/d.php?id=2878

 

Swamp_Dok: А static служит для объявления статических переменных, то есть если переменную объявили в какой-либо функции, вызвали, она произвела какие-то действия, завершилась, и, если потом снова вызвать эту функции, то значение переменной с пометкой static сохранится с прошлого вызова.

А "volatile" ?

poruchik: Который год ....лентяй Вы батенька...

Под контроллеры не связывался - только с "большими" машинами...