Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Jack_A »

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

SBIW  Rx,1

Rx = R24,R26,R28 или R30
Аватара пользователя
Дима_Медвед
Открыл глаза
Сообщения: 73
Зарегистрирован: Сб авг 23, 2014 21:49:24

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Дима_Медвед »

ARV писал(а):вы не темните, прямо говорите, что не понятно. или давайте ваш код на рассмотрение и поиск ошибок в нем.

Вот он, буду очень благодарен за помощь, т.к. новичок в написании програм.
ссылка на файл http://ifolder.com.ua/8rsajf8cvg8l.html
Спойлер;Fclk=8MhZ
;PORTD = Індикатор
;PORTC = 0,1,2,3 Спільний катод
;PORTB = 0,1,2,3,4,5 Налаштування режиму роботи
.include "m8def.inc"
.equ T = 34285
.equ T_ind = 100
.def timeL = r20
.def timeH = r21
.def tmp1 = r22
.def tmp2 = r23
.def digit = r24
.def ind_H = r25
.def ind_L = r26

.org 0x000
rjmp init
.org 0x008
rjmp time_check
.org 0x009
rjmp dinamic_ind

init:
ldi r16, high(RAMEND)
ldi r17, low(RAMEND)
out SPH, r16
out SPL, r17

ldi r16, 0xFF
out DDRD, r16
out DDRC, r16
out PORTB, r16

ldi digit, 4
ldi r16, T_ind
out TCNT0, r16
ldi r16, 1<<CS02
out TCCR0, r16
ldi r16, 1<<TOIE0
out TIMSK, r16

sei
;========================
main:
sbis PINB, 0 ; Перевірка 1 кнопки
rjmp add_1 ; Переходимо для збільшення часу на 1
sbis PINB, 1 ; Перевірка 2 кнопки
rjmp add_10 ; Переходим для збільшення часу на 10
sbis PINB, 2 ; Перевірка 3 кнопки
rjmp add_100 ; Переходим для збільшення часу на 100
sbis PINB, 3 ; Перевірка 4 кнопки
rjmp sub_1 ; Переходим для зменшення часу на 1
sbis PINB, 4 ; Перевірка 5 кнопки
rjmp sub_10 ; Переходим для зменшення часу на 10
sbis PINB, 5 ; Перевірка 6 кнопки
rjmp sub_100 ; Переходим для зменшення часу на 100
rcall bin_to_bcd
stop_check:
sbis PINB, 6 ; Перевірка 7 кнопки
rjmp start_stop; Переходим для запуску/зупинки таймера
rjmp main ; Ніяка кнопка не натиснута
;========================
add_1:
rcall delay_contacts ; Затримка на тремтіння контактів
inc timeL ; Збільшуємо час на 1(молодший регістр)
brcc wait_1 ; Регіср "закінчився" (встановлено прапорець переносу)
dec timeL ; Повертаємо минуле значення
inc timeH ; Збільшуємо на 1 (старший регістр)
wait_1:
sbic PINB, 0 ; Перевірка відпускання кнопки
rjmp output ; Переходим на вихід
rjmp wait_1 ; Кнопку не відпущено

add_10:
rcall delay_contacts
ldi r16, 10
add timeL, r16
brcc wait_2
subi timeL, 10
add timeH, r16
wait_2:
sbic PINB, 1
rjmp output
rjmp wait_2

add_100:
rcall delay_contacts
ldi r16, 100
add timeL, r16
brcc wait_3
subi timeL, 100
add timeH, r16
wait_3:
sbic PINB, 2
rjmp output
rjmp wait_3

sub_1:
rcall delay_contacts
dec timeH
brcc wait_4
inc timeH
dec timeL
wait_4:
sbic PINB, 3
rjmp output
rjmp wait_4

sub_10:
rcall delay_contacts
ldi r16, 10
subi timeL, 10
brcc wait_5
add timeH, r16
subi timeL, 10
wait_5:
sbic PINB, 4
rjmp output
rjmp wait_5

sub_100:
rcall delay_contacts
ldi r16, 100
subi timeL, 100
brcc wait_6
add timeH, r16
subi timeL, 100
wait_6:
sbic PINB, 5
rjmp output
rjmp wait_6

output:
rcall delay_contacts
rcall bin_to_bcd
rjmp main

start_stop:
brts stop

