Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/56: Рейтинг темы: голосов - 56, средняя оценка - 5.00
Ortyom
0 / 0 / 0
Регистрация: 09.07.2015
Сообщений: 51
1

Запись OCR1BH на Arduino

25.07.2015, 15:36. Просмотров 10157. Ответов 15
Метки нет (Все метки)

Добрый день!

Arduino Miko (atmiko2560).

Собственно пытаюсь настроить чтобы прерывание по таймеру срабатывало каждые 500 микросекунд:

Код
ISR(TIMER1_COMPB_vect)
{
//Просто чтобы посмотреть что в них записано
Serial.prymtln(OCR1H);
Serial.prymtln(OCR1L);
}

void setup()
{

Serial.begin(9600);

//Настройка таймера
noYmtirrupts();
//Предделитель 8
TCCR1B |= 0<<CS12 | 1<<CS11 | 0<<CS10;
//Режим таймера СТС
TCCR1B |= 0<<WGM13 | 1<<WGM12;
//Прерывание наступит по достижению 1000 тиков()
OCR1BH=0x03;
OCR1BL=0xE8;
//Разрешаем прерывания по совпадению
TIMSK1|=1<<OCIE1B;
interrupts();
}
по идее у нас в регистре OCR1B - 0000 0011 1110 1000
но на деле оказывается что OCR1BH равен нулю. OCR1BL меняется нормально.
Думал может это ограничения Arduino, но на это ни где не указано.
В AtmelStudyo тот же самый код работает (OCR1BH, OCR1BL - устанавливаются как нужно).
Вообщем, подскажите пожалуйста, как записать значение в OCR1BH ? Или где я тут накосячил, что пол дня уже потерял)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.07.2015, 15:36
Ответы с готовыми решениями:

AVRISP + ARDUINO mega + Arduino mini 32Khz
Помогите пожалуйста. Собирал самостоятельно Arduino mini. По не опытности ошибся при прошивке...

Модуль распознавания речи + Arduino Pro mini + Arduino MP3-Sheild
Список компонентов: 1).Модуль распознавания речи.(напряжение питания от 4,5 до 5,5 Вольт DC)...

Arduino UNO. Как работать c RFID-сканнером и Arduino на одном Serial-порту?
Рас уж тут речь зашла об ардуине и многопоточности COM порта, думаю могу обратиться именно сюда за...

Arduino uno + arduino ethernet + delphi для чайников
Доброго времени суток. У меня такая задача нужно реализовать программу на Delphi которая...

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

15
rimomtsofto
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 397
25.07.2015, 20:22 2
Никогда не писал для ардуины, но, вообще, есть же тонкости при записи сдвоенных регистров в AVR. Вроде писать первыь старший, читать первым - младший. Может попробовать поменять порядок записи? Или записать просто в OCR1B?
0
ЯodyotoR
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 186
25.07.2015, 21:47 3
Во первых нету разницы в какой регистр записываешь первым.
Во вторых вы читаете хз что:
Serial.prymtln(OCR1H);
Serial.prymtln(OCR1L);
Что за регистры А или В?
А что собственно в итоге вы хотите прочитать? Если OCR1BH и OCR1BL то вы увидите чила, которые в них зашили - то есть 1000.
И главное какая у вас частота работы кварца? Вы считали время срабатывания таймера? Если да и он действительно срабатывает каждые 0,5 мс - то считайте сами:
при скорости 9600 вам нужно передать 2 байта = 20 бод ( (стар бит + дата + стоп бит)*2) итого у вас займет времени = 20/9600= 0,002 сек, что в 4 раза дольше, чем прерывание. Если у вас не стоит защита от переполнения буфера, то вы ничего и не получите)
0
Ortyom
0 / 0 / 0
Регистрация: 09.07.2015
Сообщений: 51
25.07.2015, 21:52 4
Цитата Сообщение от rymomtsofto
Никогда не писал для ардуины, но, вообще, есть же тонкости при записи сдвоенных регистров в AVR. Вроде писать первыь старший, читать первым - младший. Может попробовать поменять порядок записи? Или записать просто в OCR1B?
Порядок менял, результат тот же. Так тоже пробовал: OCR1B=1000;
0
Ortyom
0 / 0 / 0
Регистрация: 09.07.2015
Сообщений: 51
25.07.2015, 22:22 5
Цитата Сообщение от ЯodyotoR
Во первых нету разницы в какой регистр записываешь первым.
Во вторых вы читаете хз что:
Serial.prymtln(OCR1H);
Serial.prymtln(OCR1L);
Что за регистры А или В?
А что собственно в итоге вы хотите прочитать? Если OCR1BH и OCR1BL то вы увидите чила, которые в них зашили - то есть 1000.
И главное какая у вас частота работы кварца? Вы считали время срабатывания таймера? Если да и он действительно срабатывает каждые 0,5 мс - то считайте сами:
при скорости 9600 вам нужно передать 2 байта = 20 бод ( (стар бит + дата + стоп бит)*2) итого у вас займет времени = 20/9600= 0,002 сек, что в 4 раза дольше, чем прерывание. Если у вас не стоит защита от переполнения буфера, то вы ничего и не получите)
Поправьте если ошибаюсь, но по идее то что записывается H часть, заносится в некоторую темп переменную. Только после того как записывается L часть, обе части записываются в этот 16 битный регистр.
Для ардуин мега, частота 16000000. Но разницы здесь по сути никакой, вопрос не в правильности расчётов.
Здесь действительно опечатка, экспериментировал, забыл обратно поставить, но ситуации это не меняет, должно быть так:
Serial.prymtln(OCR1BH);
Serial.prymtln(OCR1BL);
читаются значения которые в регистрах. Значения регистров в любом случае должны выводится, пусть даже не с первого раза. Выводится должно следующее. В регистре - OCR1BL - 1111101000, в регистре OCR1BH - 00000011, т.е. 1000 это 00000011 11101000. Значение OCR1L выводится корректно (11101000), а значение OCR1BH равно нулю.
0
ЯodyotoR
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 186
25.07.2015, 22:35 6
Вот. уже ближе к делу. Когда вы пишите в OCR1A, то передаете ссылку на L байт этого регистра. А дальше число записывается. Так как контроллер 8 битный и обращение к памяти идет в 1 байт, то сначала пишется L байт, а потом H байт в адрес с инкрементом в 1.
Вы для проверки поменяйте вывод местами - сначала L, а потом В и проверьте - если придет - проблема в скорости прерывания

Кстати буфер никакой не создается - вдруг вы захотите установить только H или только L байт.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
26.07.2015, 09:46 7
Цитата Сообщение от ЯodyotoR
нету разницы в какой регистр записываешь первым.
Да что вы говорите! В двухбайтные регистры ввода-вывода строгий, жесткий порядок записи - сначала старший, потом младший. Это легко проверяется тут же на железе. Начиная с SP. Чтение регистров - сначала младший, потом старший.
Если начнете спорить, идите и читайте даташиты или книги про МК AVR. Там все популярно объясняется, как писать в регистры и почему. С картинками.
0
Ortyom
0 / 0 / 0
Регистрация: 09.07.2015
Сообщений: 51
26.07.2015, 11:32 8
Цитата Сообщение от dymyurk1978
Цитата Сообщение от ЯodyotoR
нету разницы в какой регистр записываешь первым.
Да что вы говорите! В двухбайтные регистры ввода-вывода строгий, жесткий порядок записи - сначала старший, потом младший. Это легко проверяется тут же на железе. Начиная с SP. Чтение регистров - сначала младший, потом старший.
Если начнете спорить, идите и читайте даташиты или книги про МК AVR. Там все популярно объясняется, как писать в регистры и почему. С картинками.
фуууух. а то я уже засомневался. Вечером попробую вообще все прерывания запретить, младший считать в переменную, потом старший и только потом всё вывести.
0
Ortyom
0 / 0 / 0
Регистрация: 09.07.2015
Сообщений: 51
26.07.2015, 20:47 9
Вообщем, решение найдено. Непосредственно перед записью в OCR1BH нужно обнулить регистр TCCR1A (который по умолчанию равен 1).
Код
TCCR1A=0;
OCR1BH=0x03;
OCR1BL=0xE8;
тогда всё корректно записывается. Но если честно смысл сего процесса не очень понятен. Ни как не пойму, из за чего это мешало записи в регистр OCR1BH. Даташит бегло просмотрел, но связи не увидел.
0
Ortyom
0 / 0 / 0
Регистрация: 09.07.2015
Сообщений: 51
26.07.2015, 20:56 10
Нашёл ответ здесь:
http://arduino.ru/forum/programmyrov...meru-1-s-ocr1a
Пользователь step962 пишет:
Создатели Arduino IDE создавали среду для неспециалистов, поэтому напридумывали разных аналоговых входов и выходов, которых у микроконтроллеров никогда не бывало, а были блоки ADC и PWM. Напридумывав всяких analogWrite(), они вынуждены были выполнять некоторые начальные настройки тех же таймеров - чтобы ШИМ-режимы присутствовали по умолчанию. Как итог, ШИМ-режимы присутствуют, а о возможных побочных явлениях создатели умалчивают. И действительно, зачем забивать головы неспециалистов, во благо которых все это затевалось. Они же все равно в 99% процентах случаев только по проложенным дорожкам ходят.

В результате регистр TCCR1A имеет в своем самом младшем разряде единичку. Если посмотреть в соответствующую таблицу режимов таймера, WGM10=1 - это режимы 8-/10-битового ШИМа. Так что "по умолчанию" в регистр OCR1A можно записать не более 8 бит информации. Что у вас и происходило.

А эффект "обрезания" вы в любом компиляторе можете воспроизвести, настроив предварительно режим работы таймера на 8-/10-битовый ШИМ...
0
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
26.07.2015, 22:06 11
Мне нравится:
Цитата Сообщение от Ortyom
... Arduino - эффект "обрезания"...
И что на это может ответить специалист? Только пожать плечами.
Нельзя ли ардуинщиков вынести в отдельную песочницу, тут нужен отдельный, очень хорошо оплачиваемый консультант.
0
ЯodyotoR
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 186
26.07.2015, 23:32 12
Цитата Сообщение от dymyurk1978
Цитата Сообщение от ЯodyotoR
нету разницы в какой регистр записываешь первым.
Да что вы говорите! В двухбайтные регистры ввода-вывода строгий, жесткий порядок записи - сначала старший, потом младший. Это легко проверяется тут же на железе. Начиная с SP. Чтение регистров - сначала младший, потом старший.
Если начнете спорить, идите и читайте даташиты или книги про МК AVR. Там все популярно объясняется, как писать в регистры и почему. С картинками.
Не буду разводить денигогию... Вы просто попробуйте записать ICRH и ICRL ну или те же пары OCR в разной последовательности и посмотрите как изменится результат
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
27.07.2015, 10:43 13
Цитата Сообщение от ЯodyotoR
Не буду разводить денигогию... Вы просто попробуйте записать ICRH и ICRL ну или те же пары OCR в разной последовательности и посмотрите как изменится результат
И не надо разводить денигогию. Регистры ICRH и ICRL только для чтения. И порядок чтения в установленном порядке. Сначала младший, потом старший.
Вообще, по вашим сообщениям складывается впечатление, что вы с AVR работаете только в симуляторах.
Читайте даташиты и книги по МК AVR. Хотя бы для ознакомления с архитектурой AVR.
0
ЯodyotoR
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 186
27.07.2015, 21:49 14
Цитата Сообщение от dymyurk1978
Цитата Сообщение от ЯodyotoR
Не буду разводить денигогию... Вы просто попробуйте записать ICRH и ICRL ну или те же пары OCR в разной последовательности и посмотрите как изменится результат
И не надо разводить денигогию. Регистры ICRH и ICRL только для чтения. И порядок чтения в установленном порядке. Сначала младший, потом старший.
Вообще, по вашим сообщениям складывается впечатление, что вы с AVR работаете только в симуляторах.
Читайте даташиты и книги по МК AVR. Хотя бы для ознакомления с архитектурой AVR.

Погодите, погодите... кто-то из нас кажется сошел с ума или ослеп? Судя по ДШ это не я.

<Изображение удалено>

А вы, я так полагаю, работаете с AVR только в симуляторе? Раз у вас появляются проблемы с чтением/записью не в "том" порядке.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
28.07.2015, 06:41 15
Хм, хорошо, допустил неточность, во-первых, мне никогда не требовалось ПИСАТЬ в регистр захвата, во-вторых, информация взята из книги, в которой несколько устаревшая информация. Книга написана на ранних МК AVR. А сейчас я вас фейсом по тейблу поеложу. На приведенной вами же картине ссылка на страницу, на которой указан порядок записи и чтения регистров. И эту страницу вы стыдливо приводить не стали.
Как бы вы ни пыжились, я работаю с AVR c 2007 года. И пусть здесь допустил неточность, и то только потому, что раньше писать в регистр захвата никогда не требовалось. А теперь внимание, если же мне все потребовалось бы писать в регистр, то писал бы в установленном порядке и никаких проблем бы ни было. А вот вы, если бы перепутали порядок работы, то наелись бы полной ложкой.
Похвально, что наконец-то заглянули в даташит, но читайте еще внимательнее, если собираетесь приводить примеры. Вдруг что-то упустили?
0
ЯodyotoR
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 186
29.07.2015, 10:09 16
Цитата Сообщение от dymyurk1978
И эту страницу вы стыдливо приводить не стали.
Ну во первых не стыдливо, а просто не смотрел ее вообще.

Цитата Сообщение от dymyurk1978
А вот вы, если бы перепутали порядок работы, то наелись бы полной ложкой.
Посмотрел свои проекты (а я работаю с авр с ~2009) и на удивление запись всегда происходила со старшего байта, а дальше использовалась как стандартная либа в большинстве проектов.
Так что эта проблема обошла меня стороной

Цитата Сообщение от dymyurk1978
Похвально, что наконец-то заглянули в даташит
Это здорово, что у вас есть чувство юмора. Даташиты наше все, особенно когда напарываешься на проблемы...

А вообще каюсь, был не прав - ни разу на проблему не натыкался и поэтому не знал.

Кстати регистр захвата я всегда использую для задания частоты шима - это самый рабочий вариант
0
29.07.2015, 10:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2015, 10:09

Четыре кнопки на форме: добавить запись, удалить запись, закрыть, найти запись
Private Sub КнопкаДобавитьЗапись_Click() On Error GoTo Err_КнопкаДобавитьЗапись_Click ...

С++ и Arduino
Здравствуйте. Сразу скажу, что в теме по Arduino я новичок, но для PC писал программы и на...

Arduino C#
Написал программу на шарпе, описывающее текущее состояние входной двери. Не имею ардуино, пишу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru