Перейти к содержанию

Динамическая индикация на ассемблере


Юстас

Рекомендуемые сообщения

В 14.01.2017 в 20:12, demiurg1978 сказал:

Псевдопараллельность процессов

demiurg1978, можно немного раскрыть эти слова для применения на ассемблере? 

В 14.01.2017 в 20:12, demiurg1978 сказал:

программные таймеры

это как- добавить в основной цикл счетчик, отслеживать состояние, и например, для индикации при определенном значении запускать соответствующий "блок" программы?

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

6 часов назад, cucumber сказал:

Знакомый сделал в прерывании изменение SPL. Соответственно, программа из прерывания прыгает не туда, где остановилась, а по новому адресу. Можно так делать? 

 

4 часа назад, cucumber сказал:

а есть смысл в использовании RCALL без RET?

Делать можно, если вы считаете это оправданным. Главное не забывать о корректности данных в стеке (ну и в регистрах конечно).

Ссылка на комментарий
Поделиться на другие сайты

пред история: решили со знакомым изучить ассемблер. Начали с динамической индикации и частотомера на 2313. Ниже - его вариант. Позже принесу свой. За правописание не пинайте,  парень простой, я исправлять не стал.  Его вариант считает МГц на 4-х разрядном индикаторе.

.include"2313def.inc"

.def     Temp1=R17
.def     razer1=R18
.def     razer2=R19
.def     razer3=R20
.def     razer4=R21
.cseg
.org 0

rjmp Reset; Reset Handler
reti ; External Interrupt0 Handler
reti; External Interrupt1 Handler
reti ; Timer1 Capture Handler
reti ; Timer1 CompareA Handler
reti ; Timer1 Overflow Handler
reti ; Timer0 Overflow Handler
reti ; USART0 RX Complete Handler
reti ; USART0,UDR Empty Handler
reti ; USART0 TX Complete Handler
reti ; Analog Comparator Handler
reti; Pin Change Interrupt
reti ; Timer1 Compare B Handler
rjmp TIMER0_COMPA ; Timer0 Compare A Handler
reti ; Timer0 Compare B Handler
reti ; USI Start Handler
reti; USI Overflow Handler
reti ; EEPROM Ready Handler
reti; Watchdog Overflow Handler

Reset:

 		ldi R16,RamEnd     		;Стек  
		out SPL,R16

		ldi R16,0b01011000		;Порт D  Настройка	
		out DDRD,R16

		ldi R16,0b00011111		;Порт B Настройка	
		out DDRB,R16

		ldi R16,0b00000011  	;CK/64 Делитель восмебитного таймера на 64
       		 sts 0x53, R16

		ldi R16,249
     		sts 0x56, R16          		 ;Восьмибитный компаратор ставим 249

		ldi R16,0b10000010		;Регистор Tccr0a Настройка восмебитного таймера
		sts 0x50,R16

        		ldi R16,0b00000001    	 ;Прирывания в восьмибитном таймере таймере
        		out TIMSK,R16

		ldi R16,0b00000111   	 ;Внешний источник сигнала вход ТО. 16 битного таймера
        		out TCCR1B,R16		 ;Синхронизация по переднему фронту

		ldi R16,0               		;Сбрасывыем Таймер 8 бит, в принцепе не нужно
		out TCNT0,R16

        		out TCNT1H,R16         	 ;Сбрасывыем Таймер 16 бит Тоже не обезательно,
        		out TCNT1L,R16		;сбросица всё само с первым прерыванием

		SEI			;Разрешаем прерывания

PROGA:

;********************************************************************************************************
;				Оснавной цикал
;********************************************************************************************************

        		mov R17,razer1
      		ldi R22,0b00011110  	 ; Выводим первый разряд
      		rcall ReadArray

    		mov R17,razer2
      		ldi R22,0b00011101	 	; Выводим второй разряд
       		rcall ReadArray

       		mov R17,razer3
        		ldi R22,0b00001111	 	; Выводим третий разряд небольшая путаница
        		rcall ReadArray	 	; из за сгоревшей ножки

       		mov R17,razer4
        		ldi R22,0b00010111	 	; Выводим четвёртый разряд
       		rcall ReadArray

        		rjmp PROGA		 ; Всё заново



;********************************************************************************************************
;				Чтение масива
;********************************************************************************************************

ReadArray:				;Чтение масива
         		ldi R16,0				
         		ldi ZH,High(Array*2)   	 ;Загружаем в ZH адрес метки Array старший байт
         		ldi ZL,Low(Array*2)		;Загружаем в ZL адрес метки Array младший байт
					;Метка Array (начало масива в памети програм)
                     
         		add ZL,R17		;Прибовление к регистру Z Садержимого R17
         		adc ZH,R16		;Перенос, возможно и не нужен в зависемости
					;от расположение масива в памети програм
         		lpm                    		;Чтение из памети програм в R0

         		ldi R16,0b00011111		;Гасим индикатор
         		out PortB,R16


         		ldi R16,7			;  По битная передача из R0
         					;  на микросхему 74НС595 (я её оставил,
Loop0:   		SBRC R0,6		;  не охота схему перепаевать было)
         		SBI  PortD,6
         		SBI  PortD,3
         		CBI  PortD,3
         		LSL  R0
         		CBI  PortD,6
         		dec  R16
         		brne Loop0
         		SBI  PortD,4
		CBI  PortD,4
		out PortB,R22		;Зажигаем индекатор

         		CLR razer1		; Сброс разрядов
         		CLR razer2
         		CLR razer3
         		CLR razer4

		 sbrs R15,4		;Проверка первого бита (старшего) если бит установчен,
		 rcall Loop1		;то дабовление в соотвецтвующее разряды
	 	 ldi R16,2			;числа 2048
		 add razer4,R16		;в первый разряд (младший) чесло 8
   		 ldi R16,4			;во второй 4
		 add razer2,R16		;в третий нечего не добавляем
		 ldi R16,8			;в четвёртый 2
  		 add razer1,R16		;если не установлен то пропускаем

Loop1:		sbrs R15,3		;Проверка следующего бита устанавливаем
		rcall Loop2		;Всоотвецтвующее разряды чесло 1024
 		inc razer4		 
					;если бит не установлен то пропускаем
		ldi R16,2
		add razer2,R16
		ldi R16,4
  		add razer1,R16

Loop2:		sbrs R15,2		;Проверка следующего бита устанавливаем
		rcall Loop3		; в разряды 512
		ldi R16,5			;если бит не установлен то пропускаем
		add razer3,R16   		; и так далиее 
		inc razer2
		ldi R16,2
		add razer1,R16

Loop3:		sbrs R15,1		;устанавливаем 256
		rcall Loop4
 		ldi R16,2
		add razer3,R16
		ldi R16,5
		add razer2,R16
 		ldi R16,6
		add razer1,R16

Loop4: 		sbrs R15,0		;устанавливаем 128
		rcall Loop5
		inc razer3
		ldi R16,2
		add razer2,R16
		ldi R16,8
		add razer1,R16

Loop5:		sbrs R14,7		;устанавливаем 64
		rcall Loop6		;итак до ериницы
		ldi R16,6
		add razer2,R16
		ldi R16,4
		add razer1,R16

Loop6:		sbrs R14,6
		rcall Loop7
		ldi R16,3
		add razer2,R16
		ldi R16,2
		add razer1,R16


Loop7:		sbrs R14,5
		rcall Loop8	
		inc razer2
		ldi R16,6
		add razer1,R16

Loop8:		sbrs R14,4
		rcall Loop9
		ldi R16,8
		add razer1,R16

Loop9:		sbrs R14,3
		rcall Loop10
		ldi R16,4	 
		add razer1,R16

Loop10:		sbrs R14,2
		rcall Loop11
	 	ldi R16,2	 
		add razer1,R16
Loop11:		SBRC R14,1
		inc razer1


Loop12:		cpi razer1,10    		  ;перенос лишних десятков в старшие разряды
 		brlo Loop13		  ;сравнение с 10 младшего разряда если меньше
		subi razer1,10	 	  ;то пропускаем если больше или равно то вычетаем 10
		inc razer2		   ; а более старший пребовляем 1
		rjmp Loop12		  ; павторяем процедуру пока разряд не станет менше 10

Loop13:		cpi razer2,10 		  ;тожесамое только со вторым разрядом
 		brlo Loop14
		subi razer2,10
		inc razer3
		rjmp Loop13

Loop14:		cpi razer3,10 		;с третим
		brlo Delay		;с четвёртым не надо патамушто перенасить не куда
	 	subi razer3,10		;да и не нужно больше 4 не будет выше частоту не
		inc razer4		;будет мерить
		rjmp Loop14

Delay: 		 rjmp Delay		;бесканечный цикал ждём прерывания
					;здесь может выполнятся любая другая программа
					;надо в прерывании сохронитьSP,и SREG(если это кретично)
					;а в этом масте их загрузить и ret
					;программа продолжится с того места где пришло прерывание


;********************************************************************************************************
;			Обрабочик прерывания таймера
;********************************************************************************************************

TIMER0_COMPA:


         		 in R14, TCNT1L	;Загружаем из 16 битного таймера младший байт в R14
         		 in R15, TCNT1H	;Загружаем из 16 битного таймера старший байт в R15
         

         		CLR  R16
       	  	out TCNT1H,R16     ;Сбрасывыем Таймер 16 бит
       	 	out TCNT1L,R16



		  ldi  R16,0xDD	;Загружаем в SP адрес котрай был до прирывания
		  out SPL,R16	;Чтобы его получить Надо было дастать значение из
         				;SPL и прибавить 2 ,но мозно сразу закрузить канстанту
				; но это будет только чесло актуально для конкретного 
		 		;кантролера, паэтому лучше получать его на месте
		 
		 
		 
		  reti		;И понему переходим и поподаем в основной цикал
				;как будто вышли из подпрограмы ReadArray


;********************************************************************************************************
;				Масив
;********************************************************************************************************


Array:
              .db 0b00111111,0b00000110	;0,1
              .db 0b01011011,0b01001111	;2,3
              .db 0b01100110,0b01101101	;4,5
              .db 0b01111101,0b00000111	;6,7
              .db 0b01111111,0b01101111	;8,9

;********************************************************************************************************
;Это сколько использавоно ресурсов кантролера (можно ещо меньше)

;AT90S2313 memory use summary [bytes]:
;Segment   Begin    End      Code   Data   Used    Size   Use%
;---------------------------------------------------------------
;[.cseg] 0x000000 0x000162    344     10    354    2048  17.3%
;[.dseg] 0x000060 0x000060      0      0      0     128   0.0%
;[.eseg] 0x000000 0x000000      0      0      0     128   0.0%

 

Изменено пользователем cucumber
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Сообщения

    • Имел дело с зарядкой батареек еще с советских времен. Тогда еще в магазине (!) купил специальную зарядку для ртутно-цинковых батареек, очень миниатюрная, зарядка шла от встроенного солнечного элемента (и это еще в советские времена!). Использовал для зарядки батареек для наручных часов, после первой зарядки батарейки хватало примерно на полгода, потом на 3-4 месяца. Потом (когда батарейка служила меньше двух месяцев) батарейка отправлялась на упокой. Спасала студента тогда очень эта вещица. Жалею что тогда не срисовал ее внутренности. А вот с зарядкой щелочных батареек пришлось заниматься уже значительно позже. Мне кто-то подарил такой набор (зарядка с комплектом перезаряжаемых батареек) - вот его обзор https://aphnetworks.com/reviews/pure_energy_xl  Все было нормально, но у всех этих батареек ресурс очень ограничен, примерно 25 циклов максимум. После чего емкость уменьшается и нет смысла их дальше использовать. После каждой зарядки емкость уменьшается, но не сильно. Реально раз десять заряжать можно точно без проблем. После того как выработался ресурс последней батарейки стал вопрос - а можно ли заряжать обычные батарейки тоже? Зарядка-то осталась... И как раз в то время приобрел обычные (т.е. "незаряжаемые") батарейки той же фирмы (PureEnergy). Оказалось что они заряжаются точно также, как и "заряжаемые"! Возможно что у них та же химия... Пробовал батарейки разных фирм, степени разряда. Короче говоря, фирменные всякие Дюраселлы и Энержайзеры не заряжаются вообще, и даже могут потечь во время зарядки. А вот самые дикие и дешевые нонейм чаще всего заряжаются без проблем. Насчет емкости - конечно емкость полностью не восстанавливается, но для работы в беспроводной клаве,, мышке или пульте вполне хватает и достаточно надолго.  Но занимаюсь этим нечасто, просто когда лень ехать в магазин за очередной партией батареек.  А если есть возможность, то предпочитаю переделывать питание под литий. Очень сильно достает саморазряд всяких Ni-Cd, Ni-MH - разряжаются даже те, которые якобы должны долго держать заряд. Схему зарядки еще не срисовывал (лень было разбирать), но схема сложнее чем все что я видел в Интернете. Напряжение заряда примерно 1,7в. xlaa_tds.pdf
    • Я делаю ставку на контакты NC реле запуска и NO реле торможения. Тем более они такие хлипенькие.
    • Раз смогли срисовать схему "силы", то и решить проблему для вас вряд ли сложно будет... Проверьте емкость и ЭПС C-20мкФ и сопротивление контактов этих двух реле в on/off
    • Как? Вы ж никакой информации для работы мозга не дали. Ну, что-то собрали, как-то подключили, подаёте 220 на схему с незапаянным трансформатором, лампочка моргает, защита не срабатывает... Единственный вариант - вас отодвинуть и посмотреть, что там происходит. Но вы даже где обитаете не указали... Единственное, что можно вытянуть из вашего текста: Как может работать микросхема, если у неё замкнуто питание? Перед подачей 220 вы эту перемычку сняли?  
    • Если тут нет необходимой инфы, на это можно забить. Вот если он отвечает на АТ несколькими строками, то стоит разбирать на лету (во время приема) из кольцевого буфера.
    • Так что? Помогите реализовать, нужно за меня реализовать, подскажите как реализовать?? "Барыня лягли и просють..." Вас что в школе, дома, на улице никто не учил диалог вести. 
×
×
  • Создать...