ldi r17, high(T)
ldi r16, low(T)
out TCNT1H, r17
out TCNT1L, r16
ldi r16, 1<<CS10| 1<<CS11
out TCCR1B, r16
ldi r16, 1<<TOIE1
out TIMSK, r16
set
rcall delay_contacts
sbic PINB, 6
wait_7:
rjmp stop_check
rjmp wait_7

stop:
ldi r16, 0x00
out TCCR1B, r16
clt
rcall delay_contacts
wait_8:
sbic PINB,6
rjmp main
rjmp wait_8
;=======================
time_check:
brts dec_h
dec timeL
brcc output_3
set
inc timeL
dec_h:
dec timeH

output_3:
ldi r16, high(T)
ldi r17, low(T)
out TCNT1H, r16
out TCNT1L, r17
reti

;===========
dinamic_ind:
ldi r16, T_ind
out TCNT0 , r16
rcall bin_to_bcd

dec digit
brne not_four
ldi digit, 4

digit_4:
mov YL, timeH
lsr YL
lsr YL
lsr YL
lsr YL
ldi r16, 0b00000111
out PORTC, r16
rjmp output_2

not_four:
cpi digit, 3
breq digit_3
cpi digit, 2
breq digit_2

digit_1:
mov YL, timeL
andi YL, 0x0F
ldi r16, 0b000001110
out PORTC, r16
rjmp output_2

digit_3:
mov YL, timeH
andi YL, 0x0F
ldi r16, 0b00001011
out PORTC, r16
rjmp output_2

digit_2:
mov YL, timeL
lsr YL
lsr YL
lsr YL
lsr YL
ldi r16, 0b00001101
out PORTC, r16

output_2:
ldi ZH, high(1<<ind_codes)
ldi ZL, low(1<<ind_codes)
ldi YH, 0
add ZL, YL
adc ZH, YH
lpm r16, Z
out PORTD, r16
reti

;================
bin_to_bcd:
cli
mov ind_L, timeL
mov ind_H, timeH


ldi tmp1, 100
ldi tmp2, -1
loop_1:
inc tmp2
sub ind_L, tmp1
brsh loop_1
dec ind_H
brpl loop_1
add ind_L, tmp1

mov ind_H, tmp2
ldi tmp1, 10
ldi tmp2, -1
loop_2:
inc tmp2
sub ind_L, tmp1
brsh loop_2
add ind_L, tmp1
swap tmp2
add ind_L, tmp2

ldi tmp2, -1
loop_3:
inc tmp2
sub ind_H, tmp1
brsh loop_3
add ind_H, tmp1
swap tmp2
add ind_H, tmp2
sei
ret
;Затримка на тремтіння контактів кнопки=========
delay_contacts:
cli
ldi r16, 0x00
out PORTD, r16
ldi r16, 255
dm1: ldi r17, 255
dm2: dec r17
brne dm2
dec r16
brne dm1
sei
ret
;Таблиця кодів===================
ind_codes:
.db 0b11111100, 0b01100000
.db 0b11011010, 0b11110010
.db 0b01100110, 0b10110110
.db 0b10111110, 0b11100000
.db 0b11111110, 0b11110110
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение akl »

Бегло посмотрел в студии.
Ошибка

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

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)

Пожелания
Максимально сократить длинные обработчики прерываний и ввести запоминание статуса и используемых в них регистров с восстановлением их при выходе.
Как минимум в 2 раза поднять частоту вывода на индикацию. Частота 50/секунду маловата.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Demiurg »

Спойлер

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

//==================
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


Системный тик 1 мс. При 6 индикаторах выходит 1:6= ~166 Гц. Все это работает в основном цикле. Мерцаний нет. Если правильно организовать программу, мигать не будет. В крайнем случае пихаем вывод в порты в прерывание.

Весь проект не отдам. Коммерческий. Причесывать, чтобы сюда выложить нет ни времени ни желания. Уже больше 2 лет не пишу на асме. Перекрестясь, переполз на си.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15553
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение BOB51 »

Снова за дисплейную развертку? :sleep:
Да еще "коммерческий" ... :facepalm:
Тут "на дурняк" новинки выкладываешш - никого нах... не нахх...
(смотри пост от Пн апр 13, 2015 12:51:34 в viewtopic.php?f=62&t=94201&start=60 , в частности открытый исходник под ассемблером исключительно под аппаратный арсенал АВРки - download/file.php?id=213673 )
8)
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Мikа »

Доброго дня, уважаемые коты. Помогите решить проблему, связанную с работой оперативной памяти.

Стоит такая задача:
При попадании в "эту часть кода" (нажатие кнопки), нужно загрузить значение и регистра в оперативную память. И при следующем попадании надо загрузить значение из того же регистра в следующую ячейку ОЗУ, относительно предыдущего раза. Ну и так далее. Я попробовал сделать так:

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

.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         ; Записать его значение в ОЗУ



Собственно, вопрос, как правильно написать увеличение адреса оперативки, куда нужно записать?
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Demiurg »

BOB51 писал(а):Да еще "коммерческий" ...

Весь проект выкладывать смысла нет. Потому активно применяются конечные автоматы, таймерная служба из программных таймеров. Псевдопараллельность процессов. Объяснять у меня эти вещи нет времени. Готовить проект, чтобы выскрести из него код для заказа нет ни времени ни желания. Почему, я написал выше. Так как разговор зашел за 7 сегментные индикаторы, я вложил куски кода. Берите и пользуйтесь.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Demiurg »

Для работы с ОЗУ есть регистровые пары X, XL r26, XH r27; Y, YL r28, YH r29; Z, ZL r30, ZH r31.
С ОЗУ могут работать все три регистровые пары XYZ, с flash памятью только регистровая пара Z.

Купите или скачайте книгу Вольфганг Трамперт "AVR-RISC микроконтроллеры фирмы ATMEL". Там все подробно разжевано, даны примеры, программы на асме.

Посмотрите выше в моем примере, как работать с ОЗУ. Читайте даташиты, там написано как использовать регистры и ОЗУ.
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Мikа »

Спасибо за наводку, поищу. Вернее точно найду. P.S. Я не полное дно, просто кодил 6 часов подряд, в конце дня наткнулся на проблему, решил спросить на форуме :)
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Аватара пользователя
Seriyvolk
Друг Кота
Сообщения: 4965
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Seriyvolk »

М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
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Demiurg »

Я не понял, что тебе точно надо.

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

// Вариант 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


Третий вариант самый жручий по размеру кода. одна команда lds, sts занимает 4 байта. Так как адрес абсолютный.
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Мikа »

Seriyvolk, Demiurg, спасибо, то, что надо, щас только полностью осознаю в голове, что происходит в программе и проблема решена :)
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ILYAUL »

На эту строку компилятор сообщает ошибку о неожиданном REGDEF.
Синтаксис:
.DEF Символическое_имя = Регистр
Пример:
.DEF temp=R16
.DEF ior=R0
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Мikа »

Да это понятное дело)
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ILYAUL »

А тогда
.

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

def R16 REGISTER ;* Тут лежит то, что необходимо грузить в ОЗУ
.def R17 Temp
.def R18 Temp1

??? )
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Demiurg »

Случайно REGISTER не зарезервированное слово?
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Мikа »

Чуваки, просто для примера это писал) в программе дефы пишу через равно и словом регистр вообще не пользуюсь))
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Мikа »

Разобрался, удалите, пожалуйста, этот пост.
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Мikа »

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

Оговорюсь, что дело происходит с ATmega48, у которой нет JTAG и схема такая, что вообще все порты заняты. Я шью её через ISP, и кроме как ISP и JTAG я подключаться к МК не умею. В симуляторе чё-то у меня тоже не получается толком прошагать программу. Это я говорю к тому, "почему ты сам не проверил ?".

Вопрос у меня о работе с оперативкой. Посмотрите, пожалуйста, код. Один кусок должен записывать значения в оперативку, другой доставать. Это значения времени. ЧЧ:ММ. Они хранятся в виде одного байта каждый из них. То есть байт на часы, байт на минуты.

Часть кода, которая записывает значения.
По моим ожиданиям, она должна записывать 100 значений по 2 байта каждый раз, когда программа выполняет этот кусок кода и при переходе через эту границу начинать переписывать с 0.

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

;* Записываем в оперативку очередное время
         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 разрядные, но в режиме чтения из оперативки на секундах показано, какой по счёту результат отображается.


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

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Gudd-Head »

Мikа писал(а):По моим ожиданиям, она должна записывать 100 значений по 2 байта

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

cpi Temp,197
По моим ощущениям, она запишет 99 значений (2*99 = 198 = 0...197).
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Ответить

Вернуться в «AVR»