Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.10.2019, 22:29   #1
klark.charlz
 
Регистрация: 28.10.2018
Сообщений: 4
По умолчанию Assembler и С - Задание "бегущий огонек" на 8 светодиодах, когда кнопка отжата бежит в одну сторону, когда нажата в другую.

Здравствуйте.
Помогите новичку пожалуйста.
Занимаюсь по учебнику Белова.
Задание "бегущий огонек" на 8 светодиодах, когда кнопка отжата бежит в одну сторону, когда нажата в другую.
Схема во вложении.(+ питание подключено к мк).
Вот код на ассемблере
Код:
1 .include "tn2313def.inc" ; Присоединение файла описаний 
2 .list ; Включение листинга
3 .def temp = R16 ; Определение главного рабочего регистра
4 .def loop1 = R17 ; Определение первого регистра организации цикла
5 .def loop2 = R18 ; Определение второго регистра организации цикла
6 .def loop3 = R19 ; Определение третьего регистра организации цикла
7 .def rab = R20 ; Определение рабочего регистра для команд сдвига
8 .cseg ; Выбор сегмента программного кода 9 .org 0 ; 
10 ldi temp, RAMEND ; Выбор адреса вершины стека
11 out SPL, temp ; Запись его в регистр стека
-------------------------- Инициализация портов ВВ
12 ldi temp, 0 ; Записываем ноль в регистр temp 
13 out DDRD, temp ; Записываем этот ноль в DDRD (порт PD на ввод)
14 ldi temp, 0xFF ; Записываем число $FF в регистр temp
15 out DDRB, temp ; Записываем temp в DDRB (порт PB на вывод) 
16 out PORTB, temp ; Записываем temp в PORTB (потушить светодиод) 
17 out PORTD, temp ; Записываем temp в PORTD (включаем внутр.резист.)
--------------------------- Инициализация компаратора
18 ldi temp, 0x80 ; Выключение компаратора 
19 out ACSR, temp
-------------------------- Начало основного цикла
20 main: in temp, PIND ; Читаем содержимое порта PD
21 sbrc temp, 0 ; Проверка младшего разряда 
22 rjmp m3 ; Если не ноль, переходим к метке m3
------------------------- Сдвиг вправо
23 m1: ldi rab, 0b10000000 ; Запись начального значения
24 m2: ldi temp, 0xFF
25 eor temp, rab ; Инверсия содержимого регистра rab 
26 out PORTB, temp ; Вывод текущего значения в порт PB 
27 rcall wait1 ; Задержка 
28 lsr rab ; Сдвиг содержимого рабочего регистра 
29 brcc m2 ; Если не дошло до конца регистра продолжить 
30 rjmp main ; На начало
;------------------------- Сдвиг влево
31 m3: ldi rab, 0b00000001 ; Запись начального значения
32 m4: ldi temp, 0xFF
33 eor temp, rab ; Инверсия содержимого регистра rab 
34 out PORTB, temp ; Вывод текущего значения в порт PB 
35 rcall wait1 ; Задержка 
36 lsl rab ; Сдвиг содержимого рабочего регистра 
37 brcc m4 ; Если не дошло до конца регистра продолжить 
38 rjmp main ; На начало
;--------------------------------- Подпрограмма задержки
39 wait1: push loop1 ; Сохраняем содержимое регистра loop1
40 push loop2 ; Сохраняем содержимое регистра loop2
41 push loop3 ; Сохраняем содержимое регистра loop3
42 ldi loop3, 15 ; Помещаем в loop3 константу задержки
43 wt1: dec loop3 ; Уменьшаем значение регистра loop3
44 breq wt4
45 ldi loop2, 100 ; Помещаем в loop2 константу задержки
46 wt2: dec loop2 ; Уменьшаем значение регистра loop2
47 breq wt1 48 ldi loop1, 255 ; Помещаем в loop1 константу задержки
49 wt3: dec loop1 ; Уменьшаем значение регистра loop1
50 brne wt3 ; Если не ноль, продолжаем цикл
51 rjmp wt2
52 wt4: pop loop3 ; Восстанавливаем значение регистра loop3
53 pop loop2 ; Восстанавливаем значение регистра loop2
54 pop loop1 ; Восстанавливаем значение регистра loop1
55 ret ; Выход из подпрограммы
Вот на си.
Код:
1 #include <tiny2313.h>
2 #include <delay.h>
3 void main(void)
{
4 unsigned char rab; // Вводим переменную rab
5 PORTB=0xFF; // Инициализация порта B
6 DDRB=0xFF;
7 PORTD=0x7F; // Инициализация порта D
8 DDRD=0x00;
9 ACSR=0x80; // Инициализация аналогового компаратора
10 while (1)
{
11 if (PIND.0==1) // Проверка состояния переключателя
{ // Сдвиг вправо
12 rab = 0b10000000; // Запись начального значения
13 while (rab!=0)
{
14 PORTB=rab^0xFF; // Запись в порт с инверсией
15 rab = rab >> 1; // Сдвиг разрядов
16 delay_ms (200); // Задержка в 200 мсек
}
}
17 else
{ // Сдвиг влево
18 rab = 0b00000001; // Запись начального значения
19 while (rab!=0)
{
20 PORTB=rab^0xFF; // Запись в порт с инверсией
21 rab = rab << 1; // Сдвиг разрядов
22 delay_ms (200); // Задержка в 200 мсек
}
}
};
}
Теперь собственно сам вопрос.
Когда загружаешь эти коды в мк attiny2313 светодиоды работают по разному. На ассемблере бегают слева на право когда кнопка отжата, а когда нажата справа налево. На си же наооборот, когда кнопка отжата справа налево, а когда нажата слева направо.
Или же по другому, пока кнопка отжата, на порту Д у нас считывается 1 на ассемблере 1 бежит с 0 по 7 бит порта Б, а на си 1 перемещается с 7 бита на 0.
Скажите пожалуйста почему работает по разному?
Изображения
Тип файла: png 111.PNG (82.1 Кб, 47 просмотров)
klark.charlz вне форума Ответить с цитированием
Старый 15.10.2019, 12:15   #2
Desc
Участник клуба
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 1,063
По умолчанию

