Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/90: Рейтинг темы: голосов - 90, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 22.08.2012
Сообщений: 33
1

Вопросы по командам Асемблера

06.10.2012, 11:20. Показов 17008. Ответов 73
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет, возник вопрос по командам. Учусь по книге Мортона Микроконтроллеры AVR. Вводный курс. Программа В. есть команда sbic и есть команда sbis. sbic пропускает последующую команду если бит сброшен, команда sbis пропускает если бит выставлен, но в программе бит выставлен означает что на вход подано напряжение НИЗКОГО уровня. Низкий уровень напряжения это я так понимаю 0? Тогда сброшенный бит и напряжение низкого уровня не одно и то же?оО Может объясним мне кто-то, что-то я недопонимаю.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.10.2012, 11:20
Ответы с готовыми решениями:

БД: Контрольные вопросы по дисциплинам, темам и разделам: дисциплина; преподаватели; набор билетов; билет; вопросы к билетам; вопросы; темы вопросов
добрый день! нужна база данных на тему "Контрольные вопросы по дисциплинам, темам и разделам:...

Язык Асемблера
Ктото знает где можно найти такойже форум по асемблеру??

Вставки с Асемблера
Хочу спросить, как делать вставки команд с асемблера? например в С пишетса так "asm mov al, 0"

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

C++ С вставкой подпрограммы асемблера
Добрый день. Есть задание написать программу используя ввод и вывод С++, а расчеты выполнить с...

73
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
13.10.2012, 12:46 41
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от OKKRO
Код:
TimeLoop:
out TCNT0,temp ; переносим значение из таймера в регистр

Чтоб прочитать значение счетного регистра надо сделать «IN temp, TCNT0». В Вашем случае происходит все наоборот.
0
0 / 0 / 0
Регистрация: 22.08.2012
Сообщений: 33
13.10.2012, 12:51 42
Там по программа из таймера надо в регистр, кстати в программе так написано. В учебнике не было только сказно куда этот фрагмент который я выше приводил поместить и + я не знаю правильно ли конфигурацию таймера написал:
Код
ldi  temp,0b00000101
out  TCCR0,temp
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
13.10.2012, 14:14 43
Начиная с этого момента научитесь писать программы без "нигических чисел". Во-первых, вы уже сейчас начинаете путаться в своей же программе. А через месяц, открыв эту программу, вы долго будете вспоминать, "что же я понаписал?!"
У вас кнопа, скажем на порту A, пин PA0.
Пишем:
Код
.equ KNOPA_PORT = PORTA
.equ KNOPA_DDR = DDRA
.equ KNOPA_PIN = PINA

.equ KNOPA = PA0
.equ KNOPA_MASK = 1<<KNOPA

.equ RED_LED_PORT = PORTC
.equ RED_LED_DDR = DDRC
.equ RED_LED_PIN = PINC

.equ RED_LED = PD0
.equ RED_LED_MASK = 1<<RED_LED
Код
// Пусть светодиод подключен по схеме с общим катодом. То есть катод на минус питания,
// подавая на анод плюс (лог. 1, то есть активный сигнал 1), мы включаем светодиод.
.macro red_tid_on
sbi RED_LED_PORT, RED_LED
.endmacro

.macro red_tid_off
cbi RED_LED_PORT, RED_LED
.endmacro
Код
// Пусть светодиод подключен по схеме с общим анодом. То есть анод на плюс питания, подавая на катод минус (лог. 0, то есть активный сигнал 0), мы включаем светодиод.
.macro red_tid_on
cbi RED_LED_PORT, RED_LED
.endmacro

.macro red_tid_off
sbi RED_LED_PORT, RED_LED
.endmacro
Чтобы включить светодиод, не нужно извращаться, писать что-то типа:
Код
sbi PORTC, 0b00000001
// или:
ldi r16, 0b00000001
// а то и:
// ldi r16, 1
out PORTC, r16
Мы пишем просто:
Код
red_tid_on
// или
red_tid_off
Оба способа - управление включением светодиода комплементарным выходным каскадом. Нагуглите, не буду тратить свое время.

Есть способ управления пинами по схеме с открытым коллектором\стоком. В PORTX, X записываем 0. Дальше мы управляем регистором направления вход\выход DDRX, X. Так как в порту записано значение 0, то при DDRX, X - 0 пин висит в воздухе. Когда мы подадим единицу в DDRX, x, то пин будет настроен как выход и на выходе будет активный низкий уровень. Эти схемы всключения можно использовать для управления светодиодами, включенными по схеме с общим анодом. Также для реализации интерфейсов. Скажем I2C.

Что касается регистров ввода-вывода. Для ATTINY2313 и какого-то регистра будет число 0b10101010. А для ATMEGA8535 будет уже 0b01010101 (от балды, не заостряйте свое внимание). В основном биты регистров ввода-вывода называются одинаково. И чтобы ты при тупом копировании чужой программы не въехал в пень, и не удивлялся, почему не работает, берем даташит на ATTINY2313 и смотрим:
Скажем регистр TCCR0B.
7 6 5 4 3 2 1 0
FOC0A FOC0B – – WGM02 CS02 CS01 CS00
Нам нужно значение делителя 1024.
И пишем не:
Код:ldi r16, 0b00000101
out TCCR0B, r16

а:
Код:ldi r16, 1<<CS02 | 1<<CS00
out TCCR0B, r16

Регистр TIMSK:
Byt 7 6 5 4 3 2 1 0
TOIE1 OCIE1A OCIE1B – ICIE1 OCIE0B TOIE0 OCIE0A
Если вы возьмете пример из примера для другого кристалла и тупо вставите в свою программу, то наверняка будут проблемы. Так как номера битов у разных кристаллов различаются. Поэтому научтесь писать так:
Код:ldi r16, 1<<OCIE1A
OUT TIMSK, R16

Либо чтение\модификация\запись. Это нужно, если вы уже используете другие таймеры. Если вы тупо напишете:
Код:ldi r16, 1<<OCIE1A
OUT TIMSK, R16

То вы отключите прерывания у других таймеров.
Поэтому нужно писать так:
Код:in r16, TIMSK
sbr r16, 1<<OCIE1A
out TIMSK, r16

0
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
13.10.2012, 14:18 44
Цитата Сообщение от OKKRO
Там по программа из таймера надо в регистр, кстати в программе так написано.
Речь о фрагменте с метки «TimeLoop:», где значение счетного регистра таймера сравнивается со значением в «Mark80».
Здесь уже были подобные перлы из какого-то «учебника», похоже тот же источник.
Цитата Сообщение от OKKRO
Код:
ldi temp,0b00000101
out TCCR0,temp
Если бы знать, что Вы хотели. Т0 запущен в NORMAL с прескаллером CLK/1024, OC0 отключен от пина.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
13.10.2012, 14:27 45
Вообще книгу Мортона нужно внимательно читать. Есть косяки у него. Особенно это касается нигических чисел. Очень хорошая книга Вольфганг Трамперт - AVR-RISC микроконтроллеры. Она немного сложнее, но пара Мортон и Трамперт неплохо учат.
0
0 / 0 / 0
Регистрация: 22.08.2012
Сообщений: 33
13.10.2012, 14:41 46
dymyurk1978,Кхм, вы поняли хоть кому это написали?=) я путаюсь в простейшей программе=)Часть из того что вы написали понял. Но решение своей проблемы не нашел. Про макросы немного уловил. Что за команда .equ ? Это СИ чтоли? Но я лучше пока по учебнику попишу, а то автор пишет так, а я по другому. А макросы кстати прикольно, но вот то что вы в первом коде писали не сильно понял. Также уже усвоил из прошлых сообщений что если светодиод подключен катодом к выводу МК то активным для него будет 0. Да и что такое прерывания я не знаю. Я только начал активно эту тему курить.
0
0 / 0 / 0
Регистрация: 22.08.2012
Сообщений: 33
13.10.2012, 14:50 47
tyzord66, как поменял на in, программа стала работать. теперь 2 вопроса: тоесть в книге была опечатка? ведь он целый текст про работу проги написал и везде именно то что написал я упоминал. И в торой задержка по идее должна быть примерно 1с, а на яву гораздо больше
0
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
13.10.2012, 21:50 48
Цитата Сообщение от OKKRO
dymyurk1978,Кхм, вы поняли хоть кому это написали?=) я путаюсь в простейшей программе=)Часть из того что вы написали понял. Но решение своей проблемы не нашел. Про макросы немного уловил. Что за команда .equ ? Это СИ чтоли? Но я лучше пока по учебнику попишу, а то автор пишет так, а я по другому. А макросы кстати прикольно, но вот то что вы в первом коде писали не сильно понял. Также уже усвоил из прошлых сообщений что если светодиод подключен катодом к выводу МК то активным для него будет 0. Да и что такое прерывания я не знаю. Я только начал активно эту тему курить.
Просто dymyurk1978 предлагает услуги ландшафтного дизайнера для ящика с рассадой. :)
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
13.10.2012, 22:32 49
Цитата Сообщение от tyzord66
Цитата Сообщение от OKKRO
dymyurk1978,Кхм, вы поняли хоть кому это написали?=) я путаюсь в простейшей программе=)Часть из того что вы написали понял. Но решение своей проблемы не нашел. Про макросы немного уловил. Что за команда .equ ? Это СИ чтоли? Но я лучше пока по учебнику попишу, а то автор пишет так, а я по другому. А макросы кстати прикольно, но вот то что вы в первом коде писали не сильно понял. Также уже усвоил из прошлых сообщений что если светодиод подключен катодом к выводу МК то активным для него будет 0. Да и что такое прерывания я не знаю. Я только начал активно эту тему курить.
Просто dymyurk1978 предлагает услуги ландшафтного дизайнера для ящика с рассадой. :)
Смех смехом, я лучше потрачу сейчас время на ландшафт, зато потом не буду тратить лишнее время, разбираясь, где какой бит, как это работает, что что означает. Возьму практически любой кусок своих программ и легко и непринужденно буду использовать под любой кристалл. Хоть весь проект. Был на тиньке, беру и использую на мегу. И наоборот. Используя простейший переключатель:
//------------------------------------------------------------------------
#define TINY 0
#define MEGA 1
//------------------------------------------------------------------------

//------------------------------------------------------------------------
#define WORK 0
#define DEBUG 1
//========================================================================

//========================================================================
#define PROJECT DEBUG

#define CPU_TYPE MEGA

#define WATCH_DOG NO_CHANGE

#define EEPROM YES
//========================================================================
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
13.10.2012, 22:37 50
Вот пример. Определения подпрограммы обработки кнопок:
Код
/************************************************************************/

;=========================================================================

;=========================================================================
.equ   KEYS_PIN            = PINA
.equ   KEYS_DDR            = DDRA
.equ   KEYS_PORT            = PORTA
;=========================================================================
.equ   KEYS_DDR_HEAT_ON_OFF   = DDRA
.equ   KEYS_DDR_PUMP_UP      = DDRA
.equ   KEYS_DDR_PUMP_DOWN      = DDRA
.equ   KEYS_DDR_FAN_UP         = DDRA
.equ   KEYS_DDR_FAM_DOWN      = DDRA
;-------------------------------------------------------------------------
.equ   KEYS_PORT_HEAT_ON_OFF   = PORTA
.equ   KEYS_PORT_PUMP_UP      = PORTA
.equ   KEYS_PORT_PUMP_DOWN      = PORTA
.equ   KEYS_PORT_FAN_UP      = PORTA
.equ   KEYS_PORT_FAM_DOWN      = PORTA
;-------------------------------------------------------------------------
.equ   KEYS_PIN_HEAT_ON_OFF   = PINA
.equ   KEYS_PIN_PUMP_UP      = PINA
.equ   KEYS_PIN_PUMP_DOWN      = PINA
.equ   KEYS_PIN_FAN_UP         = PINA
.equ   KEYS_PIN_FAM_DOWN      = PINA
;=========================================================================

