Четверг, 02.05.2024, 00:52
Вы вошли как Гость | Группа "Гости"Приветствую Вас Гость | RSS
Главная | Пропорциональное управление на МК с нуля - Страница 17 - Форум | Мой профиль | Регистрация | Выход | Вход
Обитель RC-инженера
Форма входа
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Модератор форума: ВитГо  
Форум » Разработка электронных устройств » Разрабатываю ! » Пропорциональное управление на МК с нуля (пошаговое строительство пропорционального управления с нуля)
Пропорциональное управление на МК с нуля
uwrteyДата: Воскресенье, 07.04.2013, 00:16 | Сообщение # 241
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
Цитата (ВитГо)
что значит "ничего" ? он встретит во флеш какие то байты - и будет интерпретировать их как команды :-))

и ему пофигу что именно это за команда - он просто будет ее исполнять :-) в машинных кодах сообщений об ошибках нет :-)


Странно, что компилятор не выдает сообщение об ошибке.
Прерывание разрешено, а вектор прерывания отсутствует.
Может по-этому некоторые люди делают как в обучалке на радиокоте ?


не успеваю за своими мыслями......
 
ВитГоДата: Воскресенье, 07.04.2013, 07:58 | Сообщение # 242
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
а компилятору тем более по барабану ! он не проверяет это !!

может быть у тебя по любому прерыванию полный сброс задуман ?! :-) - поэтому и не проверяет.

в обучалке радиокота не очень хороший пример - и с ним тоже можно много глюков поймать :-)

проще поставить RETI на каждое прерывание (а не как в обучалке один выход на все) - так более правильно...

ну и еще лучше конечно смотреть какие прерывания используешь - это не так сложно :-)


Виталий (аka ВитГо)
 
uwrteyДата: Воскресенье, 07.04.2013, 11:58 | Сообщение # 243
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
Цитата (ВитГо)
может быть у тебя по любому прерыванию полный сброс задуман ?! :-) - поэтому и не проверяет.

Это понятно... Вот только в моем случае ни чего не было.
То-есть прерывание было настроено, а вектора прерывания не было.
Мне интересно куда "уходил" процессор при входе в прерывание? ( он даже что-то умудрялся на экране рисовать smile )


не успеваю за своими мыслями......
 
uwrteyДата: Воскресенье, 07.04.2013, 14:31 | Сообщение # 244
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
Что бы проверить АЦП, я сделал незатейливую программу.
Она должна единожды вычислить АЦП одного канала и сохранить значение в ОЗУ.
После этого значение должно быть прочитано из ОЗУ и выведено на экран.
Но на экране я получаю нули... ( 0000 )

Вот у меня и закралось подозрение, что что-то не так с настройками АЦП
это:
либо слишком низкая частота преобразования
либо еще что-то... ( А точно нормально, что прерывание АЦП отключено? АЦП ведь аппаратный? Процессор не принимает участия в вычислении АЦП? )
Прикрепления: 5830550.asm (7.1 Kb)


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Воскресенье, 07.04.2013, 15:02
 
ВитГоДата: Воскресенье, 07.04.2013, 15:22 | Сообщение # 245
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
смотри правильность работы с АЦП..

частоту преобразования ставь максимальную (чтобы не задумываться о том успеваешь или нет)

кстати, когда запускаешь преобразование - не забываешь потом подождать его результатов ? там флаг какой то в регистре должен измениться.. и только после этого можно забирать результат преобразования


Виталий (аka ВитГо)
 
uwrteyДата: Воскресенье, 07.04.2013, 17:45 | Сообщение # 246
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
бит ADIF должен стать равным 1

а я пробовал сделать так:
Я ставил максимальную частоту и делал задержку (длительностью в несколько секунд) в самом начале главного цикла
у меня получается число 03FF !!! и оно ни как не зависит от положения ручек... wacko ( 03FF=1023 )

а на линии АЦП диоды не надо вешать ?

Добавлено (07.04.2013, 16:58)
---------------------------------------------
ну теперь и с этим разобрался...
у меня опорное напряжение было не правильно настроено...


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Воскресенье, 07.04.2013, 23:02
 
uwrteyДата: Воскресенье, 07.04.2013, 20:00 | Сообщение # 247
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
да, еще и флаг бит ADIF нужно отслеживать...
не могу сообразить как программно это реализовать...
sad

вот так правильно ?

check_cycle:________________________; цикл проверки
in Temp, ADCSRA___________________;
sbrs Temp, 4_______________________ ; пропустить следующую команду, если ADIF установлен.
rjmp check_cycle_____________________; если ADIF не установлен, то циклимся

---

выявил еще один глюк

У меня длина импульса неизменна, а вот пауза меняется по длительности ( осциллограмма инвертирована )
не смотря на то, что я изначально задал высокий уровень на OC1A.

и почему-то ( видно из осциллограммы ) каналы меняются местами..

разбираюсь....

Прикрепления: 3031412.jpg (15.5 Kb)


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Понедельник, 08.04.2013, 00:29
 
ВитГоДата: Понедельник, 08.04.2013, 09:03 | Сообщение # 248
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: 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
Репутация: 11
Статус: Offline
Цитата (ВитГо)
то есть ADIF уже определен как значение !!

следовательно тебе более правильно с точки зрения последующей понятности кода было бы написать
Код

check_cycle:________________________; цикл проверки
in Temp, ADCSRA___________________;
sbrs Temp, ADIF_______________________ ; пропустить следующую команду, если ADIF установлен.
rjmp check_cycle_____________________; если ADIF не установлен, то циклимся

я именно это и хотел услышать увидеть! biggrin СПАСИБО!

________________________________________________________

Код
ну задай низкий уровень на OC1A :-) у тебя же первый же вход в прерывание приведет к тому что на OC1A значение измениться на противоположное !! поэтому нужно на OC1A первоначально устанавливать уровень противоположный нужному

Я это понимаю. Все было рассчитано, но почему-то не сканало. Сейчас код еще раз проверю.
При первом входе в прерывание, должна начать передаваться пауза - по этому изначально нужен высокий уровень ...


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Понедельник, 08.04.2013, 10:00
 
ВитГоДата: Понедельник, 08.04.2013, 09:54 | Сообщение # 250
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
кстати привыкай более локальные имена меткам давать..
с ростом объема программы это очень пригодиться..

я всегда стараюсь давать метки в больших проектах так
модуль_функция_действие

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


Виталий (аka ВитГо)
 
uwrteyДата: Понедельник, 08.04.2013, 09:57 | Сообщение # 251
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
выше сообщение появилось biggrin

Цитата (ВитГо)
получается немного длинно, но зато не задумываешься о наличии такой же метки в другой части проекта...

а компилятор на длинную метку не будет ругаться ?

например вот так - ADIF_check_cycle: ???


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Понедельник, 08.04.2013, 10:03
 
ВитГоДата: Понедельник, 08.04.2013, 10:52 | Сообщение # 252
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
у меня бывали метки символов по 20 :-)
лучше даже так ADC_F_ADIF_WAIT - понятно и какое устройство (модуль), понятно что флаг и какой и понятно что делаем..

если в разных местах программы нужно сделать ожидание флага - то более правильным будет оформить этот код в виде подпрограммы, но если уж совсем приперло в быстродействии то можно назвать ADC_F_ADIF_WAIT_2 (по крайней мере понятно что еще где то есть такой же код).. но лучше все таки использовать подпрограмму - за счет подпрограмм код на ассемблере сильно короче кода на си. - на си просто не получается такие небольшие блоки (в 5-10 команд) объединять при компиляции в подпрограммы.. а на асме запросто...


Виталий (аka ВитГо)
 
uwrteyДата: Понедельник, 08.04.2013, 11:06 | Сообщение # 253
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
понятно smile

Виталий, а Ты видел, что на осциллограмме сначала короткий первый канал, потом третий а потом второй, хотя я в это время ручки не трогал...
Похоже, что придется заново собирать весь код по блокам - что-то я это ни как не могу ни с чем связать...
Я думал этого не будет после того как я проверку флага добавлю, но этот глюк ни куда не делся....

и почему стартуем с низкого уровня на OC1A то же не могу понять ...
надо наверно отдельно только генерацию на OC1A сделать и проверить с чем связан этот глюк
wacko


не успеваю за своими мыслями......
 
ВитГоДата: Понедельник, 08.04.2013, 16:28 | Сообщение # 254
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
дроби код и проверяй по блочно..

еще лучше -пиши маленькие программы в которых четко разделяй функционал на блоки - потом простым копи-пасте будешь получать работающую программу


Виталий (аka ВитГо)
 
uwrteyДата: Понедельник, 08.04.2013, 17:54 | Сообщение # 255
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: 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


сделал как в твоем примере и это помогло! biggrin

а почему нельзя просто вот так сделать?
ldi R16 , (1<<COM1A1)|(0<<COM1A0)|(1<<FOC1A)
?
наверно что-то не успевает переключится внутри МК ?

______________________

осталось выяснить почему каналы меняются местами...


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Понедельник, 08.04.2013, 18:06
 
Форум » Разработка электронных устройств » Разрабатываю ! » Пропорциональное управление на МК с нуля (пошаговое строительство пропорционального управления с нуля)
Поиск:


Copyright MyCorp © 2024
Сделать бесплатный сайт с uCoz