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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

пошел копать код.
пока один вопрос:
зачем в исходник вставлять inc-файл? есть же директива .include.
Чем дальше, тем больше становлюсь занудой...
Изображение
Реклама
poff
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Вс авг 10, 2008 00:41:08

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

Сообщение poff »

to GP1. Традиция.. INC-файл был кривой, компилятор на него ругался. Затащил в тело исходника, исправил, а удалять не стал, та наглядней.

Только-что проверил его в AVR Studio, сформировал HEX, залил в процессор - эфект тотже. Хотя пошаговая симуляция работает как и должно быть.

В любом случае спасибо за поддержку... Жду.
Реклама
Аватара пользователя
Liv
Вымогатель припоя
Сообщения: 525
Зарегистрирован: Сб сен 20, 2008 12:12:30
Откуда: Minsk
Контактная информация:

Re:

Сообщение Liv »

MTF писал(а):Инфы в инете много , но через int как делать инфы особо нет , либо на Си, разве что товарищь Ридико полуописал как он делал через int на at89с2051
Вот, откопал и на ASM, хотя на нём уже давно не пишу. Почти :) http://upload.caxapa.ru/RC-5.asm
Аватара пользователя
MTF
Нашел транзистор. Понюхал.
Сообщения: 179
Зарегистрирован: Чт янв 07, 2010 11:25:12
Откуда: Москва

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

Сообщение MTF »

To Liv спасибо за исходник !!!!

кто нибуть может проконсультировать по поводу динамической индикации , по схеме у меня 2 разряда , мне просто надо выводить цифры от 0 до 99


как загружать 1 разряд через 74LS164 я вроде понял

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


;блок для вывода через 74LS164
	ldi	r17,8		;
74LS:	cbi 	PORTD,5	;
	sbrc	r16,7		;
	sbi 	PORTD,PD5	;
	lsl	r16		;
	sbi 	PORTD,6	;
	cbi 	PORTD,6	;
	dec	r17		;
	brne	74LS		;
возникло несколько вопросов:

какую частоту таймера лучше выбрать для 2 разрядов ???


еще я так понимаю мне надо изобрести некий преобразователь числа в семисегментный код для
74LS164 ???

Основная моя проблема не дошло как работать с двумя разрядами , для загрузки например числа 65 , если не трудно помогите разобратся :roll:
Вложения
HG1.JPG
(83.37 КБ) 429 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

MTF писал(а): возникло несколько вопросов:
какую частоту таймера лучше выбрать для 2 разрядов ???

еще я так понимаю мне надо изобрести некий преобразователь числа в семисегментный код для
74LS164 ???

Основная моя проблема не дошло как работать с двумя разрядами , для загрузки например числа 65 , если не трудно помогите разобратся :roll:
1. Длительность свечения 1 разряда должна быть не более 1/25 сек, отсюда и высчитывай частоту.
2. Изобретать преобразователь не надо, надо просто либо во flash либо в EEPROM записать коды семисегментника.
3. Делаешь цикл из 2х проходов, сначала одну цифру, потом вторую

to poff
Честно говоря не догоняю логику работы твоего кода, сорри. :dont_know:
Чем дальше, тем больше становлюсь занудой...
Изображение
Реклама
Аватара пользователя
MTF
Нашел транзистор. Понюхал.
Сообщения: 179
Зарегистрирован: Чт янв 07, 2010 11:25:12
Откуда: Москва

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

Сообщение MTF »

To GP1

с частотой понял 2 * 25 = 50Гц т.е 50 раз в секунду , у меня таймер CK/256 это 0,016 сек думаю подойдет или мне надо сделать именно 0,01сек ???

Если не трудно покажите пожалуйста как мне загрузить во flash либо в EEPROM коды семисегментника , и как потом их выбирать и позиционировать ????


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

.equ	OutPort 	=  PORTB
.def	tmp	    =  r16
.def      tmp1         =  r17 ;

T0_OVF:
.....
.....
;================ INDICATION ===== 

;------------------- OFF IND ------------------------------
         in           tmp ,  portb		;чтение portB 
         ori          tmp ,  0x03		;в 1 pb0 , pb1
         out         portb, tmp		;погасить  индикатор
; вопрос  так можно делать или не надо ????
         sbi         OutPort, (0<<OutPin , 1<<OutPin )

;здесь надо определять что должен показывать индикатор и какой должен светится ???   
        ;в  tmp   код цифры для 74LS164
         

;------------- Вывод в 74LS164 --------------------
         ldi	tmp1 , 8	;8 bits
LS164:
         cbi 	portd , 5	;DATA "0" => 74LS164
         sbrc	tmp  ,  7	;если  bit 7=0    выход 
         sbi 	portd , 5	;DATA "1" => 74LS164
         lsl	tmp		;Shift left r16
         sbi 	portd , 6	;CLOCK strobe for 74LS164
         cbi 	portd,  6	;CLOCK strobe for 74LS164
         dec	tmp1		;dec 
         brne	LS164		;если не 0  то LS164

	;------------------- ON IND ------------------------------
         in	            tmp ,  portb	;
         ...............
         ????????????????????????
         ............... 
         out	portb , tmp	;ON IND
Реклама
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

MTF писал(а):Если не трудно покажите пожалуйста как мне загрузить во flash либо в EEPROM коды семисегментника , и как потом их выбирать и позиционировать ????
Как вариант во флэш:
С помощью
.CSEG
.ORG $ХХХ
.DW $1234
Записываете во флэш (память программ), начиная с адреса ХХХ двоичные слова (по 2 байта) коды семисегментника, напр. 1234, причём по порядку с нуля по девятку.
Далее при необходимости вывести цифру У:
Загружаете в регистр Z адрес ХХХ со сдвигом на единицу (влево?), т.к. младший байт регистра Z указывает, будет выведен старший или младший байт слова по адрксу ХХХ.
Прибавляете к содержимому Z вашу цифру У.
Командой lpm (или lpm Rd, Z) подгружаете код в регистр R0 (Rd). Далее OUT в порт на вывод :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

to MTF
1. Судя по коду ты собираешься выводить индикацию в обработчике прерывания T0_OVF, ИМХО это ламерство, без обид, в прерывании формируй флаг, а всю обработку в основном теле программы.
2. По коду чуть позже.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

to MTF
Ну что-то типа такого, код в симуляторе не гонял возможны косяки :)))

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

.equ   OutPort    =  PORTB
.equ	dg1	=pb1
.equ	dg2	=pb0
.def   tmp       =  r16
.def      tmp1         =  r17 ;
;****************
.equ	pin_dat	=pd5			;*** оч.рекомендую делать именно так
.equ	pin_clk	=pd6
.def	n	=<какой нибудь регистр>
.def	flags	=r19			;*** определяем регистр флагов
	.equ	tind	=7		;*** и назначаем флаг индикации


; main prog
.....
.....
	call	display			;***вызов процедуры индикации

.....
.....
	jmp	<начало>
;=================
T0_OVF:
.....
.....
	sbr	flags,tind			;*** установить бит, время индикации истекло
	reti
;================ INDICATION ===== 
display:

;здесь надо определять что должен показывать индикатор и какой должен светится ???   
        ;в  tmp   код цифры для 74LS164
					;*** для этого нужно организовать еще один цикл 
	ldi	n,2			;*** у нас 2 разряда
	clr	r0			;*** пригодится для сложения
next_digit:

	; вопрос  так можно делать или не надо ????
	;sbi         OutPort, (0<<OutPin , 1<<OutPin )	;*** вообще не понял для чего ЭТО
;*** вот здесь в tmp надо зарузить значение
;*** не знаю как у тебя организовано хранение выводимых значений
;*** поэтому оставляю на твое усмотрение

	;*** вариант если коды размещены во flash-памяти
	ldi	ZL,low(tabl_code*2)
	ldi	ZH,high(tabl_code*2)		;*** теперь Z указывает на начало таблицы с кодами индикатора
;*** находим код нужного нам символа 
	add	ZL, tmp
	adc	ZH,r0			;*** теперь Z указывает на нужный символ