;=========================================================================
.equ   BIT_HEAT_ON_OFF         = 1<<KEY_HEAT_ON_OFF
.equ   BIT_PUMP_UP            = 1<<KEY_PUMP_UP
.equ   BIT_PUMP_DOWN         = 1<<KEY_PUMP_DOWN
.equ   BIT_FAN_UP            = 1<<KEY_FAN_UP
.equ   BIT_FAM_DOWN         = 1<<KEY_FAM_DOWN
;=========================================================================

;=========================================================================
.equ   KEYS_Mask            = BIT_HEAT_ON_OFF+BIT_PUMP_UP+BIT_PUMP_DOWN+BIT_FAN_UP+BIT_FAM_DOWN
;=========================================================================

;=========================================================================
;------------------------------- Eiau eiiiie -----------------------------
.equ   KEY_HEAT_ON_OFF         = 0
.equ   KEY_PUMP_UP            = 1
.equ   KEY_PUMP_DOWN         = 2
.equ   KEY_FAN_UP            = 3
.equ   KEY_FAM_DOWN         = 4
;=========================================================================
Мне не нужно в следующий раз разбираться, что где.
0
0 / 0 / 0
Регистрация: 19.09.2010
Сообщений: 1,761
13.10.2012, 22:48 51
dymyurk1978, подход правильный во всех отношениях (сам так делаю), тут о том, что ТСу до этого как до Китая... :)
0
0 / 0 / 0
Регистрация: 21.10.2011
Сообщений: 1,860
13.10.2012, 23:01 52
Цитата Сообщение от dymyurk1978
Был на тиньке, беру и использую на мегу. И наоборот. Используя простейший переключатель:
//------------------------------------------------------------------------
#define TINY 0
#define MEGA 1
//------------------------------------------------------------------------

//------------------------------------------------------------------------
#define WORK 0
#define DEBUG 1
//========================================================================

//========================================================================
#define PROJECT DEBUG

#define CPU_TYPE MEGA

#define WATCH_DOG NO_CHANGE

#define EEPROM YES
//========================================================================
можно ведь
Код
#if defined(__AVR_ATmego32__)
#include "hw_m32.h"
#elif defined(__AVR_ATtiny45__)
#include "hw_t45.h"
но это винавр. или асм такой (подобный) дефайн не предоставляет?
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
13.10.2012, 23:17 53
Цитата Сообщение от tid_fom
можно ведь
Код:
#if defined(__AVR_ATmego32__)
#include "hw_m32.h"
#elif defined(__AVR_ATtiny45__)
#include "hw_t45.h"
но это винавр. или асм такой (подобный) дефайн не предоставляет?

