Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
28.11.2007, 16:30
|
|
Вид на жительство
Регистрация: 05.09.2006
Сообщений: 360
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Господа, позвольте вернуться к вопросу по теме.
В реальной задаче, которой на данный момент нет, если она сформулирована правильно и правильно составлен алгоритм работы, глобальный запрет прерываний при выходе из прерывания сбрасывать не нужно.
Для запрета прерываний внутри обработчика можно сбросить все запросы и запретить прерывания от источников, сбросив индивидуальные флаги разрешения прерываний.
Ну, а если уж автору очень надо, то можно использовать следующий прием. Пишем где-нибудь в основном коде строки cli, ret (или на C - функцию, просто сбрасывающюю флаг i). Перед выходом из прерывания в стек заносим адрес вызова этой функции. Т.о. при выходе из обработчика будет сначала исполнена команда cli, а затем командой ret выполнится возврат в основной код.
Удачи.
ЗЫ пардон за частое употребление "прерываний"
|
|
|
|
28.11.2007, 19:19
|
|
Временная регистрация
Регистрация: 28.02.2007
Сообщений: 90
Сказал спасибо: 6
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Сообщение от avr123-nm-ru
|
Вот я в примере LED из CVAVR вписал строку
OCR1A = 314;
нормально скушал и записал по байтам.
|
Нда странно все это ![Обижен](images/smilies/icon_beee.gif) (
Почему же тогда у меня не так?
В хедере добавляем строки
Код:
|
#define ICR1 (*(unsigned int *) 0x86) // 16 bit access
#define OCR1A (*(unsigned int *) 0x88) // 16 bit acces
#define OCR1B (*(unsigned int *) 0x8A) // 16 bit access
#define OCR1C (*(unsigned int *) 0x8C) // 16 bit access |
В main() после настройки конфигурации пишем:
Код:
|
void main(void)
{
...
while (1)
{
ICR1 = 620;
OCR1A = 621;
OCR1B = 622;
OCR1C = 623;
};
} |
Теперь открываем листинг и что мы там видим?
Коды добавленные копилятором я частично вырезал.
Код:
|
198 while (1)
199 {
200 ICR1 = 620;
LDI R30,LOW(620)
LDI R31,HIGH(620)
STS 134,R30
STS 134+1,R31
201 OCR1A = 621;
LDI R30,LOW(621)
LDI R31,HIGH(621)
STS 136,R30
STS 136+1,R31
202 OCR1B = 622;
LDI R30,LOW(622)
LDI R31,HIGH(622)
STS 138,R30
STS 138+1,R31
203 OCR1C = 623;
LDI R30,LOW(623)
LDI R31,HIGH(623)
STS 140,R30
STS 140+1,R31
204 }; |
Не корректно записываются значения в регистры.
Ну и что с этим делать? Надо вначале старший потом младший байт. А никак не наоборот.
|
|
|
|
29.11.2007, 08:22
|
|
Вид на жительство
Регистрация: 05.09.2006
Сообщений: 360
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
buka_2004
Хоть я и не силен в C, но все же. Вы объявили регистры, как переменные в статической памяти, поэтому компилятор и вставил строки STS (заметьте не OUT, как у nml). И обращается он с регистрами в этом случае как с обычной переменной int. Я думаю nml вообще не декларировал (дополнительно) регистры, а использовал хидер аврки.
Удачи.
|
|
|
|
30.11.2007, 02:15
|
|
Гражданин KAZUS.RU
Регистрация: 26.09.2005
Сообщений: 569
Сказал спасибо: 58
Сказали Спасибо 509 раз(а) в 135 сообщении(ях)
|
Сообщение от nokazus
|
buka_2004
Хоть я и не силен в C, но все же. Вы объявили регистры, как переменные в статической памяти, поэтому компилятор и вставил строки STS (заметьте не OUT, как у nml). И обращается он с регистрами в этом случае как с обычной переменной int. Я думаю nml вообще не декларировал (дополнительно) регистры, а использовал хидер аврки.
Удачи.
|
Долго врубался в пост по этой теме и зачинателю настоятельно советую принять всерьез цитату и предыдущее сообщение того же автора "nokazus". Он мудр и рационален. Кроме того, FAST (подчеркнуто) PWM на стандартных AtMega-AtTiny исходно восьмиразрядный (может отстал?) и фортели с 9, 10 и прочими битами непредсказуемы.
|
|
|
|
30.11.2007, 17:05
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Сообщение от marera
|
... FAST (подчеркнуто) PWM на стандартных AtMega-AtTiny исходно восьмиразрядный (может отстал?) и фортели с 9, 10 и прочими битами непредсказуемы.
|
Отстал, отстал - разрешение FastPWM'а и больше бывает, и это не фортели - это документированные режимы:
‹center›
-- Прилагается рисунок: --
‹IFRAME src = "nuke/users_images/30112007/434799.gif" frameborder="0" name="fr7275841" scrolling="yes" width="470" height="279" align="bottom"›[img]nuke/users_images/30112007/434799.gif[/img]
‹font color=red›Рисунок не умещается на странице и поэтому сжат!‹/font›
Для того, чтобы просмотреть его полностью, щелкните здесь.
‹/IFRAME›
‹/center›
|
|
|
|
01.12.2007, 16:01
|
|
Временная регистрация
Регистрация: 28.02.2007
Сообщений: 90
Сказал спасибо: 6
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Сообщение от nokazus
|
buka_2004
Хоть я и не силен в C, но все же. Вы объявили регистры, как переменные в статической памяти, поэтому компилятор и вставил строки STS (заметьте не OUT, как у nml). И обращается он с регистрами в этом случае как с обычной переменной int. Я думаю nml вообще не декларировал (дополнительно) регистры, а использовал хидер аврки.
Удачи.
|
В том то и проблема что в хидере эти переменные объявлены только как char а мне надо бы обращатся как int потому что так получается быстрее выполнение кода.
|
|
|
|
01.12.2007, 17:35
|
|
Временная регистрация
Регистрация: 28.02.2007
Сообщений: 90
Сказал спасибо: 6
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Еще вопрос по поводу сброса флагов прерываний от таймера. Как правильно сбросить все флаги прерываний?
В ДШ пишут что сброс флага осуществляется записью единицы в разряд. С другой стороны если флаг не стоит то что будет если записать единицу?
|
|
|
|
01.12.2007, 17:44
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
ноль будет.
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
01.12.2007, 18:26
|
|
Гражданин KAZUS.RU
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
Сообщение от buka_2004
|
Еще вопрос по поводу сброса флагов прерываний от таймера. Как правильно сбросить все флаги прерываний?
В ДШ пишут что сброс флага осуществляется записью единицы в разряд. С другой стороны если флаг не стоит то что будет если записать единицу?
|
Обычно в таких случаях запускаю аврстудио, и на нем все смотрю... Удобно
|
|
|
|
02.12.2007, 13:20
|
|
Временная регистрация
Регистрация: 28.02.2007
Сообщений: 90
Сказал спасибо: 6
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Сообщение от dimonbest
|
Обычно в таких случаях запускаю аврстудио, и на нем все смотрю... Удобно
|
Это конечно удобно, но студия_4 очень плохо симулирует работу. Большинство переферии вообще не симулирует.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
CVAVR while и таймер
|
kr11507 |
Микроконтроллеры, АЦП, память и т.д |
10 |
13.12.2008 21:29 |
Програмирование портов Infenon С167
|
vadimvarn |
Микроконтроллеры, АЦП, память и т.д |
1 |
01.11.2008 02:31 |
Програмирование по SPI
|
EKuzmich |
Микроконтроллеры, АЦП, память и т.д |
2 |
09.07.2008 21:35 |
програмирование АТmega32???
|
TimaON |
Микроконтроллеры, АЦП, память и т.д |
0 |
06.05.2008 14:41 |
Програмирование attiny2313
|
Gorgic |
Микроконтроллеры, АЦП, память и т.д |
1 |
15.12.2007 00:00 |
Часовой пояс GMT +4, время: 11:17.
|
|