Перейти к содержанию

Int0+Timer/counter2


;tv

Рекомендуемые сообщения

Приветствую вас!

Стараюсь разобраться с таймером, без вас видимо никак!

Среда разработки: ATMEL CTUDIO 6. Язык: Си.

Задача кода, 1) Сгенерировать прерывание INT0 по спаду на PINB2.

2) В условии прерывания подключить TIMER2 в режиме CTC.

3) При совпадении OCR2 c TCNT установить PINC0 в лог "1".

Анализ ниже представленного кода. (в моем не верном понимании, т.к. не работает)

В условии ISR(INT0_vect), запускается timer2_register_set. в результате чего устанавливаются регистры необходимые

для работы Таймера2. Следовательно запускается ISR(TIMER2_COMP_vect). В моем понимании, действия прописанные

в условии таймера, должны продолжаться до совпадения значений OCR2 c TCNT. В данном коде OCR2=150; т.е. 150 "тиков".

Временная цена 1го "тика"= 1/1мгц(F_CPU)=1/1000000гц=1мкс. итог-150мкс. По условию кода PINC0 в течении 150мкс должен

соответствовать лог"1" и затем обнулиться, и так до следующего прерывания по INT0. !!! КОД НЕ РАБОТАЕТ!!!

Подскажите пожалуйста ошибку в коде!

post-176646-0-68504800-1470673883_thumb.png

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

CTC это сброс при совпадении, при этом должно генерироваться прерывание по вектору сброс при совпадении, в этом прерывании вам нужно устанавливать ваш пинС в еденицу, этого всего нет. это не ошибка, тут половины кода нет. а то-что у вас написано в бесконечном цикле - вообще какой-то бред.

Изменено пользователем Viktor26

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

#define F_CPU 1000000UL

#include <avr/io.h>

#include <avr/interrupt.h>

#include <util/delay.h>

ISR(INT0_vect){

PORTC |= (1<<PC0);

_delay_us(148);

PORTC &=~ (1<<PC0);

}

int main(void)

{

DDRC |= (1<<PC0);

PORTC &=~ (1<<PC0);

MCUCR |= (1<<ISC01);

GICR |= (1<<INT0);

sei();

while(1)

{

asm("nop");

}

}

Ссылка на комментарий
Поделиться на другие сайты

Особенности хранения литиевых аккумуляторов и батареек

Потеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Среда разработки: ATMEL CTUDIO 6. Язык: Си.
Атмел Ктудио 6, новая версия!
Задача кода, 1) Сгенерировать прерывание INT0 по спаду на PINB2.
А что за камень? Совпадают ли PB2 и INT0?
так делать бесполезно, PINC0 и т.п. это константы а не адреса портов. Делать вот так тоже бесполезно, вдруг остальные выводы в другом состоянии, лучше проверять конкретный бит.
3) При совпадении OCR2 c TCNT установить PINC0 в лог "1".
Может, PORTC1? А то PINC предназначен для чтения, а PINC1 это вообще константа, ее не изменить.
В данном коде OCR2=150
Так и приведите код, а не картинку. Думаете, у нас есть неодолимое желание перепечатывать ваше творчество?

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

CTC это сброс при совпадении, при этом должно генерироваться прерывание по вектору сброс при совпадении, в этом прерывании вам нужно устанавливать ваш пинС в еденицу, этого всего нет. это не ошибка, тут половины кода нет. а то-что у вас написано в бесконечном цикле - вообще какой-то бред.

