voho1967
|
|
1 | |
индикация на Asm, не получается12.04.2016, 22:31. Показов 5526. Ответов 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 Кб] |
12.04.2016, 22:31 | |
Ответы с готовыми решениями:
15
Динамическая индикация (ASM, PIC16F877) Не получается опросить клавиатуру (ATmega16, ASM) Не получается передать адрес строки в asm вставке СМА BOSCH WFR-2441 ОТСУТСТВУЕТ ИНДИКАЦИЯ НА ДИСПЛЕЕ, При полностью работающей машине отсутствует индикация на дисплее Delphi и ASM - не работает вызов функции Invoke через asm |
voho1967
|
|
12.04.2016, 22:54 | 2 |
спасибо
|
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
|
|
13.04.2016, 09:07 | 3 |
Сообщение от voho1967
Надо так: Код Код
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
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
|
|
13.04.2016, 14:32 | 4 |
Запись в 16-битные регистры: сначала старший байт, потом младший. Чтение наоборот.
Инициализация стека у вас неправильна. Будет срыв стека, программы при вызове подпрограмм. Код
ldi r16, HIGH (ROMEND) out SPH, r16 ldi r16, LOW (ROMEND) out SPL, r16
0
|
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
|
|
13.04.2016, 16:37 | 5 |
Сообщение от dymyurk1978
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
|
|
13.04.2016, 17:15 | 6 |
Сообщение от tyzord66
Edit. Хм, походу и правда, для SPH и SPL нет разницы, как записывать данные. Я даже не поленился заглянуть в дизассемблер, что там IAR накомпилил. И в дизассмеблере первым идет SPL. Судя по всему я специально в шаблоны когда-то поставил первым SPH, чтобы не путать порядок записи в другие 16-битные регистры. Опять же, в даташитах первым указывается SPH.
0
|
voho1967
|
|
13.04.2016, 17:59 | 7 |
все!!!
вроде разобрался ...почти... заработало при включении в регистрах мусор вкючил в прогу код очистки памяти (в описании учебном данного сайта есть спасибо ему хороший сайт) и все заработало... есть вопрос только не пойму пока ковырялся - менял инструкцию call на jmp при выводе значения так вот c call работает, а вот с jmp нет - перестает включаться обработчик прерывания Т0 с этим пока не разобрался |
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
|
|
13.04.2016, 18:01 | 8 |
call и jmp команды не работают на МК до 8 кб. ATMEGA16 уже работают.
0
|
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
|
|
13.04.2016, 18:44 | 9 |
Сообщение от voho1967
0
|
voho1967
|
|
13.04.2016, 19:05 | 10 |
да-да тож... разобрался
спасибо всем |
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
|
|
13.04.2016, 19:52 | 11 |
Сообщение от dymyurk1978
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 ;********************************************************
0
|
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 1,625
|
|
13.04.2016, 20:30 | 12 |
Сообщение от tyzord66
0
|
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
|
|
14.04.2016, 10:27 | 13 |
Сообщение от yiv91
0
|
voho1967
|
|
15.04.2016, 10:42 | 14 |
для индексных регистров действительно нет разницы (я тож в железе проверил
наверное из-за того, что это просто разные и независимые регистры на кристалле в описании на мк указаны и зависимые регистры (например результат ацп) я, правда, только собираюсь проверить как оно работает (в железе) мож и другие есть... пока не знаю |
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
|
|
15.04.2016, 12:55 | 15 |
Сообщение от voho1967
0
|
0 / 0 / 0
Регистрация: 07.04.2013
Сообщений: 461
|
|
15.04.2016, 16:28 | 16 |
Сообщение от voho1967
0
|
15.04.2016, 16:28 | |
15.04.2016, 16:28 | |
Помогаю со студенческими работами здесь
16
Создание проекта с участием c++ и asm модулей. Ошибка asm модуля pascal+asm, не подключается модуль asm ASM atmega написать программу на ASM При сборке выдает ошибку "MASM: fatal error A1000: : 1.asm.asm" IDE для для работы с STM8 (на ASM и C) и STM32 (на C, ASM) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |