
Ассемблер (ASM) для AVR в вопросах и ответах
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
По кускам кода сложно что-то сказать. А дописывать (и домысливать) код самому чтобы погонять в симуляторе и понять что не так как-то лень 

[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Мikа
- Потрогал лапой паяльник
- Сообщения: 343
- Зарегистрирован: Пн апр 01, 2013 15:13:40
- Откуда: Москва
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Gudd-Head, это момент я собирался проверить, когда всё остальное бы заработало. Но я от 0 считал, поэтому так. Но суть вопроса в другом же.
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Я те говорю. Чтобы разобраться в сути другого вопроса, дай мне готовый код (кусок кода) чтобы его можно было скопировать в Студию и сразу запустить.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Мikа
- Потрогал лапой паяльник
- Сообщения: 343
- Зарегистрирован: Пн апр 01, 2013 15:13:40
- Откуда: Москва
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Это напейсать надо, щас сделаю.
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
- Мikа
- Потрогал лапой паяльник
- Сообщения: 343
- Зарегистрирован: Пн апр 01, 2013 15:13:40
- Откуда: Москва
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Вот, вроде бы всё, что нужно собрал.
Спойлер
Код: Выделить всё
.include "C:\Program Files (x86)\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRAssembler\2.1.51.64\avrassembler\include\m48def.inc"
.def Second=R16
.def Minute=R17
.def Hour=R18
.def BCDL=R1 ;Регисторы, в которые будут сохраняться значения чисел, выводимых на дисплей, при переводе 8ми битного значения в десятичные числа
.def BCDH=R2
.def BinVal=R3 ;Регистр, который является посредником при переводе 8ми битного числа в 2 десятичных
.def XOR=R5
.def Temp=R19
.def Temp1=R20
.def Display=R21 ; Сюда загружается значение, которое будет выведено на индикатор
.def BlinkStatusReg=R22 ; Установка битов с 0 по 5 включает мигание сегментов в таком же порядке, справа налево
.equ HH=5; ||HH
.equ HL=4; |||HL
.equ MH=3; ||||MH -
.equ ML=2; |||||ML -
.equ SH=1; ||||||SH -
.equ SL=0; |||||||SL -
; 76543210
.def DotStatusReg=R23 ; Установка битов с 0 по 5 включает точки сегментов в таком же порядке, справа налево
.equ BOL=7; BOL - Если установлен, активируется длинный пик динамика
.equ BOS=6; |BOS - Если установлен, активируется короткий пик динамика
.equ dHH=5; ||dHH
.equ dHL=4; |||dHL
.equ dMH=3; ||||dMH -
.equ dML=2; |||||dML -
.equ dSH=1; ||||||dSH -
.equ dSL=0; |||||||dSL -
; 76543210
.def GameStatus=R24 ; Регистр, бит 0 показывает, в какую сторону будет считать счётчик. При 0 - с числа до 0, при 1 - с нуля до числа. Бит 1 - за какую команду идёт отсчёт. 0 - за первую. 1 - за вторую.
.equ T1S=2 ; Флаги просмотра статистики для первой и второй команды
.equ T2S=3
.equ SP=7 ; - SecondPassed - флаг взводится при проходе очередной секунды
.equ II=6 ; - InterruptInversion bit. Бит инвентируется в прерывании по таймеру. В такт с ним мигают сегменты индикатора
.def BF=R25 ; Флаг работы с кнопками
;***************************************************************************************************
;*
;* Присвоение имён портов
;*
;***************************************************************************************************
.equ PORT_CA=PORTC;0x08;PORTC
.equ PORT_SEG=PORTD;0x0b;PORTD
;***************************************************************************************************
;*
;* Значения, которые необходимо вывести в порт, чтобы включить соответствующий сегмент индикатора
;* ATmega48 имеет 7 портов в PC, но седмой порт - reset, поэтому запись ведётся в размере 6 бит
;*
;***************************************************************************************************
.equ SLSegment=0b101111 ;PC4, active low
.equ SHSegment=0b011111 ;PC5, active low
.equ MLSegment=0b110111 ;PC3, active low
.equ MHSegment=0b111011 ;PC2, active low
.equ HLSegment=0b111101 ;PC1, active low
.equ HHSegment=0b111110 ;PC0, active low
;Бит, используемый командой SBR, для включения точки
.equ Dot=0b00100000
;***************************************************************************************************
;*
;* Присвоение имён портам кнопок
;* Присвоение имён портам диодов кнопок, Active low
;*
;* Button_1 (RED) = PORT
;*
;*
;*
;*
;***************************************************************************************************
;***************************************************************************************************
;*
;* Константы счётчиков
;*
.equ F_CPU=8000000 ; Тактовая частота процессора
.equ F_ClockResonator=32768; Тактовая частота часового кварца
;***** Значения для TimerCounter1(16bit)
.equ TC1_Prescaler=1024 ; Предделитель
.equ Second_ScalerA16=5 ; Число, обозначающее долю секунды, по проходу которой будет вызвано прерывание по совпадению
.equ TC1_16bit_CompareA=(F_CPU/1024)/Second_ScalerA16 ; Число, с которым будет сравниваться 16 битный счётчик. 1563
;***** Значения для TimerCounter2(8 bit) ЧАСОВОЙ
.equ TC2_Prescaler=128 ; Предделитель
.equ Second_ScalerA=3 ; Число, обозначающее долю секунды, по проходу которой будет вызвано прерывание по совпадению
.equ Second_ScalerB=2
.equ TC2_8_bit_CompareA=(F_ClockResonator/TC2_Prescaler)/Second_ScalerA ; Число, с которым будет сравниваться
.equ TC2_8_bit_CompareB=(F_ClockResonator/TC2_Prescaler)/Second_ScalerB
;Порт и пин диода на красной кнопке
.equ RBLP=PortB
.equ RBLPin=1
;Порт и пин диода на зелёной кнопке
.equ GBLP=PortB
.equ GBLPin=3
;Порты и пины кнопок
.equ RBLPi=PinB
.equ GBLPi=PinB
.equ B1P=PinB
.equ B1Pin=2
.equ B2P=PinB
.equ B2Pin=0
.equ BUZZER_PORT=PORTB
.equ BUZZER_PIN=5
.equ BUZZER_Pi=PinB ; Для SBIC, SRIS
.equ SYREN_PORT=PORTD
.equ SYREN_PIN=1
.equ BFE=0
.equ BFD=1
.equ BFS=2
.equ BFM=3
.equ FDM=4
.equ FDE=5
.equ BDM=6
.equ IIF=7
.equ B2L=5
.equ BDE=6
.equ SCF=7
;Загрузка ячеек оперативной памяти
.dseg
buttonsflag: .byte 1 ; Флаг состояний кнопок
;
; |
; || -
; ||| -
; ||||B2E - Разрешение выполнения кода по нажатию второй кнопки 1 - разрешено выполнение
; |||||B1E - Разрешение выполнения кода по нажатию первйо кнопки 1 - разрешено выполнение
; ||||||B2P - Нажатие второй кнопки 1 - нажата
; |||||||B1P - Нажатие первой кнопки 1 - нажата
; 76543210
;**********************************************************************************************************************
;*
;* Данные, которые будут выводиться на дисплей в режиме использования подпрограммы DICTM
FirstSegment: .byte 1 ; Значение, которое будет выведено в младший разряд секунд, при выполнении функции DICTM
SecondSegment: .byte 1 ; Значение, которое будет выведено в старший разряд секунд, при выполнении функции DICTM
ThirdSegment: .byte 1 ; Значение, которое будет выведено в младший разряд минут, при выполнении функции DICTM
FothSegment: .byte 1 ; Значение, которое будет выведено в сташий разряд минут, при выполнении функции DICTM
FifthSegment: .byte 1 ; Значение, которое будет выведено в младший разряд часов, при выполнении функции DICTM
SixthSegment: .byte 1 ; Значение, которое будет выведено в старший разряд часов, при выполнении функции DICTM
;**********************************************************************************************************************
;*
;* Переменные, в которые будут сохранены значения времени, которо необходимо досчитать в режиме отсчёта от 0 до числа
SecondComparator: .byte 1
MinuteComparator: .byte 1
HourComparator: .byte 1
;**********************************************************************************************************************
;*
;* Переменные, в которые будут сохранены значения времени, которо отсчтитываются для разных команд
SecondTeam1: .byte 1
MinuteTeam1: .byte 1
HourTeam1: .byte 1
SecondTeam2: .byte 1
MinuteTeam2: .byte 1
HourTeam2: .byte 1
;**********************************************************************************************************************
;*
;* Переменные, в которые будет записываться время захвата контроля надо точкой
SRAMCounter1: .byte 1
SRAMCounter2: .byte 1
Team1: .byte 200
Team2: .byte 200
.cseg
.org 0
rjmp reset
.org INT0addr ; External Interrupt Request 0
rjmp INT0_IRQ
.org INT1addr ; External Interrupt Request 1
rjmp INT1_IRQ
.org PCI0addr ; Pin Change Interrupt Request 0
rjmp PCI0_IRQ
.org PCI1addr ; Pin Change Interrupt Request 0
rjmp PCI1_IRQ
.org PCI2addr ; Pin Change Interrupt Request 1
rjmp PCI2_IRQ
.org WDTaddr ; Watchdog Time-out Interrupt
rjmp WDT_IRQ
.org OC2Aaddr ; Timer/Counter2 Compare Match A
rjmp OC2A_IRQ
.org OC2Baddr ; Timer/Counter2 Compare Match A
rjmp OC2B_IRQ
.org OVF2addr ; Timer/Counter2 Overflow
rjmp OVF2_IRQ
.org ICP1addr ; Timer/Counter1 Capture Event
rjmp ICP1_IRQ
.org OC1Aaddr ; Timer/Counter1 Compare Match A
rjmp OC1A_IRQ
.org OC1Baddr ; Timer/Counter1 Compare Match B
rjmp OC1B_IRQ
.org OVF1addr ; Timer/Counter1 Overflow
rjmp OVF1_IRQ
.org OC0Aaddr ; TimerCounter0 Compare Match A
rjmp OC0A_IRQ
.org OC0Baddr ; TimerCounter0 Compare Match B
rjmp OC0B_IRQ
.org OVF0addr ; Timer/Couner0 Overflow
rjmp OVF0_IRQ
.org SPIaddr ; SPI Serial Transfer Complete
rjmp SPI_IRQ
.org URXCaddr ; USART Rx Complete
rjmp URXC_IRQ
.org UDREaddr ; USART, Data Register Empty
rjmp UDRE_IRQ
.org UTXCaddr ; USART Tx Complete
rjmp UTXC_IRQ
.org ADCCaddr ; ADC Conversion Complete
rjmp ADCC_IRQ
.org ERDYaddr ; EEPROM Ready
rjmp ERDY_IRQ
.org ACIaddr ; Analog Comparator
rjmp ACI_IRQ
.org TWIaddr ; Two-wire Serial Interface
rjmp TWI_IRQ
.org SPMRaddr ; Store Program Memory Read
rjmp SPMR_IRQ
;Векторы прерываний
INT0_IRQ:
INT1_IRQ:
PCI0_IRQ:
PCI1_IRQ:
PCI2_IRQ:
WDT_IRQ:
;OC2A_IRQ:
;OC2B_IRQ:
;OVF2_IRQ:
ICP1_IRQ:
;OC1A_IRQ:
OC1B_IRQ:
OVF1_IRQ:
OC0A_IRQ:
OC0B_IRQ:
OVF0_IRQ:
SPI_IRQ:
URXC_IRQ:
UDRE_IRQ:
UTXC_IRQ:
ADCC_IRQ:
ERDY_IRQ:
ACI_IRQ:
TWI_IRQ:
SPMR_IRQ:
reti
reset:
RAM_Flush: LDI ZL,Low(SRAM_START) ; Адрес начала ОЗУ в индекс
LDI ZH,High(SRAM_START)
CLR R16 ; Очищаем R16
Flush: ST Z+,R16 ; Сохраняем 0 в ячейку памяти
CPI ZH,High(RAMEND+1) ; Достигли конца оперативки?
BRNE Flush ; Нет? Крутимся дальше!
CPI ZL,Low(RAMEND+1) ; А младший байт достиг конца?
BRNE Flush
CLR ZL ; Очищаем индекс
CLR ZH
; очистка регистров
LDI ZL, 30 ; Адрес самого старшего регистра
CLR ZH ; А тут у нас будет ноль
DEC ZL ; Уменьшая адрес
ST Z, ZH ; Записываем в регистр 0
BRNE PC-2
;STACK
ldi Temp, high(RamEnd); Установка указателя стека в начало ОЗУ Set Stack Pointer to top of RAM
out SPH, Temp;
ldi Temp, low(RamEnd);
out SPL, Temp;
;STACK
/***** - Порты
PB0 - SupplyControl - 1 is ON | PD0 - UART | PC0 - !!! - в этой версии платы используется эта нога, тк нога PC1 оторвалась
PB1 - | PD1 - UART | PC1 - ADC
PB2 - | PD2 - Button_1 | PC2 -
PB3 - | PD3 - | PC3 -
PB4 - Button_2 | PD4 - | PC4 -
PB5 - | PD5 - ReadData | PC5 -
PB6 - | PD6 - ShowData | PC6 -
PB7 - Data | PD7 -
*/
;Настройка портов
ldi Temp, 0b00111010 ; //Порт сегментов
out DDRB, Temp
ldi Temp, 0b111111
out DDRC, Temp
ldi Temp, 0b11111111
out DDRD, Temp
ldi Temp, 0b00001010
out PortB, Temp
ldi Temp, 0b111111
out PortC, Temp
ldi Temp, 0b11111111
out PortD, Temp
;Настройка портов
;*****************************************************************************************************************************************
;*
;Конфигурация счётчика TimerCounter1(16bit)
;*Предделитель 1024, прерывание по совпадению с OCR1A, примерно 1\5 секунды
;*
;***** Настройка регистра сравнения OCR1A
;*
ldi ZH, High(4000); Загрузка числа, с которым будет сравниваться счётчик
ldi ZL, Low(4000) ; Значение смотреть в DefEqu
STS OCR1AH, ZH
STS OCR1AL, ZL
;***** Настройка предделителя
;*
ldi Temp, 0b00000101; // Prescaler 1024
STS TCCR1B, Temp
;***** Настройка прерываний
;*
ldi Temp, 0b00000010; //Прерывание по совпадению OCR1A
STS TIMSK1, Temp
;*****************************************************************************************************************************************
;*
;Конфигурация счётчика TimerCounter2(8 bit) ЧАСОВОЙ
;*
/*
a. Disable the Timer/Counter2 interrupts by clearing OCIE2x and TOIE2.
b. Select clock source by setting AS2 as appropriate.
c. Write new values to TCNT2, OCR2x, and TCCR2x.
d. To switch to asynchronous operation: Wait for TCN2xUB, OCR2xUB, and TCR2xUB.
e. Clear the Timer/Counter2 Interrupt Flags.
f. Enable interrupts, if needed.
*/
;**********************************************************************************************************************************
;*
;* Включение ассинхронного режима
;*
;***** a. Отключение прерываний
CLR Temp
STS TIMSK2, Temp
;***** b. Включение тактирования от внешнего кварца
ldi Temp, 0b00100000
STS ASSR, Temp
;***** c. Заново настраиваем TCNT2, OCR2x, и TCCR2x.
;***** Настройка регистра сравнения OCR2A, на прерыван
;* Используется как счётчик короткого пика динамика
;*
ldi Temp, TC2_8_bit_CompareA ; Загрузка числа, с которым будет сравниваться счётчик А
STS OCR2A, Temp
;***** Настройка регистра сравнения OCR2A, на прерыван
;* Используется как счётчик длинного пика динамика
;*
ldi Temp, TC2_8_bit_CompareB ; Загрузка числа, с которым будет сравниваться счётчик B
STS OCR2B, Temp
;***** Настройка предделителя
;*
ldi Temp, 0b00000101 ; 128, при 32.768\128 = 256 = 1 тик в секунду при переполнении
STS TCCR2B, Temp
;***** Сброс счётного регистра
;*
CLR Temp
STS TCNT2,Temp
;***** d. Ожидание, пока применятся все настройки
;*
waiting_for_TC2_AS_applys_settings:
LDS Temp,ASSR
SBRC Temp, TCN2UB
rjmp waiting_for_TC2_AS_applys_settings
SBRC Temp, OCR2AUB
rjmp waiting_for_TC2_AS_applys_settings
SBRC Temp, TCR2AUB
rjmp waiting_for_TC2_AS_applys_settings
;***** e. Очистка флагов прерываний
;*
ldi Temp,0b00000111 ;В TIFR2 записываются единицы, так сбрасываются флаги
STS TIFR2,Temp
CLR DotStatusReg ; НЕ ЗНАЮ КАК, НО ЗНАЧЕНИЕ В ПРЕДЫДУЩЕМ TEMP ПОПАДАЕТ В DotStatusReg, что включает точки О_о
;***** Настройка прерываний (Это закомментировано, потому что пока это не нужно)
;*
/*ldi Temp, 0b00000111; //Прерывание по совпадению OCR2A и переполнению.
STS TIMSK2, Temp ; A - выключение динамика при коротком пике
; B - Выключение динамика при длинном пике
; Overflow - переполнение счётчика, проход одной секунды*/
; == ;IncTime SecondMinuteLow - Макрос, который уменьшает младший разряд минут или минут - не используется подпрограмма, т.к. это нужно только при вводе натсроек
.Macro IncTimeSML
cpi @0,9
brne IncSML
clr @0
rjmp OverSML
IncSML:
inc @0
OverSML:
.ENDM
; == IncTime SecondMinuteLow - Макрос, который увеличивает старший разряд секунд или минут - не используется подпрограмма, т.к. это нужно только при вводе настроек
.Macro IncTimeSMH
;if (a>=b)
CPI @0,50
brcs IncTimeSMHelse
SUBI @0,50
rjmp IncTimeSMHover
IncTimeSMHelse: SUBI @0, (-10)
IncTimeSMHover:
.ENDM
; == IncTime SecondMinuteLow - Макрос, который уменьшает младший разряд часов - не используется подпрограмма, т.к. это нужно только при вводе натсроек
.Macro IncTimeHL
cpi @0,99
brne IncHL
clr @0
rjmp OverHL
IncHL:
inc @0
OverHL:
.ENDM
; == IncTime SecondMinuteLow - Макрос, который увеличивает старший разряд часов - не используется подпрограмма, т.к. это нужно только при вводе настроек
.Macro IncTimeHH
;if (a>=b)
CPI @0,90
brcs IncTimeHHelse
SUBI @0,90
rjmp IncTimeHHover
IncTimeHHelse: SUBI @0, (-10)
IncTimeHHover:
.ENDM
ldi Second,1
ldi Minute,2
ldi Hour,3
looooop:
;* Записываем в оперативку очередное время
ldi ZL, LOW(Team1)
ldi ZH, HIGH(Team1)
LDS Temp, SRAMCounter1
CLR Temp1
add ZL,Temp
adc ZH,Temp1
ST Z+,Minute
ST Z,Hour
cpi Temp,197
brne keepgo1
ldi Temp,254 ;* Следующая команда обнулит Temp
keepgo1:
SUBI Temp,(-2)
STS SRAMCounter1,Temp
;* Чтение из оперативки
cpi Second,99
brne keepgo3
ldi Second,255
ldi ZL, LOW(Team1)
ldi ZH, HIGH(Team1)
keepgo3:
LD Minute,Z+
LD Hour,Z+
inc Second
rjmp looooopПочему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Пиздец какая простыня, а кода — нихуя
Не понимаю, нафига очищать оперативку? Понял, для отладки. Ещё и макросы среди кода.
От нефига делать погонял я эту туфту:
Вы записываете в секунды-минуты-часы 1-2-3 и запускаете оч. странный цикл:
Сохраняете в начале вашего Team1 минуты с пост-инкрементом и часы без пост-икремента, затем загружаете (с пост-инкр.) содержимое часов в минуты и "0" в часы. На след. шаге пишите-читаете так же... Короче, у вас массив в итоге выглядит так: 2, 3, 3, 0, 0, ...
Думайте где у вас в регистрах минут и секунд затираются данные из обнулённой оперативки.
Не понимаю, нафига очищать оперативку? Понял, для отладки. Ещё и макросы среди кода.
От нефига делать погонял я эту туфту:
Код: Выделить всё
looooop:
;* Записываем в оперативку очередное время
ldi ZL, LOW(Team1)
ldi ZH, HIGH(Team1)
LDS Temp, SRAMCounter1
CLR Temp1
add ZL,Temp
adc ZH,Temp1
ST Z+,Minute
ST Z,Hour
cpi Temp,197
brne keepgo1
ldi Temp,254 ;* Следующая команда обнулит Temp
keepgo1:
SUBI Temp,(-2)
STS SRAMCounter1,Temp
;* Чтение из оперативки
cpi Second,99
brne keepgo3
ldi Second,255
ldi ZL, LOW(Team1)
ldi ZH, HIGH(Team1)
keepgo3:
LD Minute,Z+
LD Hour,Z+
inc Second
rjmp looooopВы записываете в секунды-минуты-часы 1-2-3 и запускаете оч. странный цикл:
Сохраняете в начале вашего Team1 минуты с пост-инкрементом и часы без пост-икремента, затем загружаете (с пост-инкр.) содержимое часов в минуты и "0" в часы. На след. шаге пишите-читаете так же... Короче, у вас массив в итоге выглядит так: 2, 3, 3, 0, 0, ...
Думайте где у вас в регистрах минут и секунд затираются данные из обнулённой оперативки.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
ни как я не пойму кое чего. наверное книги не те читаю
вот пишут что флеш память устроена по 2 байта, команда занимает место 2 байта
а что именно подразумевают под словом "команда"? команда это инструкция + операнд? 8бит инструкция и 8 бит операнд или как? длина самой инструкции фиксирована или нет?
вот пишут что флеш память устроена по 2 байта, команда занимает место 2 байта
а что именно подразумевают под словом "команда"? команда это инструкция + операнд? 8бит инструкция и 8 бит операнд или как? длина самой инструкции фиксирована или нет?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
спасибо, я нашел этот документ до того как Вы отредактировали, по названию, то что надо
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Детские вопросы, наверное...
Мне надо на 8-й Меге (@ 1 МГц) отловить сначала 90 секунд, а потом, скажем, 30.
30 секунд — это таймер неактивности при входе в меню 16-ти разрядный счётчик с предделителем 1024 даст максимум 67 с.
Посему надо заводить переменную и в обработчике прерывания модифицировать её. Но, блин, по истечении 90 и 30 секунд мне надо прыгать в разные части программы. Вводить признак отсчёта (90 или 30) в саму переменную и анализировать её в прерывании? Или в тексте проги смотреть флаг переполнения таймера, а прерывание разрешить только на время отсчёта 30 секунд?.. Кто как делает?
Мне надо на 8-й Меге (@ 1 МГц) отловить сначала 90 секунд, а потом, скажем, 30.
Спойлер
Это термометр. 90 секунд — один из критериев останова, другой критерий — dT°/dt, т.е. скорость изменения температуры — что раньше.30 секунд — это таймер неактивности при входе в меню
Посему надо заводить переменную и в обработчике прерывания модифицировать её. Но, блин, по истечении 90 и 30 секунд мне надо прыгать в разные части программы. Вводить признак отсчёта (90 или 30) в саму переменную и анализировать её в прерывании? Или в тексте проги смотреть флаг переполнения таймера, а прерывание разрешить только на время отсчёта 30 секунд?.. Кто как делает?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Engineer_Keen
- Друг Кота
- Сообщения: 3868
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Я бы тупо сделал подпрограмму, которая вызывается из главного цикла раз в секунду и там проверял бы два счетчика, если счетчик больше 0, то делаем "-1", если при этом обнулился, делаем что надо для 90 сек, потом так же второй, если больше 0, то делаем "-1", если обнулился, то делаем то, что надо для 30 сек. Счетчики запускаем из любого места записью в них числа !=0 (т.е. 90 и 30).
Затраты ОЗУ - 1 байт на счетчик, затраты флеша 15-20 слов на счетчик. +огранизация секундного отсчета. В принципе обычно так и делаю...
Затраты ОЗУ - 1 байт на счетчик, затраты флеша 15-20 слов на счетчик. +огранизация секундного отсчета. В принципе обычно так и делаю...
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ой... мне одновременно считать не надо.
Я всё-таки когда буду считать 90 сек, буду (3 раза) проверять флаг переполнения счётчика на 30 сек.
А когда надо будет отсчитать 30 сек, запущу таймер и разрешу прерывание.
И так, наверное, даже проще и лучше будет, т.к. условие окончания преобразования по времени (3-й раз появление флага переполнения) я буду проверять до (или после) проверки условия по дельта-Т°.
Посему вопрос с таймером неактивности (нажатия) кнопок: по каждому нажатию любой из кнопок перезаписывать TH и TL?
Я всё-таки когда буду считать 90 сек, буду (3 раза) проверять флаг переполнения счётчика на 30 сек.
А когда надо будет отсчитать 30 сек, запущу таймер и разрешу прерывание.
И так, наверное, даже проще и лучше будет, т.к. условие окончания преобразования по времени (3-й раз появление флага переполнения) я буду проверять до (или после) проверки условия по дельта-Т°.
Посему вопрос с таймером неактивности (нажатия) кнопок: по каждому нажатию любой из кнопок перезаписывать TH и TL?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Я думаю будет проще как сказал Engineer_Keen. Если что, легче исходник модифицировать и будет более читабельным. А то что Вам одновременно не нужны отсчеты времени, так это просто - пускай значение счетчика 0xFF означает что его декремнтировать не надо. Если есть свободные РОН, так счетчики в ОЗУ держать не надо тоже, сэкономите время выполнения обработчика прерываний.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
А предделитель поменять нет? и Free timer c двумя прерываниями OCR
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Эээ... Чаго?ILYAUL писал(а):Free timer c двумя прерываниями OCR
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Спойлер
Код: Выделить всё
;**************************************************
;* ;;/Initialization TIMER1;;* *
;**************************************************
outi OCR1BH, high(7)
outi OCR1BL,low(7)
ldi temp,1<<OCIE1A|1<<OCIE1B
outr TIMSK1,temp
ldi temp,1<<CS11|1<<CS10
outr TCCR1B,temp ;******************************************
Код: Выделить всё
;-Задержка на 40us(25кгц) для Xtal 110592MHz
;******************************************
Wait40us:
sbi TIFR1,OCF1A
inr temp,TCNT1L
inr temp1,TCNT1H
subi temp,(low(-6+1))
sbci temp1,(high(-6+1))
outr OCR1AH,temp1
outr OCR1AL,temp
sbis TIFR1,OCF1A
rjmp PC-1
ret
;**************************************
;- Задержка на 1,5ms
;**************************************
Wait1_5ms:
sbi TIFR1,OCF1B
inr temp,TCNT1L
inr temp1,TCNT1H
subi temp,(low(-259+1))
sbci temp1,(high(-259+1))
outr OCR1BH,temp1
outr OCR1BL,temp
sbis TIFR1,OCF1B
rjmp PC-1
ret
;**************************************
;- Задержка на 20 ms
;**************************************
Wait20ms:
sbi TIFR1,OCF1A
inr temp,TCNT1L
inr temp1,TCNT1H
subi temp,(low(-3456+1))
sbci temp1,(high(-3456+1))
outr OCR1AH,temp1
outr OCR1AL,temp
sbis TIFR1,OCF1A
rjmp PC-1
retТаймер крутится постоянно 0- FFFF (mode Normal) , ты ему только значения для OCRA-B подпихивай
Re: Ассемблер (ASM) для AVR в вопросах и ответах
А можно спросить, для какого камня(ей) работают конструкции типа
?
Код: Выделить всё
sbi TIFR1,OCF1A
;
;
sbis TIFR1,OCF1A- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Подъебалakl писал(а):А можно спросить, для какого камня(ей) работают конструкции типа
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Почему? Серьёзно.
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
?
SBI-ки работают с младшими 32-мя регистрами, у Меги8 TIFR под номером 56.
SBI-ки работают с младшими 32-мя регистрами, у Меги8 TIFR под номером 56.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