Приветствую! Вообще-то я знаю что ошибаюсь и по этому обращаюсь к знающим тему! Жду совета а не признания того что все это бред! Ну да ладно, сам виноват! По теме, Я знаю что СТС это сброс при совпадении. Как я понял из пояснений в инете, при активации ISR(TIMER_COMP_vect){код} начинается отсчет до совпадения OCR2 c TCNT2.а пока идет отсчет, выполняется код прописанный в {код}. Тут и устанавливается в коде порт С нулевой пин в лог"1". (PORTC|=(1<<0); Если я что-то не так понял, подскажите!

Ссылка на комментарий
Поделиться на другие сайты

Среда разработки: ATMEL CTUDIO 6. Язык: Си.
Атмел Ктудио 6, новая версия!
Задача кода, 1) Сгенерировать прерывание INT0 по спаду на PINB2.
А что за камень? Совпадают ли PB2 и INT0?
так делать бесполезно, PINC0 и т.п. это константы а не адреса портов. Делать вот так тоже бесполезно, вдруг остальные выводы в другом состоянии, лучше проверять конкретный бит.
3) При совпадении OCR2 c TCNT установить PINC0 в лог "1".
Может, PORTC1? А то PINC предназначен для чтения, а PINC1 это вообще константа, ее не изменить.
В данном коде OCR2=150
Так и приведите код, а не картинку. Думаете, у нас есть неодолимое желание перепечатывать ваше творчество?

Приветствую вас!

1)Замечание принял, перепрограммировал на "STUDIO" .

2)Камень ATmega8. PD2(INT0);

3)Насколько я понимаю PINC0, это нулевой бит порта С.и запись PINC0 в коде используется в операторе " if ". так проверяется состояние конкретного бита.Это не так? Подскажите как надо.

4)Ваш комментарий к "3)При совпадении OCR2 c TCNT установить PINC0 в лог"1".", мне, извините, вообще не понятен. Эта запись относится к плану создания кода, а в самом коде работа идет

не с пином, а с портом. ISR(TIMER2_COMP_vect){...PORTC|=(1<<0);...}

5) Да, я понимаю что перепечатывать код никто не будет. Я пытался прикрепить код к теме в другом формате, но мне прописали что у меня нет права отправлять файл в таком формате. Может я

что-то не так загрузил? Если не трудно, подскажите как загрузить код правильно.

Спасибо.

Ссылка на комментарий
Поделиться на другие сайты

У вас испульзуется таймер 2, значит вектор тоже должен быть для таймера 2, а у вас вектор для какого таймера? Он даже не для таймера 0 он у вас просто для таймера, без цифры посемуто, поэтому это прерывание не будет работать

PINC, нельзя изменять, его можно только опрашивать. Читайте внимательно. Вам нужно изменять PORTC.

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

3)Насколько я понимаю PINC0, это нулевой бит порта С.и запись PINC0 в коде используется в операторе " if ". так проверяется состояние конкретного бита.Это не так? Подскажите как надо.
Поняли неправильно. Это константа и объявлена она примерно так

const char PINC0 = 0;
const char PINC1 = 1;

На самом деле там используются макросы препроцессора чтобы были возможны конструкции проверки бита, например if( PINC & (1<<PINC0) ) но лично мне нравится более короткая запись if( PINC & (1<<0) ) делающая тоже самое. Еще удобнее специальные макросы, но для их использования надо понимать что делаешь.

4)Ваш комментарий к "3)При совпадении OCR2 c TCNT установить PINC0 в лог"1".", мне, извините, вообще не понятен.
Я говорил именно про текстовую формулировку. PINC это регистр для чтения, устанавливать стоит в PORTC. А для описания в тексте достаточно PC0.
5) Да, я понимаю что перепечатывать код никто не будет. Я пытался прикрепить код к теме в другом формате, но мне прописали что у меня нет права отправлять файл в таком формате. Может я что-то не так загрузил? Если не трудно, подскажите как загрузить код правильно.
Достаточно вставить в текст сообщения, оформив тегами [СОDE][/СОDE] и [sРОILER][/sРОILER] (копировать их из этого сообщения бесполезно, в них часть букв заменена на русские чтобы движок не сожрал).
PINC, нельзя изменять, его можно только опрашивать. Читайте внимательно. Вам нужно изменять PORTC.
Справедливости ради, в новых моделях запись 1 в PINx изменяет логический уровень на соответствующем выводе. Правда, ATmega8 к таким не относится.

.

Ну и переменную "chislo" (давать названия транслитом - плохая идея) стоит объявить как volatile, раз она используется в прерывании.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

У вас испульзуется таймер 2, значит вектор тоже должен быть для таймера 2, а у вас вектор для какого таймера? Он даже не для таймера 0 он у вас просто для таймера, без цифры посемуто, поэтому это прерывание не будет работать

PINC, нельзя изменять, его можно только опрашивать. Читайте внимательно. Вам нужно изменять PORTC.

Извините не понял. Вы пишите что вектор таймера не указан, а счиал что в коде ISR(TIMER2_COMP_vect){код} указывается что происходит ПРЕРЫВАНИЕ ПО СОВПАДЕНИЮ,(COMP), ТАЙМЕРА 2(TIMER2). Если не затруднит, укажите пожалуйста место, где пропущена цифра указывающая что действие происходит с таймером2. Спасибо.

Ссылка на комментарий
Поделиться на другие сайты

Работу с оператором ветвления " if ", я изучил из видео урока, (

), где все очень четко и ясно поясняется. Следуя уроку, в условии оператора, проверяется его истинность, и в зависимости от результата определяется дальнейшее направление чтения кода. А вы предлагаете мне, начинающему изучать тему, сразу разобраться в макросах и константах. Все проясниться по ходу пьесы! Не обязательно разбираться в яйце на молекулярном уровне, если нужно только лишь поджарить ее! А то что меня интересует на данном этапе, это азы!
У вас испульзуется таймер 2, значит вектор тоже должен быть для таймера 2, а у вас вектор для какого таймера? Он даже не для таймера 0 он у вас просто для таймера, без цифры посемуто, поэтому это прерывание не будет работать PINC, нельзя изменять, его можно только опрашивать. Читайте внимательно. Вам нужно изменять PORTC.

А где я меняю PINC-? Я его именно опрашиваю в операторе ветвления на соответствие с лог. уровнем! Где что не так?

Ссылка на комментарий
Поделиться на другие сайты

Ну да, я просто оперся на пост #5, а там без цифры, и пост #6, там вы в пинс что то пытались записать.

Изменено пользователем Viktor26

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

Проверять константу (PINC0) в условии if() бесполезно. Проверять надо определенные биты PINC. Обычно это делается логическими операциями, которые я уже расписал

if( PINC & (1<<1) ) //проверка выставлен ли PC1 в лог.1
if(!(PINC & (1<<1)) ) //проверка сброшен ли PC1 в лог.0

макросы использовать я пока и не предлагаю.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Ну спасибо, хоть обнадежили, ато уже думал все безнадежно! Но хочу заметить, что по сути описанной мной задачи-то подсказок никаких. А задача остается. Тут я упростил код чтоб с таймером2 подружиться, но никак он меня не признает. Скину код, и если найдете свободное время, оцените ее вашим опытным взглядом и подскажите, почему при пошаговом контроле в ATMEL STUDIO, курсор не заходит в код ISR(TIMER2_COMP_vect){};. т.е. не выполняется то что прописано { здесь }.

Если кто подскажет со стороны, буду благодарен!

post-176646-0-81186000-1470817154.png

Ссылка на комментарий
Поделиться на другие сайты

Проверил в протеусе, все работает нормально. Может, какая проблема в самом симуляторе Студии? Что-то такое я слышал.

Не вставляйте код картинками!

У функции timer2_register_set() не указано возвращаемое значение, это ошибка.

Устанавливать OCRx лучше ДО запуска таймера, иначе прерывание возникнет сразу. Еще лучше сразу после завершения настроек принудительно сбросить флаг прерывания (см. даташит или Евстифеева).

Двоичные константы, которые записываете в DDRC, PORTC у вас почему-то 6-битные, а должны быть 8-битными. Компилятор такое проглотит, но допишет в 6 и 7 биты нули.

Объявлять функцию надо перед ее использованием. Если хочется после - делайте прототип.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Проверил в протеусе, все работает нормально. Может, какая проблема в самом симуляторе Студии? Что-то такое я слышал.

Не вставляйте код картинками!

У функции timer2_register_set() не указано возвращаемое значение, это ошибка.

Устанавливать OCRx лучше ДО запуска таймера, иначе прерывание возникнет сразу. Еще лучше сразу после завершения настроек принудительно сбросить флаг прерывания (см. даташит или Евстифеева).

