0 / 0 / 0
Регистрация: 22.08.2012
Сообщений: 33
|
|
1 | |
Вопросы по командам Асемблера06.10.2012, 11:20. Показов 17008. Ответов 73
Метки нет (Все метки)
Всем привет, возник вопрос по командам. Учусь по книге Мортона Микроконтроллеры AVR. Вводный курс. Программа В. есть команда sbic и есть команда sbis. sbic пропускает последующую команду если бит сброшен, команда sbis пропускает если бит выставлен, но в программе бит выставлен означает что на вход подано напряжение НИЗКОГО уровня. Низкий уровень напряжения это я так понимаю 0? Тогда сброшенный бит и напряжение низкого уровня не одно и то же?оО Может объясним мне кто-то, что-то я недопонимаю.
0
|
06.10.2012, 11:20 | |
Ответы с готовыми решениями:
73
БД: Контрольные вопросы по дисциплинам, темам и разделам: дисциплина; преподаватели; набор билетов; билет; вопросы к билетам; вопросы; темы вопросов Язык Асемблера Вставки с Асемблера Язык асемблера MIPS C++ С вставкой подпрограммы асемблера |
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
|
|
13.10.2012, 12:46 | 41 |
Сообщение от OKKRO
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
Здесь уже были подобные перлы из какого-то «учебника», похоже тот же источник.
Сообщение от OKKRO
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
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
|
|
13.10.2012, 22:32 | 49 |
Сообщение от tyzord66
Смех смехом, я лучше потрачу сейчас время на ландшафт, зато потом не буду тратить лишнее время, разбираясь, где какой бит, как это работает, что что означает. Возьму практически любой кусок своих программ и легко и непринужденно буду использовать под любой кристалл. Хоть весь проект. Был на тиньке, беру и использую на мегу. И наоборот. Используя простейший переключатель: //------------------------------------------------------------------------ #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
Код
#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
#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 r16, r17 то для тини целый кусок программы.
0
|
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
|
|
14.10.2012, 00:23 | 56 |
Сообщение от dymyurk1978
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
И по поводу «волшебных чисел». Ведь не важно как прписаны флаги 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 | |
14.10.2012, 00:49 | |
Помогаю со студенческими работами здесь
60
Перевести код из асемблера в делфи Где найти компиляторы асемблера? Работа с циклом на Си++ с использованием вставок асемблера Арифметические команды асемблера (простенькая задача) По командам консоли Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |