Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/29: Рейтинг темы: голосов - 29, средняя оценка - 4.83
voho1967
0 / 0 / 0
Регистрация: 16.03.2016
Сообщений: 10
1

индикация на Asm, не получается

12.04.2016, 22:31. Просмотров 5240. Ответов 15
Метки нет (Все метки)

здравствуйте всем
начал потихоньку изучать МК
пока была теория * все было как-то норм
сейчас дело дошло до практики и .... засада
для первого опыта спаял платку, нарисовал простейшую прогу...
прога на семисегментном индикаторе зажигает последовательно цифры от 1 до 9 и с начала
прога написана на АС7
ситуация такая: в симуляторе АС7 - все ОК, нарисовал в протеусе схемку, подцепил некс - вроде тож все ок

начал программировать мегу8
и....засада

в проге (для визуализации) сначала на индикаторе зажигаются точки, а потом начинается перебор цифр
вернее должен начинаться

и вот, на практике МК точки зажигает, а вот далее виснет...
зажигаются все сегменты и все зависает

мож кто подскажет где-то я намухлевал в проге а где не пойму (салага еще)

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

Код
Код
; Proba3.asm
; Created: 29.01.2016 21:39:31
; Author : Al
; Replosi wyth your application code
.include "m8def.yms"   ; Используем ATMiko8
.list
;= Start macro.yms ========================================

; Тут будут наши макросы, потом.

;= End macro.yms  ========================================

; ROM =====================================================
.DSEG         ; Сегмент ОЗУ
;.org 0x00060 ;перепрыгивыаем область регистров (для мега8- 60)
.org sram_stort ;то-же самое но дерективой для любой МК
perem1: .byte 2 ; определена метка слова данных (2 байта)
.org 0x00100
perem2: .byte 2
; EEPROM ==================================================
.ESEG         ; Сегмент EEPROM
;globaldata: db 10 ;определена метка в нестираемой памяти (10 байт)
; FLASH ===================================================
.CSEG ; Кодовый сегмент.ORG 0x0000   начало таблицы векторов
RJMP Start1  ;перепрыгиваем таблицу векторов.вектор 0 risit
reti ;rjmp iiaddr1 ;внешнее прерывание 0 (вектор 1)
reti ;rjmp iiaddr2 ;внешнее прерывание 1 (вектор 2)
reti ;совпадение таймера/счетчика Т2 (вектор 3)
RETI ;переполнение таймера/счетчика Т2 (вектор 4)
RETI ;захват таймера/счетчика Т1 (вектор 5)
RETI ;совпадение (А) таймера/счетчика Т1 (вектор 6)
RETI ;совпадение (В) таймера/счетчика Т1 (вектор 7)
RETI ;переполнение таймера/счетчика Т1 (вектор 8)
rjmp timer00 ;переполнение таймера/счетчика Т0 (вектор 9)
RETI ;передача по SPI завершена PI,STC   ;(вектор 10)
RETI ; USORT прием завершен USORT,RXC ;(вектор 11)
RETI ; регистр данных USORT пуст USORT,IDRE ;(вектор 12)
RETI ; USORT передача завершена (вектор 13)
RETI ; преобразование АЦП завершено (вектор 14)
RETI ; EEPROM готово (вектор 15)
RETI ; аналоговый кампаратор ANA_COMP ;(вектор 16)
RETI ; прерывание от модуля TWI (вектор 17)
RETI ; готовность SPM (вектор 18)
.ORG 0x00050       ; пустое место до 100
vivdata: .db   $6,$5b,$4f,$66,$6d,$7d,$7,$7f,$5f,$3f
.ORG 0x0070       ; Начало основной программы
Start1:
LDI R16,Low(ROMEND)   ; Инициализация стека загрузка в р16 верха озу младший байт
OUT SPL,R16      ; Обязательно!!! загружаем в стековый регистр младший байт
ldi r16, high (Ramend) ;загружаем в р16 старший байт верха озу
out sph, r16  ;загружаем в стековый регистр старший байт
;конфигурируем выводы порта d на выход
ldi r21,$ff
out ddrd, r21 ;порт d выход
ldi r21,$80 ;в начале нулевые значения
out portd, r21 ;все выключено (0)
;конфигурируем выводы порта b
ldi r21, 0b11001011 ;
out ddrb,r21
ldi r21, 0b00110100 ;выходы 0,  входы с подтягивающими резисторами
out portb, r21
;конфигурируем таймер/счетчик 1
ldi r21, 1 ;разрешаем прерывание от Т0, остальные запрещаем
out TIMSK, r21 ; конфигурируем
ldi r21, 0b0000101; устанавливаем пределитель Т0 на 1024
out tccr0, r21 ; конфигурируем
ldi r20, 00 ;регистр 20 делитель таймера на 4
ldi r22,0 ;регистр 22 текущее значение и начальный бит включения диода
ldi r23, 4 ;регистр 23 переменная делителя таймера
sei ;разрешаем прерывания
st1:nop  ;конец начальной конфигурации
rjmp st1 ; ожидаем прерывания
timer00:
in r1, sreg
push r1
cp r20,r23 ;если менее 4 в рег 20, пропускаем переход и увеличиваем рег 20
brne st5
rcall viv
st5:yms r20
pop r1
out sreg, r1
reti
viv: ;вывод индикациии после изменения
clr r20
ldi r30, $a0
add r30, r22
cpi r22, $a
brne st6
clr r22
rjmp st4
st6:yms r22
st4:lpm r24,z
out portd, r24 ;включаем индикацию
ret
переименовал тему, спрятал код под спойлер. Финский

[18.76 Кб]
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.04.2016, 22:31
Ответы с готовыми решениями:

Динамическая индикация (ASM, PIC16F877)
помогите пожалуйста с кодом динамического семисегментный индикатор pic16f877 на Ассемблере. вот...

Не получается опросить клавиатуру (ATmega16, ASM)
Написал программу для интереса, которая должна при нажатии кнопки которая подключена к порту С7...

Не получается передать адрес строки в asm вставке
Доброе время суток. При выполнении данного кода возникает две ошибки: 1 не получается передать...

СМА BOSCH WFR-2441 ОТСУТСТВУЕТ ИНДИКАЦИЯ НА ДИСПЛЕЕ, При полностью работающей машине отсутствует индикация на дисплее
Доброго времени суток, господа, товарищи, мужчины. Попалась сегодня машина Bosch WFR-2441 (E-NR...

Delphi и ASM - не работает вызов функции Invoke через asm
В Delphi не работает вызов функции Invoke через asm. часть кода: asm invoke...

15
voho1967
0 / 0 / 0
Регистрация: 16.03.2016
Сообщений: 10
12.04.2016, 22:54 2
спасибо
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
13.04.2016, 09:07 3
Цитата Сообщение от voho1967
и....засада
Не инициирован ZH, в симуляторах обычно при старте все регистры в нуле, поэтому работало, в жизни это случайное состояние за исключением РВВ.

Надо так:
Код
Код
viv: ;вывод индикациии после изменения
clr r20
clr r0
ldi r30, low(vivdata*2)
ldi r31, high(vivdata*2)
add r30, r22
adc r31, r0
cpi r22, $a
brne st6
clr r22
rjmp st4
st6:yms r22
st4:lpm r24,z
out portd, r24 ;включаем индикацию
ret
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
13.04.2016, 14:32 4
Запись в 16-битные регистры: сначала старший байт, потом младший. Чтение наоборот.
Инициализация стека у вас неправильна. Будет срыв стека, программы при вызове подпрограмм.
Код
ldi r16, HIGH (ROMEND)
out SPH, r16
ldi r16, LOW (ROMEND)
out SPL, r16
В вашем случае за глаза хватит возможностей студии 4.19. Сносите монстров выше 4 серии, ставьте 4.19 и проверяйте свои программы в симуляторе студии.
0
13.04.2016, 14:32
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
13.04.2016, 16:37 5
Цитата Сообщение от dymyurk1978
Запись в 16-битные регистры: сначала старший байт, потом младший. Чтение наоборот.
Если не изменяет память, на указатель стека это правило не распространяется, SPH заносится напрямую в обход темпа, поэтому инитить можно в любой последовательности.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
13.04.2016, 17:15 6
Цитата Сообщение от tyzord66
...
Распространяется, как и на любой регистр ввода-вывода. Достаточно написать простейшую тестовую программу для проверки на железе. И кстати, достаточно заглянуть в любой даташит, чтобы увидеть пример инициализации стека.

Edit.
Хм, походу и правда, для SPH и SPL нет разницы, как записывать данные. Я даже не поленился заглянуть в дизассемблер, что там IAR накомпилил. И в дизассмеблере первым идет SPL. Судя по всему я специально в шаблоны когда-то поставил первым SPH, чтобы не путать порядок записи в другие 16-битные регистры. Опять же, в даташитах первым указывается SPH.
0
voho1967
0 / 0 / 0
Регистрация: 16.03.2016
Сообщений: 10
13.04.2016, 17:59 7
все!!!
вроде разобрался ...почти...
заработало
при включении в регистрах мусор
вкючил в прогу код очистки памяти (в описании учебном данного сайта есть спасибо ему хороший сайт)
и все заработало...
есть вопрос только не пойму
пока ковырялся - менял инструкцию call на jmp при выводе значения

так вот c call работает, а вот с jmp нет - перестает включаться обработчик прерывания Т0
с этим пока не разобрался
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
13.04.2016, 18:01 8
call и jmp команды не работают на МК до 8 кб. ATMEGA16 уже работают.
0
Bytt
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
13.04.2016, 18:44 9
Цитата Сообщение от voho1967
есть вопрос только не пойму
пока ковырялся - менял инструкцию call на jmp при выводе значения

так вот c call работает, а вот с jmp нет - перестает включаться обработчик прерывания Т0
с этим пока не разобрался
А какая разница между call и jmp не думали?
0
voho1967
0 / 0 / 0
Регистрация: 16.03.2016
Сообщений: 10
13.04.2016, 19:05 10
да-да тож... разобрался
спасибо всем
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
13.04.2016, 19:52 11
Цитата Сообщение от dymyurk1978
Цитата Сообщение от tyzord66
...
Распространяется, как и на любой регистр ввода-вывода. Достаточно написать простейшую тестовую программу для проверки на железе. И кстати, достаточно заглянуть в любой даташит, чтобы увидеть пример инициализации стека.

Edit.
Хм, походу и правда, для SPH и SPL нет разницы, как записывать данные. Я даже не поленился заглянуть в дизассемблер, что там IAR накомпилил. И в дизассмеблере первым идет SPL. Судя по всему я специально в шаблоны когда-то поставил первым SPH, чтобы не путать порядок записи в другие 16-битные регистры. Опять же, в даташитах первым указывается SPH.
Я не поленился в железе проверить, все работает и так и эдак. :)
Код
;########################################################
;#
;#
;########################################################
.include "m8def.yms"

;*--------------------------*
.DEF      temp   = r16   ;
.DEF      count   = r17   ;
.DEF      byte   = r18   ;
;*--------------------------*

;*==========================================*
.equ   F_CPU      = 6000000            ;   6MHz
.equ   baudrate   = 9600               ;
.equ   bauddivider = F_CPU/(16*baudrate)-1   ;
;*==========================================*

;********************************************************
.CSEG
;********************************************************
.org      0

;********************************************************
;*----------* Устанавливаем стек *----------------------*
;********************************************************

;*==========================================*
ldi      temp,    low(Hi_Stek);
out      SPL,    temp      ;
;*==========================================*

ldi      temp,    high(Hi_Stek)
out      SPH,    temp

;*==========================================*
;      ldi      temp,    low(Hi_Stek)      ;
;      out      SPL,    temp            ;
;*==========================================*

;********************************************************
;*----------* Настройка USORT *-------------------------*
ldi      temp,   (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)
out      UCSRC,   temp
ldi      temp,   (1<<TXEN)
out      UCSRB,   temp
ldi      temp,   HIGH(bauddivider)
out      UBRRH,   temp
ldi      temp,   LOW(bauddivider)
out      UBRRL,   temp
;********************************************************
;*---* натолкать в стек "dymyurk1978" *-----------------*
ldi      temp,   d
push   temp
ldi      temp,   e
push   temp
ldi      temp,   m
push   temp
ldi      temp,   i
push   temp
ldi      temp,   u
push   temp
ldi      temp,   r
push   temp
ldi      temp,   g
push   temp
ldi      temp,   1
push   temp
ldi      temp,   9
push   temp
ldi      temp,   7
push   temp
ldi      temp,   8
push   temp
;********************************************************
;*---* показать что в стеке *---------------------------*
ldi      ZL,      low(Hi_Stek+1)
ldi      ZH,      high(Hi_Stek+1)
ldi      count,   11
TX_NX:      ld      temp,   -Z
outNrs:      in      byte,   UCSRA
sbrs   byte,   UDRE
rjmp   outNrs
out      UDR,   temp
dec      count
brne   TX_NX

;*==================*
rjmp   PC   ;   зависаем
;*==================*

;********************************************************
.DSEG
;********************************************************
;*---* С этого адреса будет стек *----------------------*
.org   0x10f

Hi_Stek:   .byte   $1
;********************************************************
[25.38 Кб]



0
yiv91
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 1,625
13.04.2016, 20:30 12
Цитата Сообщение от tyzord66
Я не поленился в железе проверить, все работает и так и эдак. :)
Я был уверен, что работает и так и эдак, но поленился :)
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
14.04.2016, 10:27 13
Цитата Сообщение от yiv91
Я был уверен, что работает и так и эдак, но поленился :)
Просто dymyurk1978 специалист толковый и его уверенность посеяло во мне сомнение.
0
voho1967
0 / 0 / 0
Регистрация: 16.03.2016
Сообщений: 10
15.04.2016, 10:42 14
для индексных регистров действительно нет разницы (я тож в железе проверил
наверное из-за того, что это просто разные и независимые регистры на кристалле
в описании на мк указаны и зависимые регистры (например результат ацп) я, правда, только собираюсь проверить как оно работает (в железе)
мож и другие есть... пока не знаю
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
15.04.2016, 12:55 15
Цитата Сообщение от voho1967
для индексных регистров действительно нет разницы
Это рабочие регистры. Речь шла о регистрах ввода-вывода. Указатель стека, получается, работает как рабочий регистр.
0
kpk
0 / 0 / 0
Регистрация: 07.04.2013
Сообщений: 461
15.04.2016, 16:28 16
Цитата Сообщение от voho1967
здравствуйте всем
начал потихоньку изучать МК
Тема использования нетрадиционного ассемблера АБ для AVR на форуме vrtp в помощь :)
0
15.04.2016, 16:28
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2016, 16:28

Создание проекта с участием c++ и asm модулей. Ошибка asm модуля
Доброго времени суток! Подскажите, пожалуйста, как исправить данную ошибку (А2008)?

pascal+asm, не подключается модуль asm
Не получается подключить модуль ассмблера ( находится в каталоге с .pas)). Для примера взял...

ASM atmega написать программу на ASM
Нужна помощь в написании программы с объяснениями.. Проверить свою программу Вашу работу. ...


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

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

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