Jump to content
Max1201

Реверс двигателя (ATMega16) - AVR

Recommended Posts

Код с помощью которого двигатель вращается в одном направлений по часовой стрелке.
А нужно "составить программу на языке ассемблера для реверсивного управления электродвигателем постоянного тока". так написано в заданий
Но я думаю можно новую не писать, а можно изменить эту так что бы двигатель вращался в одну сторону и потом в другую, наверно так. Помогите, а то я вообще не понимаю этот ассемблер(( 

;* На выходе OC1A МК АТmega16 получаем выходные импульсы
;* с частотой 50 Гц и коэффициентом заполнения g=0,025.
;* Тактовая частота MK AVR: 4 МГц
.nolist
.include"m16def.inc"
.list
 
.def STAT = r15                 ;Регистр для хранения состояния главной программы
.def WorkH = r16                ;Рабочий регистр для главной программы
.def WorkI = r17                ;Рабочий регистр для прерывания от таймера
.def AddLo = r18                ;Вспомогательный регистр для прибавления константы
.equ Impuls = 9000              ;Число тактовых сигналов, соответствующее импултсу
.equ Pause = 1000               ;Число тактовых сигналов, соответствующее паузе
 
Reset:
rjmp Initial                    ;Переход к части инициализации
reti                            ;Внешнее прерывание 0 (не используется)
reti                            ;Внешнее прерывание 1 (не используется)
reti                            ;Прерывание по захвату (не используется)
Timer1CompA:                    ;Прерывание CompareA для ATmega16
in STAT,SREG                    ;Сохраняем флаги главной программы
in WorkI,TCCR1A                 ;Регистр управления А счетчика Т/С1
sbrs WorkI,COM1A0               ;Пропускаем следующую команду, если COM1A0 = 1
rjmp TC1                        ;Пропускаем следующую команду, если COM1A0 = 0
cbr WorkI,1<<COM1A0             ;При следующем прерывании OC1A -> 1
out TCCR1A,WorkI                ;Сохраняем новое значение
in AddLo,OCR1AL                 ;Младший байт OCR1A
subi AddLo,Low(-Impuls)         ;Прибавляем младший байт значения импульса
in WorkI,OCR1AH                 ;Старший байт OCR1A
sbci WorkI,High(-Impuls)        ;Прибавляем старший байт значения импульса
rjmp IntEnde                    
TC1:                            
sbr WorkI,1<<COM1A0             ;При следующем прерывании OC1A -> 1         
out TCCR1A,WorkI                ;Сохраняем новое значение
in AddLo,OCR1AL                 ;Младший байт OCR1A
subi AddLo,Low(-Pause)          ;Прибавляем младший байт значения длительности импульса
in WorkI,OCR1AH                 ;Старший байт OCR1A
sbci WorkI,High(-Impuls)        ;Прибавляем старший байт значения длительности импульса
IntEnde:                        
out OCR1AH,WorkI                ;Назад - старший байт нового значения
out OCR1AL,AddLo                ;Назад - младший байт нового значения
out SREG,STAT                   ;Восстанавливаем старые флаги
reti                            ;Выход из обработки прерывания CompareA
 
Initial:                        ;Инициализация регистра ввода/вывода
ldi WorkH,High(RamEnd)          
out sph,WorkH                   
ldi WorkH,Low(RamEnd)           
out spl,WorkH                   ;Инициализируем стек
clr WorkH                       ;Все разряды = 0
out PortD,WorkH                 ;Вывод в порт D
ldi WorkH,$20                   ;Разряд 5 - в 1, остальные - в 0
out DDRD,WorkH                  ;OC1A (PD5) - выход, остальные входы
ldi WorkH,High(Pause)           ;Старший байт значения паузы
out OCR1AH,WorkH                ;в старший байт регистра сравнения А
ldi WorkH,Low(Pause)            ;Младший байт значения паузы
out OCR1AL,WorkH                ;в младший байт регистра сравнения А
ldi WorkH,$C0                   ;OC1A -> 1
out TCCR1A,WorkH                ;Сохраняем новое значение
ldi WorkH,$02                   ;Входной такт Т/С1 = такт сист. синхр./8
out TCCR1B,WorkH                ;Запускаем Т/С1
ldi WorkH,$40                   
out TIMSK,WorkH                 ;Разрешаем прерывание CompareA
sei                             ;Общее разряшение прерываний (разряд I)
Haupt:                          
rjmp Haupt                      ;Главная часть программы: ожидаем возникновения прерывания

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

d50I1pc3RQg.jpg

e-5ynSa8oWw.jpg

EsW2drcSpUE.jpg

UqMa3Upkoz4.jpg

В методичке это 4 лаба, там программа не та но теория та что и вновой методичке

lab_rab_MK_AVR.pdf

Share this post


Link to post
Share on other sites
7 минут назад, Max1201 сказал:

я вообще не понимаю этот ассемблер

Возьмите другой, который понимаете.

Заплатите преподу, и Вам ни один язык программирования не нужен будет. Или буквари в зубы и учиться.

Share this post


Link to post
Share on other sites
12 минуты назад, Max1201 сказал:

 

Код с помощью которого двигатель вращается в одном направлений по часовой стрелке.

 

Двигатель вращается без помощи кода, по крайней мере тот, что на стенде на фото. Твой код, видимо, для шагового двигателя. У тебя коллекторный двигатель через H-мост, управление двумя выводами, на них 1-0 или 0-1 в зависимости от нужного направления. Писать надо с нуля, и полное задание тоже надо знать!

Share this post


Link to post
Share on other sites

Molex: соединения, связь, инновации

Развитие техники предъявляет все более высокие требования к разъемам и скорости передачи данных. Соединения становятся прецизионными и наукоемкими изделиями. На сегодня Molex – это не только высокотехнологичные разъёмы, но и инновационные устройства передачи данных.

Подробнее

6 часов назад, Max1201 сказал:

Помогите, а то я вообще не понимаю этот ассемблер

Для чего же вы тогда учитесь? Чтобы потом штаны в офисе протирать? Смените профессию, пока не поздно.

Share this post


Link to post
Share on other sites

Код ужасен. Фотматирование отсутствует, осмысленные комментарии тоже.

Цитата

Reset:

rjmp Initial ;Переход к части инициализации

reti ;Внешнее прерывание 0 (не используется)

reti ;Внешнее прерывание 1 (не используется)

reti ;Прерывание по захвату (не используется)

Timer1CompA: ;Прерывание CompareA для ATmega16

in STAT,SREG

Зачем здесь метка RESET? Да еще практически синоним метки Initial. По адресу Timer1CompA идет не переход на обработчик, а сразу его код. А вдруг понадобится добавить прерываний? А где записанные явным образом адреса векторов (.org OC1Aaddr + rjmp Tim1_CompA_vect).

Главный вопрос - зачем тут вообще используется таймер?

8 часов назад, Max1201 сказал:

ldi WorkH,$40

out TIMSK,WorkH

За такое надо по рукам бить. Тем более что в других местах вместо магических чисел используются нормальные сдвиги.

8 часов назад, Max1201 сказал:

subi AddLo,Low(-Pause) ;Прибавляем младший байт значения длительности импульса

А почему в коде - Pause?

.

Проще переписать с нуля под конкретное ТЗ чем переделывать ЭТО.

Share this post


Link to post
Share on other sites
                     

DC/DC-преобразователи: принципы работы и уникальные решения Maxim Integrated

Что нового можно сказать про DC/DC? Написаны десятки статей, а самостоятельное изготовление преобразователя мощностью от единиц Вт до нескольких кВт даже в домашних условиях не составляет большого труда. Тем не менее, когда речь идет о микро-, или даже нано-ваттах, проектировщик может столкнуться с рядом трудностей. Разработка устройства с батарейным питанием весьма малой мощности – одна из наиболее актуальных и интересных задач во время всепроникающего интернета вещей. А грамотная схемотехника системы питания не возможна без знания основ работы DC/DC преобразователей. Освежить базовые знания и узнать об особенностях проектирования узлов питания мобильного устройства с оптимальным энергопотреблением можно из следующей статьи

Подробнее

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

jnA65ZDHUPA.jpg

uZTjZnniMSw.jpg

Share this post


Link to post
Share on other sites
16 часов назад, Max1201 сказал:

я вообще не понимаю этот ассемблер((

Хм... А почему бы это не сказать преподу и не написать прогу на том, что понимаете ? Думаю, он пойдёт на встречу.
 

Share this post


Link to post
Share on other sites

Он наверное ни на чем не понимает в программировании .

Share this post


Link to post
Share on other sites
.include "m16def.inc"
.equ ROTATE_DIRECTION = 1

sbi DDRD,4
sbi DDRD,5

.if ROTATE_DIRECTION
  sbi PORTD,4
  cbi PORTD,5
.else
  cbi PORTD,4
  sbi PORTD,5
.endif

CYCLE:
  rjmp CYCLE

Вот как ЭТО можно исправить: стереть к двоичным демонам и написать по-нормальному.

Share this post


Link to post
Share on other sites

Выход на схеме на мост с OCB1A ,  OCB1B ,  чтоб не только направление,  но и скорость задавать .

Тут надо студенту книжку покупать по АВР и читать . Судя по повороту  схемы не только по АВР .

 

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • Guest Виктор
      By Guest Виктор
      Здрасте, я хочу разобраться как работает и программируется мк и для этого выбрал среду разработки AtmelStudio. Привлекла она тем, что в ней есть симуляторы микроконтроллеров и покупать отладочные платы с мк не нужно, чтобы просто проверить код, что в какой регистр записывается и т.д. Захотел заглянуть в заголовочный файл, нашёл там строки:
      if __AVR_ARCH__ >= 100
      #    define __SFR_OFFSET 0x00
      #  else
      #    define __SFR_OFFSET 0x20
      #  endif
      P.S. модель взял atmega16
      Стал искать документацию по этому файлу... так и не нашёл. Потом пришла идея посмотреть значение __AVR_ARCH__ через отладку, поставил там точку, нажал на запуск с отладкой, но не вышло... отладчик сразу переходит на функцию мейн. Подумал, что может это препроцессорная директива, поэтому и не заходит, но потом наткнулся на это: https://docs.microsoft.com/ru-ru/visualstudio/debugger/navigating-through-code-with-the-debugger?view=vs-2019 ... там в конце темы показано что в VS можно отлаживать и исходники. Пытался найти такие же настройки в Atmelstudio... не нашёл. Помогите пожалуйста, есть ли такая возможность в AtmelStudio посмотреть значения констант и переменных в заголовочных файлах?



    • By pedrofan
      Здравствуйте, помогите, пожалуйста, данная программа должна несколько раз инкрементировать введеное с клавиатуры значение, например, если я ввожу 31, то на выходе должно получиться 31 32 33 34, а в протеусе получается вот. Прилагаю код.

      lab_4_1.asm
    • By RIMUS1989i
      Здравствуйте. Затеялся собрать анализатор спектра на светодиодах, 20x20 светодиодов, МК ATMEGA328P. 
      Долго ломал голову, как переключать столбцы без использования МК, дабы его не загружать.И вот что у меня получилось. Набросал тестовую прошивку для теста в протеусе. 
      При инилизации подается импульс на вторую ножку U4a, и на предпоследнем столбце.
      Думал сетку сделать на 5 сдвиговых регистрах (как раз 40 сигнальных линий), но боюсь мощности МК не хватит для обработки FFT и вывода на матрицу, будет подвисать.
      Кто что думает по поводу схемы?
      бегущая строка.pdsprj Natali_2012_program.hex
    • By Максим123456789
      делаю диплом, в схеме у меня микроконтроллер PIC16F688 и мне нужно его заменить на ATmega. Не могу найти похожий
    • By Вячеслав_НС
      Здравствуйте ! подскажите , какую лучше библиотеку использовать (и где ее взять) для управления i2c atmega8 в atmel studio 7  .  задача - управлять atmega8 по i2c ,  цап  PCF8591T .
      понимаю , в интернете много примеров и библиотек , но хотелось бы пример максимально простой и точно рабочий . т.к. пока что все мои попытки не привели к успеху ... то Atmel Studio 7 при компиляции ругается на несуществующий файл ( к примеру - "stream.h") при использовании библиотеки i2c , то еще какие то грабли .
×
×
  • Create New...