Страница 428 из 628

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Чт апр 18, 2013 10:30:17
Gudd-Head
Мikа писал(а):Флаг - это 1 в регистре GIFR, правильно?
Флаг — это БИТ, необязательно "1" и необязательно в GIFR. Но таки да, в GIFR (General Interrupt Flag Register) флаги внешних прерываний: "0" — прерывания не было, "1" — было.

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Пт апр 19, 2013 13:37:20
Мikа
Привет, коты =) Я почти добрался до прерывания, но есть очередной вопрос.

Сейчас у меня собран макет, в котром участвует:
ATmega32,
Тройной семисегментный индикатор с общим анодом,
Резисторы и провода, импровизированная кнопка.

Всё это должно выполнять следующие действия:
По одному семисегментному индикатору бегает огонёк по направлению a-b-c-d-e-f. Это работает, ничего сложного тут и нет.
При нажатии кнопки должно происходить переключение на следующий индикатор.

Вот текст программый, который есть на данный момент

Да, надо добавить вот что: PB0-PB5 по очереди дают 0, пропуская ноги индикатора к Земле.
PD6 питает общий анод первого индикатора. PD5 ждёт своей очереди для второго. PD2 - ножка прерывания.
Спойлер/*
* Led_01.asm
*
* Created: 15.04.2013 18:19:53
* Author: test3
*/


.include "C:\Program Files (x86)\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRAssembler\2.1.51.64\avrassembler\include\m32def.inc"

.def Temp1=R16 ;присвоение названий регистрам общего назначения
.def Temp2=R17
.def Temp3=R18

.cseg ;начало пограммного сегмента
.org 0

ldi Temp1, high(RamEnd); Установка указателя стека в начало ОЗУ Set Stack Pointer to top of RAM
out SPH, Temp1;
ldi Temp1, low(RamEnd);
out SPL, Temp1;

ldi Temp1, 0b10000000 ;Глобальное разрешение прерываний
out SREG, Temp1

ldi Temp1, 0b01000000 ;Разрешение прерывания на ножке ИНТ0
out GICR, Temp1

ldi Temp1, 0b0000000
out MCUCR, Temp1 ;Прерывание при 0 на INT0

ldi Temp1, 0b11111111 ;Настройка порта B на выход
out DDRB, Temp1

ldi Temp1, 0b1100000 ;Настройка порта D 2 выхода и входы
out DDRD, Temp1

ldi Temp1, 0b1000000 ;Включаем первый дисплей
out PortD, Temp1

begin: ldi Temp1, 0b11111110 ;Включаем Сегмент А
rcall Delay

ldi Temp1, 0b11111101 ;Включаем Сегмент B
rcall Delay

ldi Temp1, 0b11111011 ;Включаем Сегмент C
rcall Delay

ldi Temp1, 0b11110111 ;Включаем Сегмент D
rcall Delay

ldi Temp1, 0b11101111 ;Включаем Сегмент E
rcall Delay

ldi Temp1, 0b11011111 ;Включаем Сегмент F
rcall Delay

rjmp begin ;В начало цикла

Delay: out PortB, Temp1 ; Задержка
ldi Temp1, 0
ldi Temp2, 150

Loop: inc Temp1
brne Loop

inc Temp2
brne Loop

ret

int_0: ldi Temp3, 0b1000000
out PortD, Temp3
Спросить я хотел следующее:
1). Что нужно вписать в ножку PD2 (INT0), которая настроена на вход и ждёт, когда на ней вместо лог 1 будет лог 0 (к нй через 6.9 кОм подведено +5в, при нажатии на кнопку эти 5 через эти 6.9 кОм подсоедиянтся к земле). Так вот, что в неё изначально записать, 1 или 0? Так, стоп. Пока писал, вспомнил, что если порт настроен на вход, то не важно, что ты в него запишешь. Я не удаляю эти мысли в слух, тк ваше подтверждение очень нужно :)

2). Как я понял из прочитанной статьи про бегущей огонёк, то при прерывании по INT0, программа обратится к адресу этого прерывания. По даташиту оно записнао как $002. По этому адресу надо поставить безусловный переход на обработчик этого прерывания. А как это правильно сделать? Я пробовал эксперементировать с командой org, но что-то ничего дельного не вышло.

Если я где-то написал какой-то бред, прошу не бить, а сказать, что именно бред - пойду читать :)

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Пт апр 19, 2013 13:40:23
Gudd-Head
Почитайте в ДШ пример кода для вектора прерываний.

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Пт апр 19, 2013 13:42:07
Мikа
Спасибо, понял что искать :)

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

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Пт апр 19, 2013 14:24:44
Gudd-Head
При чём тут гугл? В ДШ есть пример.

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Пт апр 19, 2013 14:47:46
Мikа
К Гуглу относится только последнее предложение моего поста. Я не могу найти пример в даташите.ю Сомневаюсь, что я ищу то, что надо. Я написал, что я пытаюсь там найти. Надо искать что-то другое?

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Пт апр 19, 2013 14:50:56
ibiza11
Открываете файл "m32Adef.inc" из папки "...Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes"
нажимаете Ctrl+F, вводите "interrupt vectors", жмете Enter
Видите табличку, каждая строка которой выглядит примерно так
.equ INT0addr = 0x0002 ; External Interrupt Request 0
выделяете всю табличку, копируете себе в исходник.
заменяете все ".equ" на ".org"
"= 0x0002" удаляете во всех строчках
после каждой строчки пишете
jmp <метка>
в самое начало таблицы добавляем две строчки:
.org 0
jmp RESET

Далее каждую метку пишете отдельно ниже таблицы векторов, не забывая после метки ставить двоеточие.
После этого пишете команду reti. Это буде заглушка для всех прерываний.
после этого пишете
RESET:
и после этой метки вставляете свою программу. Должно получиться вот так:
Спойлер

Код: Выделить всё

; ***** INTERRUPT VECTORS ************************************************
.org 0
   jmp RESET
.org INT0addr; External Interrupt Request 0
   jmp INT0_IRQ
.org INT1addr; External Interrupt Request 1
   jmp INT1_IRQ
.org INT2addr; External Interrupt Request 2
   jmp INT2_IRQ
.org OC2addr ; Timer/Counter2 Compare Match
   jmp OC2_IRQ
.org OVF2addr; Timer/Counter2 Overflow
   jmp OVF2_IRQ
.org ICP1addr; Timer/Counter1 Capture Event
   jmp ICP1_IRQ
.org OC1Aaddr; Timer/Counter1 Compare Match A
   jmp OC1A_IRQ
.org OC1Baddr; Timer/Counter1 Compare Match B
   jmp OC1B_IRQ
.org OVF1addr; Timer/Counter1 Overflow
   jmp OVF1_IRQ
.org OC0addr ; Timer/Counter0 Compare Match
   jmp OC0_IRQ
.org OVF0addr; Timer/Counter0 Overflow
   jmp OVF0_IRQ
.org SPIaddr ; Serial Transfer Complete
   jmp SPI_IRQ
.org URXCaddr; USART, Rx Complete
   jmp URXC_IRQ
.org UDREaddr; USART Data Register Empty
   jmp UDRE_IRQ
.org UTXCaddr; USART, Tx Complete
   jmp UTXC_IRQ
.org ADCCaddr; ADC Conversion Complete
   jmp ADCC_IRQ
.org ERDYaddr; EEPROM Ready
   jmp ERDY_IRQ
.org ACIaddr ; Analog Comparator
   jmp ACI_IRQ
.org TWIaddr ; 2-wire Serial Interface
   jmp TWI_IRQ
.org SPMRaddr; Store Program Memory Ready
   jmp SPMR_IRQ
; ************************************************************************

INT0_IRQ:
INT1_IRQ:
INT2_IRQ:
OC2_IRQ:
OVF2_IRQ:
ICP1_IRQ:
OC1A_IRQ:
OC1B_IRQ:
OVF1_IRQ:
OC0_IRQ:
OVF0_IRQ:
SPI_IRQ:
URXC_IRQ:
UDRE_IRQ:
UTXC_IRQ:
ADCC_IRQ:
ERDY_IRQ:
ACI_IRQ:
TWI_IRQ:
SPMR_IRQ:
   reti

RESET:
   rjmp PC
