Перейти к содержанию

Прерывания По Таймеру И Внешнему Сигналу


Рекомендуемые сообщения

Значит тема такая: Программа формирования ШИМ сигнала с коэффициентом заполнения 0,4 и 0,6, задаваемым по внешнему прерыванию от двух сигналов, и с периодом 5 кГц. ШИМ сигнал формируется по прерыванию от таймеров. Я написал программу по прерыванию от внешнего сигнала, но прерывание по таймеру не могу написать. Вот программа работающая, но в которой нет прерывания по таймеру:

TIME EQU -(200)
JMP START
ORG 20H
START:
MOV IE,#10000101B ;установка битов регистра разрешения прерываний
CALL SETUPTIMER   ;настройка таймера
MOV R1,#-126
MOV R2,#-40
MOV TCON,#00000101B ;разрешение внешних прерываний по низкому уровню сигнала
JMP TIM
TIM:
CALL FORM  ;подпрограмма формирования сигнала
JMP TIM    ;зациклить на выводе
SETUPTIMER:
MOV  TMOD,#00000001b ;установка таймера в режим 1
MOV P0,#0    ;сброс порта ввода-вывода
RET
DELAY1:
MOV  TH0,#11111111B ;настройка таймера
MOV  TL0,R1
SETB TR0    ;запуск таймера
JNB  TF0,$   ;ожидание переполнения
CLR  TF0    ;сброс флага переполнения
CLR  TR0    ;остановка таймера
RET
DELAY2:
MOV  TH0,#11111111B
MOV  TL0,R2
SETB TR0   
JNB  TF0,$  
CLR  TF0   
CLR  TR0
RET
FORM:
MOV P0,#200  ;вывод точки в порт
CALL DELAY1  ;вызов п/п задержки на высоком уровне
MOV P0,0  ;вывод в порт точки низкого уровня
CALL DELAY2  ;вызов п/п задержки на низком уровне
RET
ORG 0003H  ;адрес источника прерывания INT0
CLR TR0   ;остановка таймера
CLR EA   ;запрет прерываний
MOV R1,#-45
MOV R2,#-120
SETB EA   ;разрешение прерываний
SETB TR0  ;запуск таймера
RETI   ;возврат из п\п прерывания
ORG 0013H  ;адрес источника прерывания INT1
CLR TR0
CLR EA
MOV R1,#-126
MOV R2,#-40
SETB EA
SETB TR0
RETI
END

Как изменить ее так, чтобы вместо подпрограмм задержек по таймеру включалась п\п прерывания?

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

В общем сделал я ее :) Вот код

org 0h
JMP start
org 03h    ;прерывание по INT0
jmp int0_ok
org 0bh    ;прерывание по таймеру 0
clr tr0    ;остановка таймера 0
jnb p1.0,int0_ok
jb p1.0,int0_ok
org 13h    ;прерывание по INT2
jmp int1_ok
org 1bh    ;прерывание по таймеру 1
clr tr1    ;остановка таймера 1
jnb p1.0,int1_ok
jb p1.0,int1_ok
start:
 mov TCON,#00000101b   ;установка битов управления внешними прерываниями
 mov IE,#10001111b   ;настройка битов регистра разрешения прерываний
 mov TMOD,#00010001b   ;настройка режима работы таймеров
 mov r0,#-126    ;задержка
 mov r1,#-40
 jmp $	 
int0_ok:
 clr tr0	   ;остановка таймера
 jnb p1.0,my4	 ;пауза или импульс
 mov  TH0,#11111111B   ;загрузка на отсчет
 mov  TL0,r0	 ;паузы
 clr p1.0	  ;сброс бита порта
 jmp my5	  
my4:
 mov  TH0,#11111111B ;загрузка на отсчет
 mov  TL0,r1   ;импульса
 setb p1.0	 ;установка бита порта
my5:
 setb  tr0    ;запуск таймера 0
reti	  ;возврат из п\п прерывания
int1_ok:
 clr tr0
 jnb p1.0,my41
 mov  TH1,#11111111B
 mov  TL1,r1
 clr p1.0
 jmp my51
my41:
 mov  TH1,#11111111B
 mov  TL1,r0
 setb p1.0 
my51:
 setb  tr1
reti
end

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Попробуйте скачать ГОСТ 16745-83 про конденсаторную бумагу. Там понятные слова, русские... :-)
    • Так ладно в общем нужно до конца разобраться с UART. Сейчас я выкладываю весь код и всю информацию что у меня есть. Сначала поясню что по схеме. Микроконтроллер у меня ATMEGA16. На PD2 и PD3 установлены светодиоды, На PC0 и PC1 установлены кнопки. Также установлен внешний кварц на частоту 7.3728 MHz. Теперь собственно сам код по UART. Код был взят из одного примера в просторах инета. Первоначально он был под ATMEGA8, но он вполне подошёл и на ATMEGA16. #define F_CPU 7372800UL #define BAUND 9600L #define UBRRL_value (F_CPU/(BAUND*16))-1 #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> void init_pin(void); #define C_PC0 (~PINC&(1<<PC0)) #define C_PC1 (~PINC&(1<<PC1)) #define LED_1_ON() PORTD|=(1<<PD2) #define LED_1_OFF() PORTD&=~(1<<PD2) #define LED_2_ON() PORTD|=(1<<PD3) #define LED_2_OFF() PORTD&=~(1<<PD3) volatile start=1; char b; ISR(USART_RXC_vect) { b=UDR; } void init_UART() { UBRRL = UBRRL_value; UBRRH = UBRRL_value>>8; UCSRB|=(1<<TXEN); UCSRB|=(1<<RXEN); UCSRC|=((1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)); UCSRB|=(1<<RXCIE); sei(); } void send_UART(char value) { while(!(UCSRA&(1<<UDRE))); UDR=value; } int main(void) { init_pin(); init_UART(); while(1) { if (start==1) { _delay_ms(500); send_UART('O'); send_UART('K'); send_UART('!'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); start=0; } if (b == '0') { LED_1_ON(); LED_2_OFF(); send_UART('N'); send_UART('+'); send_UART('0'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); b=4; } if (b == '1') { LED_1_OFF(); LED_2_ON(); send_UART('N'); send_UART('+'); send_UART('1'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); b=4; } if (b == '2') { LED_1_ON(); LED_2_ON(); send_UART('N'); send_UART('+'); send_UART('2'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); b=4; } if (b == '3') { LED_1_OFF(); LED_2_OFF(); send_UART('N'); send_UART('+'); send_UART('3'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); b=4; } if (C_PC0) { send_UART('P'); send_UART('C'); send_UART('0'); send_UART(0x0D); send_UART(0x0A); _delay_ms(250); } if (C_PC1) { send_UART('P'); send_UART('C'); send_UART('1'); send_UART(0x0D); send_UART(0x0A); _delay_ms(250); } } } void init_pin(void) { DDRC = 0b00000000; PORTC = 0b11111111; DDRD |= ((1<<2)|(1<<3)); PORTD &=~ ((1<<2)|(1<<3)); } Здесь я пробовал этот код UART конечно в таком виде работает, но здесь есть некоторая непонятная ситуация. На микроконтроллер почему то принимаются значения только в цифровом виде. По другому он отказывается работать. Возможно нужно как то перенастроить что то не совсем это понимаю. А UART эта вещь такая очень нужна без него не сделать управление плеером.
    • Заходишь в даташит усилителя, ищешь вход, обычно конденсаторы, туда и подпаиваешь. Выводишь 5 проводов: входы 4 каналов, и земля входа. Потом: провод левого переднего входа (in1) соединяешь с левым задним (in3), по аналогии с правой стороной делай так же. Получается 2 контакта и земля. Ищешь распиновку своего разъёма и паяешь. Распиновку могу объяснить, если фото будет. Что бы включить, Подключи разъём в телефон и вставь, например, пустой дик. 
    • @Гость Михаил, что мешает поставить и послушать? Что мешает потестить операционник из магазина на предмет подлинности, хотя бы замерить скорость нарастания выходного сигнала и сравнить с даташит? Из магазина с большой вероятностью может быть перемаркированный LM358, его сразу видно то характерной ступеньке на синусоиде и по частоте он просто "тормоз" по сравнению с ne. Ваш LG медленнее в три раза от исходного. Ваш lg со своими 3 МГц должен быть однозначно лучше, чем перемаркированный ne из 358. Например, разницы между оригинальным LM833 и с хорошей  8 мегагерцовой  подделкой ne с Али не слышно.
    • Что Вы вообще делаете в институте с такими "знаниями"? Задачка для средней группы детского сада.
    • По ссылке все понятно, если Вам не понятно обратитесь к специалисту он Вам сделает.
  • Похожий контент

×
×
  • Создать...