Jump to content
Skazzi

Вольтметр На Меге8

Recommended Posts

Драсте, сори за тупость, но такая вот штука получилась.

Собрала вольтметр. он КАК БЫ показывает..

ну то есть - включаю - на индикаторе показывает нули. Когда подаю напряжение на вход, то нули не исчезают, а немного тускнеют и при етом же там же показывается измеренное напряжение.. то есть он меряет, НО не выключаются "ненужные" палочки на семисегментном индикаторе... а просто становятся чуть-чуть тусклее...

в чем причина может быть? :blink:

Share this post


Link to post
Share on other sites

Криво сделана динамическая индикация или ошибка в схеме. Схему и программу в студию!

Share this post


Link to post
Share on other sites

Финальные результаты тестирования литиевых батареек FANSO при нормальных условиях

Перед разработчиком устройства, в котором предполагается использование батарейки, всегда стоит задача выбора того или иного бренда. Конечно, наиболее объективный результат по качеству можно получить при реальном тестировании в режиме работы самого устройства. Для того чтобы у разработчиков была некоторая информация о реальных значениях основных параметров ЛХИТ, инженеры компании КОМПЭЛ решили провести серию из трех тестов. Первый тест на постоянный разряд в нормальных климатических условиях, начатый в апреле 2019 г., мы завершили.

Узнать финальный результат тестирования

Криво сделана динамическая индикация

+1

протеус 7.2 не читает файл, выложи просто экспортированную картинку со схемой... прошивка из архива вот:

;***********************
;Author: Alex Joz		*
;Date:					*
;Version:				*
;File name:				*
;Microcontroller:		*
;Clock Freq: 			*
;Functions:				*
;***********************

.nolist
.device ATmega8
.include "m8def.inc"
.list


.def temp=r16

.org $0
rjmp init
.org $00E
rjmp ADC_end

init:
;стек
ldi  temp,high(RAMEND)    
	out  SPH,temp
  	ldi  temp,low(RAMEND)
  	out  SPL,temp

;порты
ldi temp,$ff
out DDRB,temp
ldi temp,$ff
out DDRD,temp

ldi temp,0b00000000
out PortB,temp
ldi	temp,0b00000000
out PortD,temp

;ацп
ldi temp,0b10101011	;ADEN=1 ADIE=1 prescaler =8
out ADCSRA,temp
ldi temp,$E0	;ref in 2.56, adlar =1 (left adjust)
out ADMUX,temp
	ldi temp,0b10010000
	out	MCUCR,temp	;Noise Reduction
sei				

	;******************************************************** 
	;некоторые константы для BCD
	.equ in_size=1 ; in future adch - 1 byte
	.equ out_size=3 ; out - 3 byte bcd, unpacked
	.equ in_arr=57;	тестовое число гг в последствии поставить АЦП!!!!!!
	.equ out_arr=0x16; адрес 22 РОН, для косвенной адресации
	;*********************************************************

