|
Как написать код на ассемблере AVR-на "С"-понятно. |
|
|
|
Sep 20 2013, 07:18
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 25-01-13
Из: Брянск
Пользователь №: 75 345

|
Здравствуйте.Подскажите пожалуйста.Вот код на Си -здесь всё понятно. if (u > 256) // 1.25V PORTD = 0b00000011; if (u > 384) // 1.875V PORTD = 0b00000111 А вот как реализовать на ассемблере,дело в том ,что переменная-"u"-это двухбайтное число(10 разрядов) у меня это регистры АЦП-ADCL , ADCH. И если не трудно подскажите ,что сделал автор в 23 строке своей программы u = (ADCL|ADCH << 8);-взято отсюда http://radioparty.ru/index.php/prog-avr/pr...adc-avr?start=1Если можно то подробнее.Спасибо.
|
|
|
|
|
 |
Ответов
|
Oct 10 2013, 17:59
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 25-01-13
Из: Брянск
Пользователь №: 75 345

|
Считаю,что тема была бы не законченной не приведя законченный код индикатора.Спасибо всем за помощь. Не сомневаюсь,что не совсем хорошо,но я ещё только начинающий. Код ;****************************************** ;Автор: * ;Дата :10/10/2013 * ;Имя файла:indADC.asm * ;Для AVR : ATmega8A,в корпусе DIP28 * ;Тактовая частота:3.686 Мгц. * ;Исследование АЦП. Индикатор на * ;светодиодах.Прерывание .Однократный * ;режим преобразования АЦП. * ;****************************************** .include "m8Adef.inc" ;Файл определений для ATmega8A .list ;Включение листинга .def temp = r16 ;Временный регистр .def leder = r19 ;Регистр индикации .def temp1 = r20 ;**** Описание макроса ********************
.macro caseADC ldi temp1,high(@2) cpi zL,low(@2) cpc zH,temp1 brlo t@0 ldi leder,@1 out PORTD,leder t@0: .endm
;****Векторы прерываний ******************* .org $0 ;Установка текущего адреса на ноль по "RESET" rjmp init ;Переход на начало программы
.org $00E ;Вектор прерывания АЦП rjmp adca ;преобразование завершено ; ;****Модуль инициализации******************
init: ldi temp,low(RAMEND) ;Установка указателя стека out SPL,temp ;на последнюю ldi temp,high(RAMEND) ;ячейку out SPH,temp ;ОЗУ ldi temp,0b11111111 ;Порт PD на вывод out DDRD,temp ;используем выводы PD0...PD7 out PORTD,temp ;Погасим светодиоды на PD0...PD7
clr temp ;Аналоговые входы порта PC out DDRC,temp ;на выводе PC0 "сидит" канал ADC0 out PORTC,temp ;отключаем подтягивающие резисторы ;****Инициализация АЦП ********************* ldi temp,0b10001101 ;ADEN=1,ADIE=1,Fadc=Fclk/32,ADFR=0(режим однократного преобразования) out ADCSRA,temp ;Fadc=115 кГц при Fclk=3,69 МГц ldi temp,0b01000000 ;Выбираем канал ADC0 по выводу PC0 out ADMUX,temp ;Опорное напряжение AVCC=VCC равно напр.питания 5 вольт,ADLAR=0 (выравнивание по правому) sei ;Разрешение прерываний sbi ADCSRA,ADSC ;Запуск преобразования loop: rjmp loop ;Цикл ожидания прерываний ;****Обработка прерывания от АЦП ********** adca: in zL,ADCL ; in zH,ADCH ;
cbi ADCSRA,ADIE ;Запрет прерывания от АЦП ldi temp1,high(128) cpi zL,low(128) cpc zH,temp1 brlo t0 ldi leder,0b11111110 out PORTD,leder
rjmp t1 t0: ldi leder,0b11111111 out PORTD,leder
t1: caseADC 2,0b11111100,256 caseADC 3,0b11111000,384 caseADC 4,0b11110000,512 caseADC 5,0b11100000,640 caseADC 6,0b11000000,768 caseADC 7,0b10000000,896 caseADC 8,0b00000000,1020 sbi ADCSRA,ADIE ;Разрешение прерывания от АЦП sbi ADCSRA,ADSC ;Пуск преобразования reti
|
|
|
|
|
Oct 10 2013, 20:46
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(serj32 @ Oct 10 2013, 21:59)  Код ..... .org $0 ;Установка текущего адреса на ноль по "RESET" rjmp init ;Переход на начало программы
.org $00E ;Вектор прерывания АЦП rjmp adca ;преобразование завершено ; ;****Модуль инициализации****************** ... ldi temp,0b11111111 ;Порт PD на вывод ...;****Обработка прерывания от АЦП ********** ... Код .org $00E и иже лучше писать как Код .org INT6addr где INT6addr это объявленное уже(!) смещение в файлики который вы с верху в исходнике заинклюдили, то биш "m8Adef.inc" код лучше расположить за таблицей векторов и сначала вставить обработчик прерывания АЦП, потом вспомогательные функции, а в конце основную программу, в задачи которой входит инициализация всего и всех. маски в регистр лучше загружать человекопонятными. Т.е. перед кодом (или в своём отдельном инклудники) делаете дефайны, а потом их юзаете на масках. Это если их нет в волшебном файлике "m8Adef.inc" (что редкость!). тогда код будет читаться более понятнее (даже через пару десяткофф лет). Как пример: Код ori tempA,((1 << LED_DIG1) | (1 << LED_DIG2) | (1 << LED_DIG3)) .... ori tempA,(1 << OCIE0) out TIMSK,tempA это так-же можно применять к портам и пинам вывода-ввода информации. Тогда вы получаете следующие профиты: 1) код легче портируем, наименование порта меняется в заголовке файла или инклудника. 2) код легче читаем - понятно что в порт(к примеру) дисплея вывели символ, или там выдали разрешение, или там синхросигнал... 3) код легче воспринимаем - т.к. идёт абстрагирование от конкретного порта, вольно или не вольно человек концентрируется на логике кода, а не названии порта и его соответствие со схемой.
|
|
|
|
Сообщений в этой теме
serj32 Как написать код на ассемблере AVR-на "С"-понятно. Sep 20 2013, 07:18 MrYuran Цитата(serj32 @ Sep 20 2013, 10:18) И есл... Sep 20 2013, 07:32 serj32 Цитата(MrYuran @ Sep 20 2013, 11:32) Кодu... Sep 20 2013, 08:23  adnega Цитата(serj32 @ Sep 20 2013, 12:23) Вот д... Sep 20 2013, 08:47   serj32 Цитата(adnega @ Sep 20 2013, 12:47) Подра... Sep 20 2013, 10:02  MrYuran Цитата(serj32 @ Sep 20 2013, 11:23) Вот д... Sep 20 2013, 09:42 V_G Вероятно, можно поступить проще, если повнимательн... Sep 20 2013, 10:29 serj32 Цитата(V_G @ Sep 20 2013, 14:29) Вероятно... Sep 20 2013, 10:51  V_G Это старшие байты Ваших порогов, сдвинутых влево н... Sep 20 2013, 11:15 serj32 Очевидно чтобы реализовать Си код
if (u > 256)... Sep 20 2013, 16:58 _Pasha Цитата(serj32 @ Sep 20 2013, 19:58) Очеви... Sep 20 2013, 18:14 zombi Цитата(serj32 @ Sep 20 2013, 19:58) необх... Sep 20 2013, 18:56  serj32 Цитата(zombi @ Sep 20 2013, 22:56) Сравни... Sep 20 2013, 19:56 zombi Ход примерно правильный.
Но!!!
Я же уж... Sep 20 2013, 20:15 _Pasha Цитата(zombi @ Sep 20 2013, 23:15) Ход пр... Sep 21 2013, 15:56  serj32 Цитата(_Pasha @ Sep 21 2013, 19:56) Не уч... Sep 21 2013, 18:31   ae_ Если я правильно понял о чём речь, то в итоге долж... Sep 22 2013, 04:31 _Pasha Посмотрел.
1. out PORTD,0b00000011; - такой команд... Sep 22 2013, 04:18 zombi Цитата(_Pasha @ Sep 22 2013, 07:18) потом... Sep 22 2013, 08:15 ILYAUL Кодcbi ADCSRA,ADIE ;Запрет прерывания от АЦП... Oct 10 2013, 19:04
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|