реклама на сайте
подробности

 
 
> Как написать код на ассемблере AVR-на "С"-понятно.
serj32
сообщение Sep 20 2013, 07:18
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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
Если можно то подробнее.Спасибо.

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
serj32
сообщение Oct 10 2013, 17:59
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Oct 10 2013, 20:46
Сообщение #3


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 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) код легче воспринимаем - т.к. идёт абстрагирование от конкретного порта, вольно или не вольно человек концентрируется на логике кода, а не названии порта и его соответствие со схемой.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 10 2013, 21:04
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (kolobok0 @ Oct 10 2013, 23:46) *
3) код легче воспринимаем - т.к. идёт абстрагирование от конкретного порта, вольно или не вольно человек концентрируется на логике кода, а не названии порта и его соответствие со схемой.

4) сложнее ошибиться в номере бита где-то в одном обращении из многих. Скорее уж эта ошибка будет в том самом глобальном файле объявлений, а исправив ее там исправятся сразу все обращения. Не нужно будет скрупулезно шерстить все файлы исходников в поисках обращений к одному и тому же биту порта.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 20:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.01453 секунд с 7
ELECTRONIX ©2004-2016