Main:
sbi ADCSRA,6
sleep; Спим, ждём преобразования от ацп (;


hex2bcd: 
;ацп в р21
;начнем ((:
ldi r22,0
ldi r23,0
ldi r24,0

ldi temp,in_size
swap temp
lsr temp       ; подсчет количества битов во входном массиве (;
mov r17,temp   ; сохранили (счетчик глобал)
mov r20,r21
ilop:
mov temp,r20
rol temp
mov r20,temp	; сейв сдвинутое 

ldi XH,$0
ldi XL,out_arr
ldi r19,3
slop:
ld temp,X	; загрузили 1 выходной байт
in r30,SREG	; сохраняем флаг с
bst r30,0	; в пользовательском флаге Т
ldi r28,3	; прибавляем 3 
add temp,r28
sbrs temp,3	; пропустить если темп.3 = 1
ld temp,X	; если 0 то загружаем снова (т.е. не прибавляем 3)
bld r30,0	; восстанавливаем значение	
out SREG,r30; флага С
rol temp	; сдвигаем выходной масив
sbrc temp,4	; если temp.4 =1 то:
sec			; С=1
andi temp,$0F; маска, забираем младшую тетраду
st X+,temp	; сохраняем сдвинутое значение обратно в памяти и инкремент счетчика 
dec r19		; 19--	
brne slop	; если 19 не =0 то сдвигать сл. байт
brcs overflow; усе, выход
dec r17		; 17--	
brne ilop	; если 17 не 0 то сдвигаем (8 бит вх. числа)
overflow:
ret

vyvod:
;упаковка BCD и вывод в порты.
mov temp,r22
swap temp
or temp,r23
swap temp
out PORTB,temp
out PORTD,r24
ret

ADC_end:
in r21, ADCH
rcall hex2bcd
rcall vyvod
reti

Share this post


Link to post
Share on other sites
                     

Видеокурс Работаем с микроконтроллерами STM32G0. Впервые на русском языке.

В цикле видеокурсов по работе с STM32G0 от компании STMicroelectronics показаны архитектура, периферия (особенности процессорного ядра, режимов пониженного питания, векторов прерываний, DMA и мультиплексора DMA, схемы тактирования и сброса, и.т.д.) и даны практические примеры. Материал дает наглядное понимание того, как начать работу на новых микроконтроллерах STM32G0

Подробнее

вот оно как, даже динамической индикации нет, BCD дешифратор... в таком случае имхо копай в сторону проблем самого дешифратора и его подключения в железе...

Share this post


Link to post
Share on other sites

бред уже 20 раз перепроверила схему.

еще другой может попробую дешифратор, микросхемку перепаять всмысле.. хз=\

Share this post


Link to post
Share on other sites

Скорей всего не синхронное переключение катодов с анодами. У меня было подобное когда деал таймер Показания одной цифры кратковременно переходили на на начло индикации следующей цифры они как бы накладывались. одинаковые цифри показывали чётко потому как использовались одни и те же сегменты. Думаю нужно смотреть на время задержки шифратора, и коректировать включение катодов.

Share this post


Link to post
Share on other sites
вот оно как, даже динамической индикации нет...

Это как раз и есть динамическая индикация, разряды то включаются поочерёдно.

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

А нужно погасить все разряды, затем вывести символ, затем включить нужный разряд.

И будет тебе счастье!

Share this post


Link to post
Share on other sites

та уже как ток не писала. гашу все естественно... промежуток времени когда не горит ни один елемент имеется...(его хорошо видно если поставить маленькую частоту в протеусе..)

но на деле не так=\

вот про время задержки шифатора не смотрела... почитаю даташит еще посмотрю... но не думаю что оно такое огромное...

ну спасиб еще посмотрю знач.. :o

Share this post


Link to post
Share on other sites

Схему не смотрел. Но если прошивка та, что NebsteR выложил, то есть некоторые недочеты.

1. Цикл main не закрыт.

2. У Mega8 нет ADCSRA, только ADCSR.

Попробуйте этот код (с исправлениями).

.def temp=r16



.org $0

rjmp init

.org $00E

rjmp ADC_end



init:

;стек

ldi  temp,high(RAMEND)

	out  SPH,temp

  	ldi  temp,low(RAMEND)

  	out  SPL,temp



;порты

ldi temp,$ff

out DDRB,temp

ldi temp,$ff

out DDRD,temp



ldi temp,0b00000000

out PortB,temp

ldi	temp,0b00000000

out PortD,temp



;ацп

ldi temp,0b10101011	;ADEN=1 ADIE=1 prescaler =8

out ADCSR,temp

ldi temp,$E0	;ref in 2.56, adlar =1 (left adjust)

out ADMUX,temp

	ldi temp,0b10010000

	out	MCUCR,temp	;Noise Reduction

sei				



	;********************************************************

	;некоторые константы для BCD

	.equ in_size=1 ; in future adch - 1 byte

	.equ out_size=3 ; out - 3 byte bcd, unpacked

	.equ in_arr=57;	тестовое число гг в последствии поставить АЦП!!!!!!

	.equ out_arr=0x16; адрес 22 РОН, для косвенной адресации

	;*********************************************************



Main:

sbi ADCSR,6

sleep; Спим, ждём преобразования от ацп (;

rjmp	main



hex2bcd:

;ацп в р21

;начнем ((:

ldi r22,0

ldi r23,0

ldi r24,0



ldi temp,in_size

swap temp

lsr temp       ; подсчет количества битов во входном массиве (;

mov r17,temp   ; сохранили (счетчик глобал)

mov r20,r21

ilop:

mov temp,r20

rol temp

mov r20,temp	; сейв сдвинутое



ldi XH,$0

ldi XL,out_arr

ldi r19,3

slop:

ld temp,X	; загрузили 1 выходной байт

in r30,SREG	; сохраняем флаг с

bst r30,0	; в пользовательском флаге Т

ldi r28,3	; прибавляем 3

add temp,r28

sbrs temp,3	; пропустить если темп.3 = 1

ld temp,X	; если 0 то загружаем снова (т.е. не прибавляем 3)

bld r30,0	; восстанавливаем значение	

out SREG,r30; флага С

rol temp	; сдвигаем выходной масив

sbrc temp,4	; если temp.4 =1 то:

sec			; С=1

andi temp,$0F; маска, забираем младшую тетраду

st X+,temp	; сохраняем сдвинутое значение обратно в памяти и инкремент счетчика

dec r19		; 19--	

brne slop	; если 19 не =0 то сдвигать сл. байт

brcs overflow; усе, выход

dec r17		; 17--	

brne ilop	; если 17 не 0 то сдвигаем (8 бит вх. числа)

overflow:

ret



vyvod:

;упаковка BCD и вывод в порты.

mov temp,r22

swap temp

or temp,r23

swap temp

out PORTB,temp

out PORTD,r24

ret



ADC_end:

in r21, ADCH

rcall hex2bcd

rcall vyvod

reti

Возможно не имеет смысла выводить результат на дисплей в прерывании "преобразование завершено". Достаточно это сделать после Sleep в main. Может вызов прерывания наступает несколько раз с разными значениями, что и приводит к "подсветке" (несколько цифр) сегментов. После преобразования камень выйдет из Sleep-а так и так (если режим настроен правильно).

Edited by Геннадий

Share this post


Link to post
Share on other sites
...Может вызов прерывания наступает несколько раз с разными значениями, что и приводит к "подсветке" (несколько цифр) сегментов...

Согласен, это оно и есть.

Кто же так вывод делает? Нужно делать по таймеру, и обновлять значение на дисплее не так часто.

Share this post


Link to post
Share on other sites

Skazzi ты писала программу? Программа не рабочая, Сегодня скачал и закинул её в AVRStudio. Там вообще по портам ничего не происходит. Да и как может происходить если туда постоянно записываються нули.

Сначала:

ldi r22,0

ldi r23,0

ldi r24,0

Следующий раз регистр 22,23,24 используються

mov temp,r22

swap temp

or temp,r23

swap temp

out PORTB,temp

out PORTD,r24

ret

Между этими двумя фрагментами кода с данными регистрами ничего не делаеться.А точнее сказать вообще они больше нигде не встречаються. Как у тебя может чтото светитьтся не понимаю. Но если исходники не твои скорей всего HEX у тебя правильный, может не ту частоту внутреннего генератора установила.

+ Незнаю частоту генератора, по прилагаемому исходнику примерно через 5000 тактов происходит сброс. и программа начинается сначала.

Share this post


Link to post
Share on other sites

Кроме указанных ранее глюков, есть еще такой. Запуск преобразования осуществляется принудительно в main, а сам АЦП натроен на непрерывное преобразование, т.е. преобразование запускается автоматически по окончании предыдущего сеанса.  

Нужно в ADCSR загрузить 0b10001011 так будет правильней. Результат преобразования стабильный, а вот вывод нерабочий. Точнее нет динамической индикации как таковой. R24, предназначенный для переключения катодов(анодов) индикатора, нигде не используется, кроме out PORTD,r24 (или у меня глаза уже в кучу). По алгоритму в порт D должно выводиться одно и то же значение 0 (ldi R24,0), хотя для динамики надо 0b00000010, 0b00000100 и 0b00001000 (для общего анода и обратный код для общего катода). Но самое интересное, что по какой-то бешеной случайности, в R24 иногда (без какой-либо закономерности) появляются значения 00h, 01h, 02h. Я не знаю, какой тип дисплея используется. Если с общим катодом, то все цифры "светятся" одним значением, которое может меняться с высокой скоростью, зависящей от тактовой частоты и временем преобразования. В добавок к этому порт B выводит сегменты только одной цифры, причем только по завершению преобразования, не регенерируюя дисплей постоянно для чтения. Вот и вся беда - общие катоды (аноды) не переключаются, а сегменты цифр не учитывают разряда индицируемого числа. При этом нет постоянной "подпитки" дисплея информацией.

Edited by Геннадий

Share this post


Link to post
Share on other sites
Skazzi ты писала программу? Программа не рабочая, Сегодня скачал и закинул её в AVRStudio. Там вообще по портам ничего не происходит. Да и как может происходить если туда постоянно записываються нули.

Сначала:

ldi r22,0

ldi r23,0

ldi r24,0

Следующий раз регистр 22,23,24 используються

mov temp,r22

swap temp

or temp,r23

swap temp

out PORTB,temp

out PORTD,r24

ret

Между этими двумя фрагментами кода с данными регистрами ничего не делаеться.А точнее сказать вообще они больше нигде не встречаються.

Все встречается.. косвенная адресация.

Программа работает стопроцентов, алгоритм правильный и все там пральна считает. просто как у тебя там может чето происходить если на ацп ничего не приходит.. никаких данных??

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

Сори, я не ту прогу скинула (почему-то имя того файла совпало с именем хекса... а оказалось что с динамической уже было пересохранено, просто писала я ето еще вначале лета, забылась, простите),

И в той версии действительно нет динамической индикации.. ето более ранняя версия когда все работало на 3х дешифраторах без динамической индикации...но кроме подпрограммы вывода, впринципе ничего не менялось. алгоритм bcd и остальное то же самое...

Всем спасибо. ;) Мой вольтметр уже работает по его прямому назначению :P Осталось дособирать все добро в корпус.

Схему не смотрел. Но если прошивка та, что NebsteR выложил, то есть некоторые недочеты.

1. Цикл main не закрыт.

2. У Mega8 нет ADCSRA, только ADCSR.

Попробуйте этот код (с исправлениями).

Возможно не имеет смысла выводить результат на дисплей в прерывании "преобразование завершено". Достаточно это сделать после Sleep в main. Может вызов прерывания наступает несколько раз с разными значениями, что и приводит к "подсветке" (несколько цифр) сегментов. После преобразования камень выйдет из Sleep-а так и так (если режим настроен правильно).

1. Согласна, спасибо.

2. Не согласна. у меня в файле и так и так оно записано.. ну то есть в м8деф.инке пишется:

.equ	ADCSR   =$06
.equ	ADCSRA	=$06

Так что не важно как писать <_<

3. Может и не имеет смысла. не знаю. нужно поэксперементировать, но думаю особо на результате работы это не скажется.. хотя хз...Но все равно спасибо за внимание :rolleyes:

Share this post


Link to post
Share on other sites
Кроме указанных ранее глюков, есть еще такой. Запуск преобразования осуществляется принудительно в main, а сам АЦП натроен на непрерывное преобразование, т.е. преобразование запускается автоматически по окончании предыдущего сеанса.  

Нужно в ADCSR загрузить 0b10001011 так будет правильней. Результат преобразования стабильный, а вот вывод нерабочий. Точнее нет динамической индикации как таковой.

Уга. Спасибо, исправлено (написала на время пока было все без слипа, а потом и поменять забыла :wub: )

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • Я тоже сперва так думал. Однако посмотрев этот ролик решил, что не совсем так. СД индицируют именно исправность провода.   Согласен. Думаю это уже не принципиально. Тоже пришел к этому выводу
    • Одни верят, что бог есть. Другие верят, что бога нет. ©
    • Появилось время и попробовал поменять трансформатор.Подсоединил его пока на проводах и бп запустился.Напряжение до 22в регулируется.нагружал 10а на 12в,тянет нормально без просадок.Хотя старый трансформатор тоже столько тянул.Просто больше нечем было нагрузить.Получается, что трансформатор подходит.Теперь надо подумать как его присоединить,а то по разводке он не такой.
    • А Вы сами не догадались? Усилить входное напряжение до нужного диапазона, а дальше - сдвиг. ВСЁ!
    • Зато  она  подразумевает большую радость...  Я не хожу по Москве с ножом на постоянной носке... Капусту на улице не рублю... только в магазине. Карандаши на улице не точу, банки на ходу  не открываю и провода не перекусываю.  Для клеммы аккумулятора есть ключ на 10ку, в багажнике... А для винтиков  есть отвёртки, и головки, там же. Нож беру только когда иду за капустой, чтобы срезать листья и кочерыжку.  Почему... я например запросто мог бы принять участие  вот в этой теме...Однако, тему  Фалкониста  посчитал гораздо более интересной и  достойной внимания. Да и вы, как видно, тоже. ЗЫ:  Зато вот в этой теме никогда не смог бы принять участия, наряду с вами, чтобы что-то  важное туда запостить... Из-за недостатка знаний и интеллекта.  
×
×
  • Create New...