;*** и загружаем семисегментный код в tmp
	lpm	tmp,Z

;------------- Вывод в 74LS164 --------------------
         ldi   tmp1 , 8   ;8 bits
LS164:
;*** с чего ты взял что выводишь здесь свои данные?
;         cbi    portd , 5   ;DATA "0" => 74LS164
;         sbrc   tmp  ,  7   ;если  bit 7=0    выход 
;         sbi    portd , 5   ;DATA "1" => 74LS164
;         lsl   tmp      ;Shift left r16
;****
	cbi	portd,pin_dat		;*** сбрасываем пин в 0
	lsl	tmp			;***выдавливаем бит в СY
	brcc	ls164_0
	sbi	portd,pin_dat		;*** устанавливаем в 1 если CY=1
ls164_0:
         sbi    portd , pin_clk	;CLOCK strobe for 74LS164
         cbi    portd,  pin_clk	;CLOCK strobe for 74LS164
         dec   tmp1      ;dec 
         brne   LS164      ;если не 0  то LS164
;*** в регистре нужный код , приступаем к индикации
;*** сбрасываем флаг индикации
	cbi	flags,tind
	cpi	n,2
	breq	digit2
	cbi	OutPort, dg1		;*** включаем разряд1
      ls_tout1:	sbis	flags,tind		;*** и ждем переполнения счетчика
		rjmp	ls_tout1
		rjmp	ls_next	
digit2:	cbi	OutPort, dg2		;*** включаем разряд2
      ls_tout2:	sbis	flags,tind		;*** и ждем переполнения счетчика
		rjmp	ls_tout2
ls_next:
;------------------- OFF IND ------------------------------
         in           tmp ,  portb      ;чтение portB 		;*** здесь все норм.
         ori          tmp ,  0x03      ;в 1 pb0 , pb1
         out         portb, tmp      ;погасить  индикатор
	dec	n
	brne	next_digit
	ret				;*** выход
;=================
.cseg
tabl_code:
	.db	<код нуля>
	.db	<код 1>
	...............
	; и т.д. максимум 256 кодов
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

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

Сообщение Pooher »

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

.equ   pin_dat   =pd5         ;*** оч.рекомендую делать именно так
А ещё лучше вот так:

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

#define RS portX,N
Тогда можно обращаться так:

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

sbi RS
cbi RS
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

+1
эт... дело привычки :tea:
у меняу с "детства" не принятие макросов :))) , шутка юмора.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

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

Сообщение Pooher »

Я эт сам только неделю назад в хелпе нарыл :)
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

Нарыл сам - поделись с котами :beer:
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

