Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 04.10.2015
Сообщений: 3
1

Ассемблерная путаница

05.08.2016, 17:20. Показов 1109. Ответов 6

Начал изучать по книге ассемблер для авр и параллельно смотрю видео уроки. Так вот делаю обычную мигалку из двух светодиодов, но на разных портах с прерыванием по таймеру. И какого то хрена ничего не работает. Как отладить в Атмел студии тоже не пойму, а протеус тот просто ничего не делает и не говорит почему =))

Мой код:
Кликните здесь для просмотра всего текста

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
.include "m8def.inc"
.def temp = r16
.def sys = r17
.def flag = r18
.org 0
 
rjmp RESET
.org $009
rjmp TIM0_OVF ; Timer0 Overflow Handler
 
RESET:
  ldi temp, high(RAMEND)
  out SPH, temp
  ldi temp, low(RAMEND)
  out SPL, temp
  
  ldi temp, 0xff
  out DDRC, temp
  out DDRD, temp
 
  ldi temp, 0b00000101
  out TCCR0, temp
 
  ldi temp, 0b00000100
  out TIMSK, temp
  out TIFR, temp
 
  ldi temp, 0xF0
  out TCNT0, temp
  ldi sys, 0b00000001
 
sei
Proga:
rjmp Proga
 
TIM0_OVF:
cli
sbrs flag,0
rjmp Led1
rjmp Led2
Vix:
ldi temp, 0xEE
out TCNT0, temp
sei
reti
 
Led1:
ldi sys, 0b00000001
out PortC, sys
ldi sys, 0b00000000
out PortD, sys
rjmp Vix
 
Led2:
cbr flag,0b00000001
ldi sys, 0b00000000
out PortC, sys
ldi sys, 0b00000001
out PortD, sys
rjmp Vix
0

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

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.08.2016, 17:20
Ответы с готовыми решениями:

Путаница с адресами
Здравствуйте. Раньше, я так понял, на "голубом фоне" (Изображение) отображались адреса памяти...

Ассемблерная вставка в С++ через макрос define
Здравствуйте. Попался мне код. Скомпилил, собрал девайс, работает. Не сталкивался раньше с...

путаница с ОС
Совсем запутался весь. Помогите решить проблему. Значит стояла 7, решил установить себе еще XP, на...

Путаница в цикле
Добрый вечер. Есть xml (приблизительно): <root> <root1> ... <subroot1>text</subroot1> ......

6
152 / 119 / 11
Регистрация: 16.08.2013
Сообщений: 576
05.08.2016, 20:57 2
У вас не работают прерывания.
Во вложении настроенный проект, нажмите паузу и увидите о чем речь.
0
Вложения
Тип файла: zip TestProg.zip (20.7 Кб, 2 просмотров)
152 / 119 / 11
Регистрация: 16.08.2013
Сообщений: 576
05.08.2016, 22:57 3
Лучший ответ Сообщение было отмечено Mumba13 как решение

Решение

это не правильно
Assembler
1
2
3
  ldi temp, 0b00000100
  out TIMSK, temp
  out TIFR, temp
Нужно так:
Assembler
1
2
3
  ldi temp, 1<<TOIE0
  out TIMSK, temp
  out TIFR, temp
стр 72
http://www.atmel.com/images/at... asheet.pdf
1
0 / 0 / 0
Регистрация: 04.10.2015
Сообщений: 3
05.08.2016, 23:30  [ТС] 4
Благодарю, все заработало. Косяк еще был в реализации алгоритма мигания.

Добавлено через 1 минуту
Если кому интересно будет выкладываю полный код. Принимаю адекватную критику.
Кликните здесь для просмотра всего текста

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
.include "m8def.inc"
.def temp = r16
.def sys = r17
.def flag = r18
.org 0
 
rjmp RESET
.org $009
rjmp TIM0_OVF ; Timer0 Overflow Handler
 
RESET:
  ldi temp, high(RAMEND)
  out SPH, temp
  ldi temp, low(RAMEND)
  out SPL, temp
  
  ldi temp, 0xff
  out DDRC, temp
  out DDRD, temp
 
  
 
  ldi temp, (1<<TOIE0)
  out TIMSK, temp
  out TIFR, temp
 
  ldi temp, 0xFF
  out TCNT0, temp
  ldi sys, 0b00000001
 
  ldi temp, 0b00000101
  out TCCR0, temp
 
sei
Proga:
rjmp Proga
 
TIM0_OVF:
cli
sbrs flag, 0
rjmp Led1
cbr flag, 0b00000001
cbi PortD, 0
sbi PortC, 0
rjmp Vix
 
Vix:
ldi temp, 0xFF
out TCNT0, temp
sei
reti
 
Led1:
sbr flag, 0b00000001
cbi PortC, 0
sbi PortD, 0
rjmp Vix
0
152 / 119 / 11
Регистрация: 16.08.2013
Сообщений: 576
05.08.2016, 23:49 5
Вам нужно еще почитать про оформление программного кода..., а то не красиво оформлено
Если конечно собираетесь в этой сфере двигаться дальше )
0
0 / 0 / 0
Регистрация: 04.10.2015
Сообщений: 3
06.08.2016, 14:01  [ТС] 6
Спасибо, почитаю. Просто на начальных стадиях не особо над этим думаешь, лиж бы заработало. Хотя с другой стороны если сразу все структурировать и все расположить на своих местах то искать ошибки будет легче =)

Добавлено через 5 часов 52 минуты
Ух и беда с таймерами у меня. Решил перепроверить себя и написать программку простейшей мигалки светодиода. Пол дня уже убил, а ничего так и не работает в протеусе.

Это код:
Кликните здесь для просмотра всего текста

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
.include "m8def.inc"
.def temp = r16
.def count = r17
.org 0
 
rjmp RESET
.org $009 
rjmp TIM0_OVF ; Timer0 Overflow Handler
 
RESET:
ldi temp, high(RAMEND)
out SPH, temp
ldi temp, low(RAMEND)
out SPL, temp
 
ldi temp, 0b00000001
out DDRD, temp
 
ldi temp, (1<<TOIE0)
out TIMSK, temp         ;Разрешаем прерывание по переполнению
ldi temp, (1<<TOV0)
out TIFR, temp          ;Вызываем прерывание по переполнению
 
ldi temp, 0xF0          ;Устанавливаем значение счетного регистра
out TCNT0, temp
 
ldi temp, 0b00000101    ;Настраиваем предделить на 1/1024
out TCCR0, temp
sei
 
Prog:
rjmp Prog
 
TIM0_OVF:               ;Код прерывания
cli                     ;Запрещаем прерывания
sbis PIND, 0            ;Если бит в 0 пине установлен, то выключаем иначе идем на метку vkl
rjmp On
cbi PIND, 0
inc count
rjmp Cont               
 
Cont:
ldi temp, 0xEE
out TCNT0, temp
sei
reti
 
On:
sbi PIND, 0             ;Устанавливаем бит в 0 пин
rjmp Cont
0
152 / 119 / 11
Регистрация: 16.08.2013
Сообщений: 576
06.08.2016, 17:40 7
Смотрите
0
Вложения
Тип файла: zip TestProg.zip (47.9 Кб, 3 просмотров)
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.08.2016, 17:40

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

Путаница с break
if Form1.IdPOP31.Connected then begin MessageCount :=Form1.idPOP31.CheckMessages; ...

Путаница в новостях
При переходе по ссылке Владислав Сурков из новостей появляется очень необычное описание:...

Путаница с weak_ptr
Есть класс Сущности и класс Компонента, необходимо сделать так, чтобы у каждой сущности были свои...

Путаница с указателями
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #define LEN 100 void new_line(char (**line), int n) {...

Путаница в кавычках
while($rows = mysql_fetch_array($result)) { $i=$i+1; echo '&lt;input type=&quot;checkbox&quot;...

Путаница в массиве
setlocale(LC_ALL, &quot;Russian&quot;); const int B = 11; int A; int index(-1); int count; cout &lt;&lt;...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.