Так у Вас так и в коде, плюс весь код с комментариями.
Листинг Си
Кнопка отжата, начинаем с
Код:
rab = 0b10000000;
иначе, начинаем с
Код:
rab = 0b00000001;
В ASM всё инверсно
Кнопка отжата условие
Код:
sbrc temp, 0 ;
не выполняется, тогда
Код:
rjmp m3 ;
и переходим к 31-ой строке
Код:
m3: ldi rab, 0b00000001
иначе, пропускаем строку 22 и переходим к строке 23
Код:
m1: ldi rab, 0b10000000
I am not a wizard, I am just learning.

Последний раз редактировалось Desc; 15.10.2019 в 12:17.
Desc вне форума Ответить с цитированием
Старый 15.10.2019, 18:14   #3
klark.charlz
 
Регистрация: 28.10.2018
Сообщений: 4
По умолчанию

Вот блин спасибо, запутался просто в этих sbrc и sbrs, всё путаю.
klark.charlz вне форума Ответить с цитированием
Старый 15.10.2019, 22:25   #4
Desc
Участник клуба
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 1,063
По умолчанию

И Вам пожалуйста.
Темы, относительно микроконтроллеров, лучше открывать в разделе Микроконтроллеры, робототехника, схемотехника, 3D принтеры.
В этом разделе ASM как бы без железок
I am not a wizard, I am just learning.
Desc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему когда я вешаю запрос на форму, то в ответ приходит error, а когда на див, то success? Sentim JavaScript, Ajax 2 13.05.2017 09:03
Когда-то программировал. Ушел в другую сферу. Хочу вернуться. Нужен совет. kleem Свободное общение 22 12.10.2015 17:50
Как прервать цикл, когда нажата кнопка какая-нибудь? Karyuudo Общие вопросы Delphi 1 12.04.2010 18:52
Как определить когда нажата кнопка мыши, если она нажата в совсем другой программе? Iceman Общие вопросы Delphi 2 19.10.2009 19:03
Как узнать когда браузер скачивает, а когда нет? iPod Работа с сетью в Delphi 1 07.05.2007 15:16