Код: Выделить всё
SBIW Rx,1Rx = R24,R26,R28 или R30
Код: Выделить всё
SBIW Rx,1ARV писал(а):вы не темните, прямо говорите, что не понятно. или давайте ваш код на рассмотрение и поиск ошибок в нем.
Код: Выделить всё
output_2:
ldi ZH,high(ind_codes*2)
ldi ZL,low(ind_codes*2)
;ldi ZH, high(1<<ind_codes)
;ldi ZL, low(1<<ind_codes)
Код: Выделить всё
//==================
Main:
wdr
rcall Service_Timers
rcall Proc_FSM_Outputs
// bla-bla
st Y, XL // Младший байт переменной для преобразования HEX-DEC
std Y+1, XH // Старший байт переменной для преобразования HEX-DEC
rcall Hex_Dec
ldx HEX_DEC_BUFFER+1
ldy DISPLAY_BUFFER
ldi r17, 4
Main_Cycle:
ld r16, X+
st Y+, r16
dec r17
brne Main_Cycle
M_4:
#if (PROJECT==WORK)
sleep
nop
#endif
rjmp Main
//==================
/************************************************************************/
#if (BCD==YES)
.dseg
HEX_DEC_BUFFER:
.equ HEX_DEC_BUFFER_LENGHT = 5
.byte HEX_DEC_BUFFER_LENGHT
.cseg
Hex_Dec:
ldx HEX_DEC_BUFFER
ldi r17,HIGH(10000)
ldi r16,LOW(10000)
rcall Digit
st X+,r18
ldi r17,HIGH(1000)
ldi r16,LOW(1000)
rcall Digit
st X+,r18
ldi r17,HIGH(100)
ldi r16,LOW(100)
rcall Digit
st X+,r18
ldi r17,HIGH(10)
ldi r16,LOW(10)
rcall Digit
st X+,r18
mov r16,r14
// ori r16,0x30
st X+,r16
Hex_Dec_End:
ret
Digit:
ldi r18,-1
Digit_Cycle:
inc r18
sub r14,r16
sbc r15,r17
brsh Digit_Cycle
add r14,r16
adc r15,r17
// ori r18,0x30
ret
#endif
//==================
//==================
.equ ANOD_ONE = 1<<5
.equ ANOD_TEN = 1<<4
.equ ANOD_HANDRED = 1<<3
.equ ANOD_THOUSAND = 1<<2
.equ A = 1<<6
.equ B = 1<<7 // A
.equ C = 1<<3 // F B
.equ D = 1<<2 // G
.equ E = 1<<1 // E C
.equ F = 1<<5 // D
.equ G = 1<<4
.equ H = 1<<0
//----------
//----------
.equ ZERO = A+B+C+D+E+F
.equ ONE = B+C
.equ TWO = A+B+D+E+G
.equ THREE = A+B+C+D+G
.equ FOUR = B+C+F+G
.equ FIVE = A+C+D+F+G
.equ SIX = A+C+D+E+F+G
.equ SEVEN = A+B+C
.equ EIGHT = A+B+C+D+E+F+G
.equ NINE = A+B+C+D+F+G
//==================
.dseg
//==================
DISPLAY_BUFFER:
.equ DISPLAY_BUFFER_SIZE = 4
.byte DISPLAY_BUFFER_SIZE
//==================
.cseg
//==================
.macro Proc_7_Segm_Ind
mov CNT, CNT_7_SEGM_IND
clr ZH
mov ZL, CNT
lsl ZL
subi ZL, LOW(-(Table_7_Segm_Ind*2))
sbci ZH, HIGH(-(Table_7_Segm_Ind*2))
lpm CNT_7_SEGM_IND, Z+
lpm ANODS, Z
ldz DISPLAY_BUFFER
addw Z, CNT, RCLR
ld ZL, Z
clr ZH
subi ZL, LOW(-(Table_7_Segm_Char*2))
sbci ZH, HIGH(-(Table_7_Segm_Char*2))
lpm KATODS, Z
.endmacro
//----------
//----------
Table_7_Segm_Ind:
.db 0x01, ANOD_THOUSAND
.db 0x02, ANOD_HANDRED
.db 0x03, ANOD_TEN
.db 0x00, ANOD_ONE
Table_7_Segm_Char:
.db ZERO, ONE
.db TWO, THREE
.db FOUR, FIVE
.db SIX, SEVEN
.db EIGHT, NINE
//==================
.equ ANODS_PORT = PORTA
.equ ANODS_PIN = PINA
.equ ANODS_DDR = DDRA
.equ KATODS_PORT = PORTC
.equ KATODS_PIN = PINC
.equ KATODS_DDR = DDRC
.equ ANODS_MASK = ANOD_THOUSAND+ANOD_HANDRED+ANOD_TEN+ANOD_ONE
.equ KATODS_MASK = A+B+C+D+E+F+G
Def_Err_ID ERR_ID_PROC_OUTPUTS
.dseg
_PROC_OUTPUTS:
.byte 1
.cseg
Proc_FSM_Outputs:
ldy _PROC_OUTPUTS
Proc_FSM Tab_FSM_Proc_Outputs
Proc_Outputs_Init:
in RSREG, SREG
cli
in r16, ANODS_DDR
ori r16, ANODS_MASK
out ANODS_DDR, r16
out SREG, RSREG
Set_Timer Par_Timer_Proc_Outputs
Set_State Proc_Outputs_Set_State, _PROC_OUTPUTS_RUN
Proc_Outputs_Run:
Proc_Timer Par_Timer_Proc_Outputs
brtc Proc_Outputs_Run_End
Proc_7_Segm_Ind
in RSREG, SREG
cli
in r16, ANODS_PORT
andi r16, ~ANODS_MASK
out ANODS_PORT, r16
out KATODS_DDR, RCLR
in r16, ANODS_PORT
or r16, ANODS
out ANODS_PORT, r16
out KATODS_DDR, KATODS
out SREG, RSREG
Set_Timer Par_Timer_Proc_Outputs
Proc_Outputs_Run_End:
ret
Proc_Outputs_Set_State:
st Y, r16
ret
Tab_FSM_Proc_Outputs:
.db tab_h(_PROC_OUTPUTS), MAX_PROC_OUTPUTS_STATES, tab_h(Tab_Jmp_Proc_Outputs), ERR_ID_PROC_OUTPUTS
Tab_Jmp_Proc_Outputs:
.equ MAX_PROC_OUTPUTS_STATES = 2
.equ _PROC_OUTPUTS_INIT = 0
.db tab_h(Proc_Outputs_Init)
.equ _PROC_OUTPUTS_RUN = 1
.db tab_h(Proc_Outputs_Run)
Par_Timer_Proc_Outputs:
par_timer ST_PROC_OUTPUTS, 1<<ST_UNLOCK_FLG, 1
Код: Выделить всё
.def R16 REGISTER ;* Тут лежит то, что необходимо грузить в ОЗУ
.def R17 Temp
.def R18 Temp1
SRAMByte: .byte 1 ;* Место в ОЗУ, куда грузим в ПЕРВЫЙ раз
SRAMCounter: .byte 1 ;* Здесь находится счётчик, который считает, сколько раз мы уже бывали в этом цикле.
;Сделан для того, чтобы на его значение увеличивать адрес SRAMByte при записи в ПЗУ.
LDS Temp, SRAMCounter1 ; Выгружаем из ОЗУ текущее значение счётчика (при первом проходе цикла оно равно 0).
[b]SRAMByte+Temp,REGISTER ; На эту строку компилятор сообщает ошибку о неожиданном REGDEF. Я это видел как адрес первой ячейки оперативки(ну относительно первой)+смещение из
; счётчика.[/b]
inc Temp ; Увеличить счётчик
STS SRAMCounter1,Temp ; Записать его значение в ОЗУ
BOB51 писал(а):Да еще "коммерческий" ...
Мikа писал(а):Собственно, вопрос, как правильно написать увеличение адреса оперативки, куда нужно записать?
Код: Выделить всё
Ring_Buff: .byte 128
Ring_Buff_Count: .byte 1
LDI ZL, LOW(Ring_Buff) ;Вычисляем текущее положение
LDI ZH, HIGH(Ring_Buff) ;указателя кольцевоого буфера
LDS R16,Ring_Buff_Count ;Загружаем счётчик кольцевого буфера
CLR R15
ADD ZL,R16 ;Вычисляем смещение текущего
ADC ZH,R15 ;положения буфера от нуля
ST Z+,R17 ;Заносим текущее значение
ST Z,R18 ;АЦП в кольцевой буфер
LDS R16,Ring_Buff_Count ;Сдвигаем указатель кольцевого буфера
SUBI R16,2
STS Ring_Buff_Count,R16Код: Выделить всё
// Вариант 1, если программа небольшая и указатель X больше нигде не используется.
clr CNT // где-то инициализируем CNT
ldi XL, LOW (BUFFER)
ldi XH, HIGH (BUFFER) // Где-то устанавливаем начальный адрес твоего буфера.
Programma:
st X+, CNT // Записываем, автоматически постинкремент указателя адреса.
// Вариант 2, если указатель X используется.
clr CNT // где-то инициализируем CNT
ldi XL, LOW (BUFFER)
ldi XH, HIGH (BUFFER) // Где-то устанавливаем начальный адрес твоего буфера.
movw r15:14, XH:XL
movw r14, XL // Аналогично.
Programma:
movw XL, r14 // Восстанавливаем указатель.
st X+, CNT // Записываем, автоматически постинкремент указателя адреса.
movw r14, XL // Сохраняем указатель.
// Вариант 3, если указатель X используется.
clr CNT // где-то инициализируем CNT
ldi XL, LOW (BUFFER)
ldi XH, HIGH (BUFFER) // Где-то устанавливаем начальный адрес твоего буфера.
sts SAVE_BUFFER_L, XL
sts SAVE_BUFFER_H, XH
Programma:
lds XL, SAVE_BUFFER_L // Восстанавливаем указатель.
lds XH, SAVE_BUFFER_H
st X+, CNT // Записываем, автоматически постинкремент указателя адреса.
sts SAVE_BUFFER_L, XL // Сохраняем указатель.
sts SAVE_BUFFER_H, XH
Синтаксис:На эту строку компилятор сообщает ошибку о неожиданном REGDEF.
Код: Выделить всё
def R16 REGISTER ;* Тут лежит то, что необходимо грузить в ОЗУ
.def R17 Temp
.def R18 Temp1
Код: Выделить всё
;* Записываем в оперативку очередное время
ldi ZL, LOW(T1)
ldi ZH, HIGH(T1)
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);* Поскольку у нас 2 байта, счётчик каждый раз увеличивается на 2.
STS SRAMCounter1,Temp
Код: Выделить всё
cpi Second,99 ;В оперативке может быть до 100 значений ЧЧ:ММ (0-99)
brne keepgo3
ldi Second,255
ldi ZL, LOW(Team1)
ldi ZH, HIGH(Team1)
keepgo3:
LD Minute,Z+
LD Hour,Z+
inc Second ;Увеличиваем счётчик (на самом деле часы 6 разрядные, но в режиме чтения из оперативки на секундах показано, какой по счёту результат отображается.
По моим ощущениям, она запишет 99 значений (2*99 = 198 = 0...197).Мikа писал(а):По моим ожиданиям, она должна записывать 100 значений по 2 байтаКод: Выделить всё
cpi Temp,197