Pooher писал(а):[А ещё лучше вот так:

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

#define RS portX,N
Тогда можно обращаться так:

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

sbi RS
cbi RS
Дело вкуса. Если препроцессор не приделан к ассемблеру "чтобы было" с минимальным функционалом, а нормально поддерживает операцию склейки ## и делает разбор "ну точно как С-шный" (ну или именно С-шный и используется, как в IAR или avr-gcc/WinAVR), то, на мой вкус, так лучше:

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

#define A_PORT(p,b) PORT##p,b
#define PORT(pb) A_PORT(pb)

#define A_PIN(p,b) PIN##p,b
#define PIN(pb) A_PIN(pb)

#define A_DDR(p,b) DDR##p,b
#define DDR(pb) A_DDR(pb)

#define A_MASK(p,b) (1<<b)
#define MASK(pb) A_MASK(pb)

// ну это так, для полнты комплекта, используется редко
#define A_BIT(p,b) (b)
#define BIT(pb) A_BIT(pb)
И используется так:

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

#define KEY		B,0
#define ALARM	B,1
#define LED		B,2
#define SCL		B,4

	 ; можем и маску собрать для одного обращения к DDR
	outi	DDRB, MASK(ALARM) | MASK(LED)
	sbi	DDR(SCL)                 ; и обратиться к биту DDR
	sbic	PIN(KEY)
	sbi	PORT(LED)
	sbi	PIN(ALARM)               ; а это на новых кристаллх - инверсия ноги
Писанины немного больше, зато можно манипулировать всеми характеристиками пина по одному его имени и не задавать толпу определений

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

#define SDA_DDR	DDRB,5
#define SDA_PORT	PORTB,5
#define SDA_PIN	PINB,5
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
MTF
Нашел транзистор. Понюхал.
Сообщения: 179
Зарегистрирован: Чт янв 07, 2010 11:25:12
Откуда: Москва

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

Сообщение MTF »

GP1 спасибо за помощь :beer: , практически разобрался , загвозка во flash !!!!

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

.cseg
tabl_code:
  .db  0xDB   ; 0
  .db  0x48    ; 1
  .db  0xE3    ; 2
   db  0xEA    ; 3


display:
   ...................
   ...................

   ldi   ZL ,  low(tabl_code*2)
   ldi   ZH ,  high(tabl_code*2)      ;*** теперь Z указывает на начало таблицы с кодами индикатора
;*** находим код нужного нам символа 
   add   ZL ,  tmp
   adc   ZH ,  r0         ;*** теперь Z указывает на нужный символ
;*** и загружаем семисегментный код в tmp
   lpm   tmp , Z

;---------- вывод в 74LS164------------------
   .........
   .........

Допустим мне надо вывести число 18 , в tmp записываю 18

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

   add   ZL ,  tmp
следовательно на индикаторе отобразится , то что у меня записано в tabl_code 18 по счету , т.е
на обоих индикаторах будет одно и тоже число а не 18 ???

можно ли так ???

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

.cseg
tabl_code:
  .db  0xDB   ; 0
  .db  0x48    ; 1
  .db  0xE3    ; 2
  ...........
  ...........
  .db  0x48 , 0xFB   ; 18
тогда надо как то смещать что ли , для показа двух разных чисел , или есть какой то другой метод , а то все 99 чисел надо писать в массив !!!

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

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

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

MTF писал(а):тогда надо как то смещать что ли , для показа двух разных чисел , или есть какой то другой метод , а то все 99 чисел надо писать в массив !!!
мне так кажется надо как то расклдывать число 18 например на 1 и 8 и как то по одному числу выводить ???? :dont_know:
Естессно, числа, как правило, выводятся по одному десятичному разряду, напр. "1" в десятках и "8" в единицах. Для преобразования 8-битного числа в два (три) (четырёхбитных) надо его преобразовать. Пример есть в аппноте AVR204 (вроде) - bin_to_BCD или как-то так. Тогда в памяти надо хранить коды всего 10 цифр :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

MTF писал(а): мне так кажется надо как то расклдывать число 18 например на 1 и 8 и как то по одному числу выводить ???? :dont_know:
Правильно мыслишь :beer:

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

; в tmp число 18
; гасим одну тетраду, ну скажем младшую
      andi tmp,0xF0
      swap  tmp    ; теперь в tmp получилась 1

по кодам тебе надо создать 10 кодов с 0 по 9

ЗЫ в предыдущем посте Gudd-Head правильно указал, что число надо преобразовать к формату BCD
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
MTF
Нашел транзистор. Понюхал.
Сообщения: 179
Зарегистрирован: Чт янв 07, 2010 11:25:12
Откуда: Москва

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

Сообщение MTF »

GP1

экперементировал в avrstudio

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

    ldi     tmp , 18 
    andi  tmp,0x0F  ; гасим старшую
    swap tmp    ;  в tmp почему то не получилось 8  
получилось 32 !!!

может не так что делаю ???
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

MTF писал(а):GP1

экперементировал в avrstudio

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

    ldi     tmp , 18 
    andi  tmp,0x0F  ; гасим старшую
    swap tmp    ;  в tmp почему то не получилось 8  
может не так что делаю ???
:)))
а если убрать SWAP :wink:
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
MTF
Нашел транзистор. Понюхал.
Сообщения: 179
Зарегистрирован: Чт янв 07, 2010 11:25:12
Откуда: Москва

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

Сообщение MTF »

убрал получается 2
Ответить

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