Пропорциональное управление на МК с нуля
| |
uwrtey | Дата: Воскресенье, 07.04.2013, 00:16 | Сообщение # 241 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| Цитата (ВитГо) что значит "ничего" ? он встретит во флеш какие то байты - и будет интерпретировать их как команды :-))
и ему пофигу что именно это за команда - он просто будет ее исполнять :-) в машинных кодах сообщений об ошибках нет :-)
Странно, что компилятор не выдает сообщение об ошибке. Прерывание разрешено, а вектор прерывания отсутствует. Может по-этому некоторые люди делают как в обучалке на радиокоте ?
не успеваю за своими мыслями......
|
|
| |
ВитГо | Дата: Воскресенье, 07.04.2013, 07:58 | Сообщение # 242 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| а компилятору тем более по барабану ! он не проверяет это !!
может быть у тебя по любому прерыванию полный сброс задуман ?! :-) - поэтому и не проверяет.
в обучалке радиокота не очень хороший пример - и с ним тоже можно много глюков поймать :-)
проще поставить RETI на каждое прерывание (а не как в обучалке один выход на все) - так более правильно...
ну и еще лучше конечно смотреть какие прерывания используешь - это не так сложно :-)
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Воскресенье, 07.04.2013, 11:58 | Сообщение # 243 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| Цитата (ВитГо) может быть у тебя по любому прерыванию полный сброс задуман ?! :-) - поэтому и не проверяет. Это понятно... Вот только в моем случае ни чего не было. То-есть прерывание было настроено, а вектора прерывания не было. Мне интересно куда "уходил" процессор при входе в прерывание? ( он даже что-то умудрялся на экране рисовать )
не успеваю за своими мыслями......
|
|
| |
uwrtey | Дата: Воскресенье, 07.04.2013, 14:31 | Сообщение # 244 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| Что бы проверить АЦП, я сделал незатейливую программу. Она должна единожды вычислить АЦП одного канала и сохранить значение в ОЗУ. После этого значение должно быть прочитано из ОЗУ и выведено на экран. Но на экране я получаю нули... ( 0000 )
Вот у меня и закралось подозрение, что что-то не так с настройками АЦП это: либо слишком низкая частота преобразования либо еще что-то... ( А точно нормально, что прерывание АЦП отключено? АЦП ведь аппаратный? Процессор не принимает участия в вычислении АЦП? )
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Воскресенье, 07.04.2013, 15:02 |
|
| |
ВитГо | Дата: Воскресенье, 07.04.2013, 15:22 | Сообщение # 245 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| смотри правильность работы с АЦП..
частоту преобразования ставь максимальную (чтобы не задумываться о том успеваешь или нет)
кстати, когда запускаешь преобразование - не забываешь потом подождать его результатов ? там флаг какой то в регистре должен измениться.. и только после этого можно забирать результат преобразования
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Воскресенье, 07.04.2013, 17:45 | Сообщение # 246 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| бит ADIF должен стать равным 1
а я пробовал сделать так: Я ставил максимальную частоту и делал задержку (длительностью в несколько секунд) в самом начале главного цикла у меня получается число 03FF !!! и оно ни как не зависит от положения ручек... ( 03FF=1023 )
а на линии АЦП диоды не надо вешать ?
Добавлено (07.04.2013, 16:58) --------------------------------------------- ну теперь и с этим разобрался... у меня опорное напряжение было не правильно настроено...
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Воскресенье, 07.04.2013, 23:02 |
|
| |
uwrtey | Дата: Воскресенье, 07.04.2013, 20:00 | Сообщение # 247 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| да, еще и флаг бит ADIF нужно отслеживать... не могу сообразить как программно это реализовать...
вот так правильно ?
check_cycle:________________________; цикл проверки in Temp, ADCSRA___________________; sbrs Temp, 4_______________________ ; пропустить следующую команду, если ADIF установлен. rjmp check_cycle_____________________; если ADIF не установлен, то циклимся
---
выявил еще один глюк
У меня длина импульса неизменна, а вот пауза меняется по длительности ( осциллограмма инвертирована ) не смотря на то, что я изначально задал высокий уровень на OC1A.
и почему-то ( видно из осциллограммы ) каналы меняются местами..
разбираюсь....
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Понедельник, 08.04.2013, 00:29 |
|
| |
ВитГо | Дата: Понедельник, 08.04.2013, 09:03 | Сообщение # 248 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| ну задай низкий уровень на OC1A :-) у тебя же первый же вход в прерывание приведет к тому что на OC1A значение измениться на противоположное !! поэтому нужно на OC1A первоначально устанавливать уровень противоположный нужному
ожидание флага вроде правильно сделал.. -если он конечно устанавливается, а не сбрасывается при чтении значения :-)
правда опять написал не понятно !!
смотри, в m32def.inc есть такой кусочек описания: Код ; ADCSRA - The ADC Control and Status register .equ ADCSR = ADCSRA ; For compatibility .equ ADPS0 = 0 ; ADC Prescaler Select Bits .equ ADPS1 = 1 ; ADC Prescaler Select Bits .equ ADPS2 = 2 ; ADC Prescaler Select Bits .equ ADIE = 3 ; ADC Interrupt Enable .equ ADIF = 4 ; ADC Interrupt Flag .equ ADATE = 5 ; When this bit is written to one,the Timer/Counter2 prescaler will be reset.The bit will be cleared by hardware after the operation is performed.Writing a zero to this bit will have no effect.This bit will always be read as zero if Timer/Counter2 is clocked by the internal CPU clock.If this bit is written when Timer/Counter2 is operating in asynchronous mode,the bit will remain one until the prescaler has been reset. .equ ADFR = ADATE ; For compatibility .equ ADSC = 6 ; ADC Start Conversion .equ ADEN = 7 ; ADC Enable
то есть ADIF уже определен как значение !!
следовательно тебе более правильно с точки зрения последующей понятности кода было бы написать Код check_cycle:________________________; цикл проверки in Temp, ADCSRA___________________; sbrs Temp, ADIF_______________________ ; пропустить следующую команду, если ADIF установлен. rjmp check_cycle_____________________; если ADIF не установлен, то циклимся
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Понедельник, 08.04.2013, 09:50 | Сообщение # 249 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| Цитата (ВитГо) то есть ADIF уже определен как значение !!
следовательно тебе более правильно с точки зрения последующей понятности кода было бы написать Код
check_cycle:________________________; цикл проверки in Temp, ADCSRA___________________; sbrs Temp, ADIF_______________________ ; пропустить следующую команду, если ADIF установлен. rjmp check_cycle_____________________; если ADIF не установлен, то циклимся я именно это и хотел услышать увидеть! СПАСИБО!
________________________________________________________
Код ну задай низкий уровень на OC1A :-) у тебя же первый же вход в прерывание приведет к тому что на OC1A значение измениться на противоположное !! поэтому нужно на OC1A первоначально устанавливать уровень противоположный нужному Я это понимаю. Все было рассчитано, но почему-то не сканало. Сейчас код еще раз проверю. При первом входе в прерывание, должна начать передаваться пауза - по этому изначально нужен высокий уровень ...
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Понедельник, 08.04.2013, 10:00 |
|
| |
ВитГо | Дата: Понедельник, 08.04.2013, 09:54 | Сообщение # 250 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| кстати привыкай более локальные имена меткам давать.. с ростом объема программы это очень пригодиться..
я всегда стараюсь давать метки в больших проектах так модуль_функция_действие
получается немного длинно, но зато не задумываешься о наличии такой же метки в другой части проекта...
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Понедельник, 08.04.2013, 09:57 | Сообщение # 251 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| выше сообщение появилось
Цитата (ВитГо) получается немного длинно, но зато не задумываешься о наличии такой же метки в другой части проекта... а компилятор на длинную метку не будет ругаться ?
например вот так - ADIF_check_cycle: ???
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Понедельник, 08.04.2013, 10:03 |
|
| |
ВитГо | Дата: Понедельник, 08.04.2013, 10:52 | Сообщение # 252 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| у меня бывали метки символов по 20 :-) лучше даже так ADC_F_ADIF_WAIT - понятно и какое устройство (модуль), понятно что флаг и какой и понятно что делаем..
если в разных местах программы нужно сделать ожидание флага - то более правильным будет оформить этот код в виде подпрограммы, но если уж совсем приперло в быстродействии то можно назвать ADC_F_ADIF_WAIT_2 (по крайней мере понятно что еще где то есть такой же код).. но лучше все таки использовать подпрограмму - за счет подпрограмм код на ассемблере сильно короче кода на си. - на си просто не получается такие небольшие блоки (в 5-10 команд) объединять при компиляции в подпрограммы.. а на асме запросто...
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Понедельник, 08.04.2013, 11:06 | Сообщение # 253 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| понятно
Виталий, а Ты видел, что на осциллограмме сначала короткий первый канал, потом третий а потом второй, хотя я в это время ручки не трогал... Похоже, что придется заново собирать весь код по блокам - что-то я это ни как не могу ни с чем связать... Я думал этого не будет после того как я проверку флага добавлю, но этот глюк ни куда не делся....
и почему стартуем с низкого уровня на OC1A то же не могу понять ... надо наверно отдельно только генерацию на OC1A сделать и проверить с чем связан этот глюк
не успеваю за своими мыслями......
|
|
| |
ВитГо | Дата: Понедельник, 08.04.2013, 16:28 | Сообщение # 254 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| дроби код и проверяй по блочно..
еще лучше -пиши маленькие программы в которых четко разделяй функционал на блоки - потом простым копи-пасте будешь получать работающую программу
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Понедельник, 08.04.2013, 17:54 | Сообщение # 255 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| о-о, я тут поднял нашу переписку, где Ты меня учил принудительно устанавливать (сбрасывать) вывод OC1A
вот http://vg.ucoz.ru/forum/8-26-1
Цитата ldi R16 , (1<<COM1A1)|(0<<COM1A0) ; установка вывода OC1A=0 out TCCR1A , R16
ldi R16 , (1<<COM1A1)|(0<<COM1A0)|(1<<FOC1A) out TCCR1A , R16
сделал как в твоем примере и это помогло!
а почему нельзя просто вот так сделать? ldi R16 , (1<<COM1A1)|(0<<COM1A0)|(1<<FOC1A) ? наверно что-то не успевает переключится внутри МК ?
______________________
осталось выяснить почему каналы меняются местами...
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Понедельник, 08.04.2013, 18:06 |
|
| |
|