Двоичные константы, которые записываете в DDRC, PORTC у вас почему-то 6-битные, а должны быть 8-битными. Компилятор такое проглотит, но допишет в 6 и 7 биты нули.

Объявлять функцию надо перед ее использованием. Если хочется после - делайте прототип.

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

[\CODE] и 

[\SPOILER]. Намекните где искать, чтоб выставлять на обсуждении код в нужном формате.

По причине незнания мне сложно представить что значит "возвращаемое значение",и как его прописывать, но думаю оно мне в данном коде не нужна.Дело в том что как я упоминал, это сокращенный код, с целью разобраться с ТАЙМЕР2. В первичном варианте темы, код таймера запускался путем инициализации регистров таймера в теле прерывании INT0. и думаю именно очередное срабатывание прерывания является "возвращаемым значением". Мне пришлось подключать INT0 по той причине, что протеуса у меня нет, и приходится экспериментировать на камне. Камень, как известно имеет время вхождения в режим, и по этой причине я посчитал не правильно прямо подключать ISR(TIMER2_COMP_vect){}, т.к. он гарантированно выдаст ошибку за отсутствие стартового времени. А в STUDIO, курсор в код тела не входит.

Порт С у меня прописаны в шести битах, т.к. на ATmega8 PORTC шести битный.

Спасибо за уроки!

Ссылка на комментарий
Поделиться на другие сайты

куда нужно записать [СОDE][\СОDE] и [sРОILER][\SРОILER]. Намекните где искать, чтоб выставлять на обсуждении код в нужном формате.
Можете просто руками вписать эти теги вокруг кода, например

[СОDE]код[\СОDE]станет выглядеть как

код

именно для кода на панели инструментов есть кнопка со значком <>, для спойлера кнопки нет, придется писать вручную.

По причине незнания мне сложно представить что значит "возвращаемое значение"
Почитайте любую книгу по Си, например, Кернигана и Ричи. Вкратце - любая функция должна возвращать какое-то значение. Если оно вам не нужно - объявляете функцию как возвращающую void, например, void timer2_register_set()
и думаю именно очередное срабатывание прерывания является "возвращаемым значением".
Не угадали, прерывания вообще не возвращают значение, поскольку напрямую не вызываются из кода.
Камень, как известно имеет время вхождения в режим
На глазок вы это время не определите. Как и модель счета 50 вашего таймера на тактовой частоте кристалла. Со стороны ваш код должен мгновенно (тактов за 20-80, то есть 20-80 мкс с момента начала программы) выставлять на PC0 лог.1. Для теста это неважно, поскольку никакой другой участок кода этого не делает.
А в STUDIO, курсор в код тела не входит.
Это может быть баг самой Студии.
Порт С у меня прописаны в шести битах, т.к. на ATmega8 PORTC шести битный.
У контроллеров AVR не бывает регистров кроме как 8-битного размера. То что у ATmega8 на корпус выведены всего 7 ног порта (не забываем про PC6 = RESET) не означает что там стоит какой-то уникальный регистр.
Спасибо за уроки!
Незачто, однако лучше бы вы освоили сначала сам язык без применения к контроллерам.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

А как же язык учить, если ни с "камнем" не разговаривать? Я каждый шаг вперед буквально выкавыриваю с инета. А в книгах так расплывчато все прописано, что это не самоучитель, а учебное пособие, каждую главу которого, кто-то должен прояснять. Жесть!!!

Даже с этим Протеусом, раз 20 скачивал. В текстовом файле указывают пошаговую инструкцию, типа нажми сюда, птичка вылетит, жму, а там крокодил в засаде! Полное несоответствие! Порой думаю, может у меня комп заколдованный!?

Ссылка на комментарий
Поделиться на другие сайты

Си стоит учить начиная с компьютерной версии и Hello world'ов, а не с контроллеров и мигалок. Там хоть с переферией проблем не будет. Книжку я уже назвал - Кернигана и Ричи.

Что вы творите с протеусом не знаю, у меня особых проблем с освоением не возникало.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...