при необходимости ввести какое-либо прерывание, определяем соответствующую ему метку и комментируем(или удаляем) ее в списке заглушек и где-нибудь ниже таблицы векторов отдельно ее описываем. После этой метки должен идти код обработчика прерывания. В конце не забываем ставить reti. Пример:
Спойлер

Код: Выделить всё

OC0_IRQ:
   clr tmp
   out TCCR1A, tmp
   ser tmp
   out TCCR1B, tmp
   reti
В основной программе настраиваем периферийный модуль на генерацию прерывания, разрешаем глобальные прерывания. Вроде все.

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Пт апр 19, 2013 14:56:15
Gudd-Head
Вот, раздел Interrupts ДШ:
Изображение

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Пт апр 19, 2013 15:50:17
Мikа
Всё заработало, огромное спасибо, ibiza11! Щас буду облагораживать программу :)
Gudd-Head, да, я нашёл это в даташите. Но понимания этого не добавило. Поэтому выше я и написал, что:
Мikа писал(а): ... Не могу найти. Может ищу не то? Хочу найти пример кода, в котором найду обработчик прерывания с меткой и то, что отправит программу на эту метку в случае возникновения прерывания. Не то ищу? ...
Да, сорри за п 2.2. нарушил его, чтобы в теме засветилось непрочитанное сообщение. Не знаю наверняка, делает ли сообщение "не прочитанным" обновление последнего сообщения в теме.

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Пт апр 19, 2013 15:52:30
Gudd-Head
Мikа писал(а):Не знаю наверняка, делает ли сообщение "не прочитанным" обновление последнего сообщения в теме.
Удаляйте своё последнее и пишите заново. Тогда засветит.

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Пт апр 19, 2013 19:11:22
Мikа
Gudd-Head, может я опять не вижу чего-то, может быть не там смотрю, но у меня из возможностей относительно сообщения только это:
Изображение

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

Лично я, как модер, на это накалывался :beer:
Раз уж нафлудил не по теме, то заодно пожелаю всем хороших выходных, коты!

ibiza11, ещё раз огромное спасибо, вы открыли мне новое поле для деятельности и изучения!

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Пт апр 19, 2013 19:16:48
gauss
Изображение

Читал про R-2R преобразователи и так и не понял, как формируется напряжение на ваыходе :facepalm:
Объясните чайнику, пожалуйста

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Пт апр 19, 2013 21:06:07
FreshMan
кто может по простому растолковать: зачем нужна двойная буферизация в режиме Fast PWM в МК ATmega8 ?

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Пт апр 19, 2013 21:45:18
Alexeyslav
Чтобы не наткнутся на неполный цикл когда меняешь значение. Отрабатывает цикл до конца, только потом применяется установленное значение.

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

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Пт апр 19, 2013 22:07:07
gauss
Там получается сложный делитель, который я НУ НИКАК не могу понять :facepalm: :facepalm:

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Пт апр 19, 2013 22:16:35
Alexeyslav
А чего их понимать... рисуешь схему где резисторы подключены одни на 0 другие на +5В и сидишь считаешь какое напряжение на выходе будет. Проще конечно пощупать в протеусе или чем-то подобном, с наглядными переключателями. Вобщем, оно работает!

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Пт апр 19, 2013 22:20:35
vitalik_1984
gauss писал(а):Там получается сложный делитель
Все понятно, разберитесь на примере двух выходов, будет понятно. А много выходов- это всего лишь увеличение разрядности. То есть 1 бит- два состояния два - четыре и так далее.
Только не понятно как этот вопрос относится к МК и ПЛИСС.

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Пт апр 19, 2013 22:37:21
gauss
получается, что макимальное выходное напряжнние будет равно напряжение питания минус минимальное выходное напряжение?

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Пт апр 19, 2013 22:57:44
Gudd-Head
gauss писал(а):минус минимальное выходное напряжение?
Всё-таки нет. Минимальное выходное будет ноль, а максимальное — напряжение питания минус 1 МЗР.

Re: Мелкие вопросы по МК и ПЛИС.

Добавлено: Сб апр 20, 2013 14:21:28
gauss
Нарисовал это делитель, подсчитал :) Вроде стало ясно, только быстро тут не сообразишь, имхо
МЗР - минимальная разрешающая способность?