Дело не в том, какой инклюд подставить, а в том, что у тини нет команд, которые используются в мегах. На меге кусок программы будет короче. Поэтому пишутся два варианта. Для тини и мега. Компилятор смотрит на дефайн и подставляет нужный вариант. И я не парюсь.
0
0 / 0 / 0
Регистрация: 21.10.2011
Сообщений: 1,860
13.10.2012, 23:33 54
не, я не про инклюд, а про дефайн, обозначающий камень.
его (дефайн) гцц предоставляет.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
13.10.2012, 23:45 55
Цитата Сообщение от tid_fom
не, я не про инклюд, а про дефайн, обозначающий камень.
его (дефайн) гцц предоставляет.
А я говорю, например, про команду mul. В тини эта команда не поддерживается. Поэтому, если у меги это одна строчка:
mul r16, r17
то для тини целый кусок программы.
0
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
14.10.2012, 00:23 56
Цитата Сообщение от dymyurk1978
Смех смехом, я лучше потрачу сейчас время на ландшафт, зато потом не буду тратить лишнее время, разбираясь, где какой бит, как это работает, что что означает. Возьму практически любой кусок своих программ и легко и непринужденно буду использовать под любой кристалл. Хоть весь проект. Был на тиньке, беру и использую на мегу. И наоборот. Используя простейший переключатель:
Я не имею ничего против дефайнов и клуджей и всего остального облегчающего восприятие и написание кода. ТСу на старте лучше было бы обойтись даже без клуджа *.def, подставляя в команды реальные адреса РОН и РВВ, это как минимум научит работать с даташитом, а не с учебниками где…. ну да ладно. У меня сперва были MCS-51 потом PIC, AVR далее надеюсь ARM, везде своя мнемоника флагов. Запоминать их, а тем более их комбинации соответствующие режимам – бестолковое занятие, Вы же не зубрите таблицы Брадиса. Я лично макросами не пользуюсь, они здорово засерают пространство и затрудняют регулировку времени выполнения кода . Все сказанное не для холивара, это ИМХО.
0
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2
14.10.2012, 00:29 57
Мда, ладно уж "волшебные" числа. Но писать вместо названия регистра его адрес? Это явно из области какого-то тонкого мазохизма, не дающего ничего полезного. Так можно дойти, что и ассемлер нах не нужен - можно по таблице сразу НЕХ коды клепать.
0
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
14.10.2012, 00:45 58
Цитата Сообщение от PRS
Мда, ладно уж "волшебные" числа. Но писать вместо названия регистра его адрес? Это явно из области какого-то тонкого мазохизма, не дающего ничего полезного. Так можно дойти, что и ассемлер нах не нужен - можно по таблице сразу НЕХ коды клепать.
Я говорил о первом этапе, после чего не будет путаницы между IN/OUT и куда помещается значение суммы при ADD/ADC.

И по поводу «волшебных чисел». Ведь не важно как прписаны флаги WGMxx и CSxx, все равно ведь полезете в даташит, чтоб определить режим и пересчет прескаллера. Помогать или не помогать зависит исключительно от желания, а не от того какой стиль избрал ТС.
0
0 / 0 / 0
Регистрация: 21.10.2011
Сообщений: 1,860
14.10.2012, 00:47 59
Цитата Сообщение от tyzord66
Помогать или не помогать зависит исключительно от желания, а не от того какой стиль избрал ТС.
ну, видя нечитабельное нечто, желания помогать резко меньше становится...
0
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2
14.10.2012, 00:49 60
Разница как раз большая. Для меня команда ldi R16,0b1101001 вообще не о чем не говорит. И копаться в даташитах, что бы узнать где какой бит живет я точно не буду. Да и пейсателю программы тоже будет понятней что он собственно хотел наваять.
0
14.10.2012, 00:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.10.2012, 00:49
Помогаю со студенческими работами здесь

Перевести код из асемблера в делфи
Всем привет СРОЧНО ПОМОГИТЕ ПЛЗ из ассемблеровского кода в делфи перевести! исходник внизу

Где найти компиляторы асемблера?
Подскажите где в инете можно найти компиляторы на асемблер, м какие лучше.

Работа с циклом на Си++ с использованием вставок асемблера
Несоображаю как это можно сделать с помощью ассемблерных втавок !! ТАк что ХЭЛП Модуль или...

Арифметические команды асемблера (простенькая задача)
Здравствуйте, помогите пожалуйста, нужно составить и отладить программу на языке ассемблера для...

По командам консоли
Ситуация следующая: 2 физ жестких диска, на каждом по 2 основных раздела, на каждом физ диске один...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru