Например TDA7294

Форум РадиоКот • Просмотр темы - AVR, прерывание таймера ATMEGA32
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Сб апр 20, 2024 12:33:34

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 7 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: AVR, прерывание таймера ATMEGA32
СообщениеДобавлено: Вт май 24, 2011 15:34:41 
Родился

Зарегистрирован: Пт мар 25, 2011 10:14:07
Сообщений: 6
Рейтинг сообщения: 0
Здравствуйте!
Подскажите пожалуйста как решить задачу. Написал программу по устранению дребезга кнопки, в отладчике работает и если ее вставить в основной цикл программы тоже работает, а вот в обработке прерываний не работает. Как сделать так, чтобы программа работала в обработке прерываний от T1 не только в отладчике, но и в реальности? переполнениеи T1 происходит каждые 100 Гц.

rx0 значение которое было в предыдущий раз
rx1 значение сейчас
rx2 значение, которое говорит в основном цикле программы о нажатии кнопки

;================ Инициализация таймера ТС0 ==========

BSET 7 ; Разрешение всех прерываний



ldi Temp4,1
out TIMSK,Temp4 ; разрешение прерывания от таймера ТС0


ldi Temp4 , 0x05
out TCCR0,Temp4 ; установка предделителя
; с этого момента таймер запущен



;================ Инициализация таймера ТС1 ==========

out TIMSK,Temp4 ; разрешение прерывания от таймера ТС1

ldi temp4, 0x01

out TCCR1A,Temp4
; с этого момента таймер запущен


.
.
.
.
.
.
.
.



;---------- Обработка прерываний от Т1 ----------

TM1_OVF:





ldi Temp3 , 0xec ; Temp3:=50
out TCNT1H,Temp3 ;
out TCNT1L,Temp3



in rx1,PIND ; запись PIND--> rx1

mov rx,rx1 ;rx1-->rx

com rx1 ;инверсия rx1

andi rx1,0x40 ; маскирование

and rx1,rx0

mov rx2,rx1 ; rx2- управляющий регистр, который в основном теле программы указывает на сброс счетчика на индикаторе.

mov rx0,rx



Благодарю за ответы!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: AVR, прерывание таймера ATMEGA32
СообщениеДобавлено: Вт май 24, 2011 17:10:30 
Друг Кота
Аватар пользователя

Карма: 49
Рейтинг сообщений: 390
Зарегистрирован: Вс июл 12, 2009 19:15:29
Сообщений: 7010
Откуда: Ижевск
Рейтинг сообщения: 0
kostyali писал(а):
rx2 значение, которое говорит в основном цикле программы о нажатии кнопки

mov rx2,rx1 ; rx2- управляющий регистр, который в основном теле программы указывает на сброс счетчика на индикаторе.

определитесь как-то.

_________________
Docendo discimus


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: AVR, прерывание таймера ATMEGA32
СообщениеДобавлено: Вт май 24, 2011 21:47:12 
Родился

Зарегистрирован: Пт мар 25, 2011 10:14:07
Сообщений: 6
Рейтинг сообщения: 0
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m32def.inc"

;=============== Таблица векторов прерываний =================

.cseg

.org 0
rjmp START

.org $12
rjmp TM1_OVF

.org $16
rjmp TM0_OVF
;=============== Инициализация стека
START:


ldi r16,low(RAMEND)
out spl,r16
ldi r16,high(RAMEND)
out sph,r16

;================ Инициализация портов ввода-вывода

.def Temp=R16
.def Temp3=R19
.def Temp4=R20
.def Temp5=R24

.def counter_sec=R21
.def counter_sotn=R13

.def Temp6=R26


.def bufer=R23



.def RX=R17
.def RX0=R18
.def RX1=R22
.def RX2=R25


in temp, SFIOR ; запись содержимого SFIOR в temp
andi temp, 0xFB ; логическое умножение на 11111011
out SFIOR,Temp ; запись содержимого temp в SFIOR

ldi Temp,0xC7 ;
out DDRA,Temp ;ножки 0,1,2 порта А на вывод, 3,4,5 на ввод

ldi Temp,0x38
out PortA,Temp ;включение подтягивающих резисторов PA3,4,5


ldi Temp,255 ;присвоение константы
out DDRB,Temp ;ножки порта B на вывод


out DDRC,Temp ;ножки порта C на вывод
out DDRC,Temp ;ножки порта C на вывод
out DDRC,Temp ;ножки порта C на вывод


ldi Temp,0x00

out DDRD,Temp

ldi Temp,0x40

out PORTD,Temp

;================ Инициализация начальных значений переменных

.equ sotni=100
.equ desyatki=10
.equ edinici=1

ldi rx2,0x00
ldi rx0,0x40

;================ Инициализация таймера ТС0 ==========

BSET 7 ; Разрешение всех прерываний


ldi Temp4,1
out TIMSK,Temp4 ; разрешение прерывания от таймера ТС0

ldi Temp4 , 0x05
out TCCR0,Temp4 ; установка предделителя
; с этого момента таймер запущен



;================ Инициализация таймера ТС1


out TIMSK,Temp4 ; разрешение прерывания от таймера ТС1

ldi temp4, 0x01

out TCCR1A,Temp4 ; установка предделителя
; с этого момента таймер запущен



;========== Программа


MAIN_PROGRAM:



;******************************************** Выполнение двоично-десятичного преобразования


mov bufer,counter_sec ;запись содержания регистра counter_sec в bufer


;========== Счетчик сотен


sotnya:

mov temp, bufer ;запись содержания регистра bufer в temp
cpi temp,sotni ;вычитание сотни из temp
brcs M1 ;if флаг n=1(число отрицательное) then переход на метку М

subi bufer, sotni ;вычитание сотни из bufer
inc counter_sotn ;counter_sotn+1


rjmp sotnya

M1:

ldi Temp,0x3E
out PortA,Temp ;разрешение вывода(0) сотен
out portC,counter_sotn ;вывод сотен в portC
ldi Temp,0
mov counter_sotn,Temp ; отчистка счетчика сотен



;========== Счетчик десятков

desyatok:

mov temp, bufer ;запись содержания регистра bufer в temp

subi temp,desyatki ;вычитание десятка из temp
brmi M2 ;if флаг n=1(число отрицательное) then переход на метку М2

subi bufer, desyatki ;вычитание десятка из bufer

inc counter_sotn ;counter_des+1=counter_sotn+1
rjmp desyatok


M2:

ldi Temp,0x3D
out PortA,Temp ;разрешение вывода(0) десятков

out portC,counter_sotn ;вывод десятков в portC

ldi Temp,0
mov counter_sotn,Temp ;отчистка счетчика десятков

;========== Счетчик единиц

edinica:

mov temp, bufer ;запись содержания регистра bufer в temp

subi temp,edinici ;вычитание единицы из temp
brmi M3 ;if флаг n=1(число отрицательное) then переход на метку М

subi bufer,edinici ;вычитание единицы из bufer

inc counter_sotn ;counter_des+1=counter_sotn+1
rjmp edinica

M3:

ldi Temp,0x3B
out PortA,Temp ;разрешение вывода(0) единиц

out portC,counter_sotn ;вывод единиц в portC

ldi Temp,0
mov counter_sotn,Temp ;отчистка счетчика единиц


;====== Обработка кнопок

in rx1,PIND
mov rx,rx1
com rx1
andi rx1,0x40
;здесь этот кусок работает (когда кнопка не нажата PIND,bit6=1
; когда кнопка нажата PIND,bit6=0
; если случается такое что rx1=1-[состояние PIND,bit6 сейчас]
; а rx0=0-[состояние PIND,bit6 в предыдущий раз], то в rx2,bit6
; записывается 1 )

and rx1,rx0
mov rx2,rx1
mov rx0,rx


sbrs rx2,6 ; если rx2,bit6=1 то счетчик сбрасывается
rjmp exit1
ldi counter_sec, 0x00
ldi temp, 0x00
ldi bufer, 0x00

exit1:



;***********************************************************************************************************


rjmp MAIN_PROGRAM


;================= ПОДПРОГРАММЫ ОБРАБОТКИ ПРЕРЫВАНИЙ

;---------- Обработка прерываний от Т0 ----------

TM0_OVF:



inc counter_sec ; counter_sec+1


ldi Temp6, 0x50
out TCNT0,Temp6


reti


;---------- Обработка прерываний от Т1 ----------

TM1_OVF:

ldi Temp3 , 0xec
out TCNT1H,Temp3
out TCNT1L,Temp3



in rx1,PIND
mov rx,rx1
com rx1
andi rx1,0x40 ; здесь этот кусок не работает, не могу понять почему
and rx1,rx0
mov rx2,rx1
mov rx0,rx



retii


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: AVR, прерывание таймера ATMEGA32
СообщениеДобавлено: Вт май 24, 2011 22:16:01 
Вымогатель припоя
Аватар пользователя

Зарегистрирован: Вт окт 27, 2009 22:39:19
Сообщений: 672
Откуда: Москва
Рейтинг сообщения: 0
kostyali писал(а):
com rx1
andi rx1,0x40 ; здесь этот кусок не работает, не могу понять почему
and rx1,rx0
Указанные команды "портят" флаги!
Для начала, при входе в прерывание сохраните флаги и все, что может быть подпорчено, при выходе - восстановите.

_________________
— Не говорите мне что делать и я не скажу куда Вам идти...


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

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

Подробнее>>
Не в сети
 Заголовок сообщения: Re: AVR, прерывание таймера ATMEGA32
СообщениеДобавлено: Ср май 25, 2011 18:44:32 
Родился

Зарегистрирован: Пт мар 25, 2011 10:14:07
Сообщений: 6
Рейтинг сообщения: 0
md5sum писал(а):
kostyali писал(а):
Для начала, при входе в прерывание сохраните флаги и все, что может быть подпорчено, при выходе - восстановите.



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

;---------- Обработка прерываний от Т1 ----------

TM1_OVF:

ldi Temp3 , 0xec
out TCNT1H,Temp3
out TCNT1L,Temp3



in rx1,PIND
mov rx,rx1
com rx1
andi rx1,0x40 ; здесь этот кусок не работает, не могу понять почему
and rx1,rx0
mov rx2,rx1
mov rx0,rx

ses
sen
clz


retii


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: AVR, прерывание таймера ATMEGA32
СообщениеДобавлено: Ср май 25, 2011 18:51:37 
Вымогатель припоя
Аватар пользователя

Зарегистрирован: Вт окт 27, 2009 22:39:19
Сообщений: 672
Откуда: Москва
Рейтинг сообщения: 0
В самом начале прерывания:
Код:
push Temp
in Temp, SREG
push Temp

Перед reti:
Код:
pop Temp
out SREG, Temp
pop Temp

_________________
— Не говорите мне что делать и я не скажу куда Вам идти...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: AVR, прерывание таймера ATMEGA32
СообщениеДобавлено: Пт май 27, 2011 23:24:56 
Родился

Зарегистрирован: Пт мар 25, 2011 10:14:07
Сообщений: 6
Рейтинг сообщения: 0
TM1_OVF:

push Temp
in Temp,SREG
push Temp
push Temp4

ldi Temp4 , 0xec
out TCNT1H,Temp4
out TCNT1L,Temp4

in rx1,PIND
mov rx,rx1
com rx1
and rx1,rx0
mov rx2,rx1
mov rx0,rx

pop Temp4
pop Temp
out SREG, Temp
pop Temp


reti


благодарю за помощь! но это не помогло, по прежнему в отладчике работает, а в реальности нет.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y