Свежие обсуждения
Микроконтроллеры

AVR начинающим - вопросы и ответы

1 58 68

По практическим результатам лучше всего иметь хороший бп +5.125V с плавной и точной установкой вых напряжения многооборотным борнсиком. Это было даже практичнее при -40 +40 температуры. А с этими LM285 проблемы с пересчётом на дробные цифры для 8-разрядника где сразу будет теряться точность при арифметических вычислениях этих дробей и приведения сразу теряется больше чем процент, и малый диапазон напряжения. Для Мег перебор. Для 32-х разрядов есть смысл может быть. ИМХО. Выставляете напряжение питания +5.125 и работаете уже не с кодами внутри программы мк или дробями, а с напряжениями 1 в 1 и ничего не теряется. 5.125/1024=0.005004V Проверяется бп при всех темп и нагрузках и делается вывод, а нужен ли Vref такой точности или от бп достаточен и нет резко сильноточных нагрузок. LM1086-ADJ остановились на ней, и как бп и как Vref достаточный.

 

Проц взял Мегу, т. к. хорошо их знаю. По делу хорошо бы конечно STM32 освоить, но на это надо время. Так что лучше я STMы дома "на кошках" как-нить изучу, а тут пойду по известному пути.
Насчет питалова - уж больно скептически я отношусь к такой опоре))) 431 - ито больше уважаю. Питалово - это во-первых, мусор от самого проца и от других микрух (у меня там еще RS485 на микрухе с встроенным трансом будет). Во-вторых, сделать стабильный силовой БП гораздо сложнее, чем поставить маломощную хорошую "КРЕНку" на опору. Да и выбор этих стабильных микрух-ИОНов больше, чем силовых стабильных КРЕН (сомневаюсь что они вообще есть в чистом виде).
Да и опять же, зачем именно 5В? Эту LM285 разве нельзя как 431 делителем "подкрутить"? Могу ведь поставить 4096В, скажем. Резики на 0,1% щас не редкость. Да и борнсики тоже) Да и программная коррекция существует (но тут вычисления...)

 

Здравствуйте.
Появилась потребность воспользоваться внешними прерываниями у mega328p.
Раньше использовал их у меги8 без проблем, а тут ерунда какая-то.
Флаги внешнего прерывания зажигаются(использую INT0), а обработчик почему-то не вызывается. Причину так и не понял.
Код тестил в AVR Studio 6
Ссылка на код - http://pastebin.ru/8mcp5k0g (специальный сайт для демонстрации кода)
Надеюсь на вашу помощь. Заранее спасибо.

 

На самом деле у вас срабатывает прерывание INT1 по низкому уровню, а прерывание по INT0 не работает.
Проверить легко, разрешите только INT0 (EIMSK=1), никаких прерываний вообще не возникнет.

 

Замечу, что SEI стоит не там; установку адреса вв, не доступного командой OUT, можно сделать проще
.include "m328def.inc"

.def tmp = r16

jmp RESET
jmp EXT_INT0
RETI ;jmp EXT_INT1

EXT_INT0:
ldi tmp, 0x81
out PORTB, tmp
reti

RESET:
; ldi r16, high(RAMEND); Main program start
; out SPH,r16 ; Set Stack Pointer to top of RAM
; ldi r16, low(RAMEND)
; out SPL,r16
; sei ; Enable interrupts

ldi tmp, 0xFF
out DDRB, tmp

clr tmp
out PORTB, tmp

;;;;;;;;;
; Настройка внешних прерываний
;;;;;;;;;
ldi tmp, 0x01
; ldi tmp, 0x03
out EIMSK, tmp ; Включаем EXT_INT0
OUT EIFR,tmp ; Чистим флаги

; clr ZH
; ldi ZL, EICRA ; EICRA - управляет режимом внешнего прерывания
ldi tmp, 0x03
STS EICRA,tmp
; st Z, tmp ; EXT_INT0 по фрону сигнала

;;;;;;;;;
; Настройка таймера для измерения периодов ;,;
;;;;;;;;;
ldi tmp, 0x01
STS TCCR1B,tmp
; clr ZH
; ldi ZL, TCCR1B
; st Z, tmp ; Запуск таймера без делителя

sei ; Enable interrupts

MAIN:
rjmp MAIN
.EXIT

 

Спасибо за команду STS.
Перечитал даташит (часть про внешние прерывания) - у меня все верно. Включаю только нулевое прерывание.
Оно срабатывает (флаг загорается), но обработчик не вызывается.
Вот скрин для наглядности:

 

В моей студии 4.19 build 730 работает.

 

Swamp_Dok: Оно срабатывает (флаг загорается), но обработчик не вызывается.

А код Вы прогоняете в симуляторе студии ?
Если да, то следует иметь в виду, что обработка внешних событий в симуляторах редко когда поддерживается адекватно.
Залейте код в МК и тогда посмотрите.

 

Swamp_Dok: Перечитал даташит (часть про внешние прерывания) - у меня все верно. Включаю только нулевое прерывание

Тут вы немного лукавите - раньше вы включали ОБА внешних прерывания.

Теперь про наступление внешнего прерывания в симуляторе. Поскольку прерывание внешнее, то симулятор попросту не знает, когда оно наступит, вы должны сами в любой момент либо создать перепад 0-1 в порту Д2, записав туда 1, либо просто установив флаг прерывания (1->EIFR). Ну и для визуального контроля в теле прерывания замените команду out PORTB,tmp на команду out PINB,tmp, тогда при наступлении очередного прерывания порт Б будет переключаться с 0х00 на 0х81 и обратно.

 

Тестировал код в 6-й студии.

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

Склоняюсь к тому, что студия некорректно симулирует работу МК. Попробую поставить другую версию. О результатах отпишусь.

В 7-й студии тот же результат. Скачал 4-ю, а там нет 328p. Тогда остается только в железе проверить.