shadow86
Dec 6 2011, 20:11
Делаю счетчик Гейгера на датчике СБМ-20. Источник 400В получился, им я доволен. Теперь стоит задача вывода данных по уровню радиации. Думал это осуществить на микросхемах к176ие4 и светодиодных индикаторах. Но пришлось отказаться от этой идеи - хочу, чтоб во время счетного периода выводилось последнее посчитанное число импульсов, а не 1, 2, 3, .. и т.д.
Правильны ли рассуждения: если известно, что чувствительность СБМ-20 78 имп/мкР(по кобальту-60), то если принять за время измерения 1/78 часа, то количество импульсов со счетчика будет численно равно уровню радиации в мкР/ч. 3600/78=46,15 секунд ?
Тоесть, я хочу, чтоб 46 секунд он считал импульсы, а потом выдал результат и показывал мне его следующие 46 секунд, потом обновил показания и светил ими следующие 46 секунд и т.д.
Для реализации подобного эта микросхема не годится, правда? (Если есть варианты на советских микросхемах, подкиньте идею, пожалуйста!)
И еще одна идея, как с минимальным набором микросхем (генераторов, делителей частоты и т.п.) добиться появления импульса через 46 секунд?
С МК пока не работаю - нет программатора ((. С ним дело было бы веселее, но прошу высказаться и в этом направлении, в частности использования МК ATtiny26, для рееализации этой задачи.
Заранее благодарен всем принявшим участие в обсуждении!
Цитата(shadow86 @ Dec 7 2011, 00:11)

количество импульсов со счетчика будет численно равно уровню радиации в мкР/ч. 3600/78=46,15 секунд ?
Правильно
Цитата(shadow86 @ Dec 7 2011, 00:11)

С МК пока не работаю - нет программатора
Это - главная ошибка. ATtiny26, да и любой похожий решит все проблемы, в том числе накачку 400вольт и всяческий пересчет, том более, что нельзя тупо считать импульсы за 46сек, нужно вводить программный фильтр для сглаживания показаний, без него цифры будут скакать. Программатор делается из резисторов и проводов от LPT. А жесткую логику в этом случае нужно забыть.
Ещё эффективнее было бы применить программируемую логику: аналогичный JTAG-программатор, MAX от Альтеры или XC95 от Ксайлинкс и фришный софт от них же. Как бонус - заметный выигрыш по точности и быстродействию + полная интеграция драйвера семисегментного индикатора в тот же самый кристалл, где будет находиться АЛУ.
shadow86
Dec 7 2011, 05:44
Спасибо, Air77!
так, если использовать МК, то я могу применить 3-х значный индикатор с динамическим управлением. А что Вы говорите насчет програмной фильтрации? Я на осциллографе наблюдал импульсы после СБМ и засекал их количество по секундомеру: за 46 секунд получалось 17, 16, 17, 17, 16, 18, 17.. Вы имеету ввиду осреднять что-ли?
Скиньте, пожалуйста ссылку на какой нибудь простой программатор. И проще его сделать через COM или LPT все-же? у меня есть провод переходник USB->COM смогу ли я через него подключаться как через COM?
А программируемая логика - о таком я еще не слышал. Спасибо, YIG, за новое для меня направление! Почитаю, прикину. )
Цитата(air77 @ Dec 7 2011, 02:44)

нельзя тупо считать импульсы за 46сек, нужно вводить программный фильтр для сглаживания показаний, без него цифры будут скакать.
Может быть лучше просто поставить микроамперметр - фильтр и микромощный индикатор в одном флаконе. Можно сопроводить звуковым приветствием каждую пришедшую частицу. Тогда и в полной темноте...
shadow86
Dec 7 2011, 08:57
я думал над стрелочным индиктором, но выбор был сделан в пользу цыфровой индикации, из-за большей наглядности + планирую, как Вы Tanya и предложили, каждую частицу встречать вспышкой отдельно выведенного светодиода и звуровым сопровождением. ))
Программной фильтрации не требуется при времени 46 с, так работают большинство счетчиков.
И осваивайте МК, это не сложно.
shadow86
Dec 7 2011, 09:52
подскажите, пожалуйста простенькую схему программатора через СОМ-порт, желательно. И будет ли работать такой программатор через USB->COM переходник?
вот наткнулся на простую схему программатора
Нажмите для просмотра прикрепленного файла, будет ли он работать через переходник?
Цитата(shadow86 @ Dec 7 2011, 12:57)

но выбор был сделан в пользу цыфровой индикации,
А зря Вы батарейки будете зря расходовать... Стрелочный прибор... уже прошит... запрограммирован на скользящее среднее... Могли бы даже, если уж так хочется, в двоичном коде отдельные светодиоды зажигать...
shadow86
Dec 7 2011, 10:12
Спасибо, Tanya, но душа просит цыфр )).
Цитата(YIG @ Dec 7 2011, 04:53)

Ещё эффективнее было бы применить программируемую логику: аналогичный JTAG-программатор, MAX от Альтеры или XC95 от Ксайлинкс и фришный софт от них же. Как бонус - заметный выигрыш по точности и быстродействию + полная интеграция драйвера семисегментного индикатора в тот же самый кристалл, где будет находиться АЛУ.
"Выигрыш по точности" - это в сравнении с чем ? Дальше - стоимость кристалла. И - потребление. К тому же у микроконтроллера типично есть встроенный ADC и PWM, и реализовать стабилизированный источник высокого напряжения - раз плюнуть.
Цитата(Tanya @ Dec 7 2011, 13:58)

А зря Вы батарейки будете зря расходовать... Стрелочный прибор... уже прошит... запрограммирован на скользящее среднее...
Но для естественного фона слишком малая постоянная времени. А что до экономии питания - сегментный LCD сожрет единицы-десятки uA, это гораздо меньше, чем преобразователь высокого.
Canis Dirus
Dec 7 2011, 10:16
Цитата(shadow86 @ Dec 7 2011, 15:52)

подскажите, пожалуйста простенькую схему программатора через СОМ-порт, желательно.
Для паралельного (LPT) подойдёт?
http://real.kiev.ua/old/avreal/ru/adaptersЦитата(shadow86 @ Dec 7 2011, 15:52)

И будет ли работать такой программатор через USB->COM переходник?
Краткий ответ: нет.
P.S. Даже если переходник сделан на микросхеме поддерживающей т.н. «bit-bang mode», то всё-равно скорость будет всё-равно настолько низкой, что единственное осмысленное его применение — прошивка собственного микроконтроллера программатора.
shadow86
Dec 7 2011, 10:36
эти схемы сложнее в повторении (. а приведенная мной схема даст возможность программировать ATtiny26 через реальный COM? и для того, чтоб подключить микроконтроллер к схеме, мне нужно его вставить в соответствующую колодку и включить ему питание VCC=+5В. я правильно понимаю?
Цитата(rx3apf @ Dec 7 2011, 14:15)

Но для естественного фона слишком малая постоянная времени. А что до экономии питания - сегментный LCD сожрет единицы-десятки uA, это гораздо меньше, чем преобразователь высокого.
Ну еще можно конденсатор добавить... А про LCD ТС ничего не говорил. Он, наверное хочет в темноте...
shadow86
Dec 7 2011, 11:04
Вы совершенно правы, Tanya, индикация должна хорошо читаться и при дневном свете и в темноте, а яркость (и как следствие, потребление тока индикатором) будет меняться ).
Цитата(shadow86 @ Dec 7 2011, 15:04)

Вы совершенно правы, Tanya, индикация должна хорошо читаться и при дневном свете и в темноте, а яркость (и как следствие, потребление тока индикатором) будет меняться ).
Подсветка сожрет много, вряд ли это имеет смысл для портативного прибора. Мелкие LED тоже жрут, а при прямом солнечном свете, наоборот, будут читаться плохо. Дело хозяйское, конечно, но я бы поставил сегментный LCD без подсветки...
shadow86
Dec 7 2011, 11:28
Есть возможность купить TIC71, Вы такой наподобие имеете ввиду? можно и с этим поэкспериментировать ))
Цитата(shadow86 @ Dec 7 2011, 15:28)

Есть возможность купить TIC71, Вы такой наподобие имеете ввиду? можно и с этим поэкспериментировать ))
Ну типа да. Мелковат, правда. Зато жрет около 1 uA (за счет внешней регенерации - но ее придется делать). Да и вряд ли нужно столько разрядов. Может быть, стоило бы поглядеть в сторону микроконтроллеров с контроллером LCD (и у Atmel такие есть, много дешевых у Microchip, или что-то из MSP430). И к такому - стекляшку на три-четыре знакоместа. А, есть еще сделанный по нашему заказу TIC279.
shadow86
Dec 7 2011, 13:54
Аааааа!!! Собрал свою схему и Uniprof мне показала наличие моего МК и его содержимое!!! ))))))))
Теперь я непобедЮм!!!
Столько эмоций испытал, сродни тому, как запустил свой первый УНЧ ))))).
Так теперь можно приниматься за реализацию задуманного!
Уверен, будет еще оооочень большая куча вопросов. Спасибо всем за советы! Теперь только тема по-настоящему открывается!
Цитата(rx3apf @ Dec 7 2011, 13:15)

"Выигрыш по точности" - это в сравнении с чем ?
Это в сравнении со стандартной логикой
Цитата
Дальше - стоимость кристалла.
Теперь для CPLD - весьма невысока. Я бы даже сказал - соразмерна c МК
Цитата
И - потребление.
Полностью зависит от схемы проекта. Если часы вытащить наружу и применить КулРаннер, то соразмерно с МК+ДрайверЖКИ.
Цитата
К тому же у микроконтроллера типично есть встроенный ADC и PWM, и реализовать стабилизированный источник высокого напряжения - раз плюнуть.
Согласен, но тут АЦП и БП уже не нужны...
...Ну и потом, топикстартер не указал требований по энергосбережению и цене в начале теме, поэтому и предложил этот вариант. Теперь согласен, что МК - много актуальнее.
shadow86
Dec 7 2011, 18:49
Рас уж буду применять МК, то накачку датчика также попробую выполнить на нем )). только пока еще совсем-совсем не представляю как это осуществить. Понимаю, что с помощью МК могу управлять скважностью импульсов через повышающий трансформатор, но не представляю как осуществить контроль за выходным напряжением, чтоб МК начал изменять эту самую скважность ((.
Цитата(shadow86 @ Dec 7 2011, 22:49)

Рас уж буду применять МК, то накачку датчика также попробую выполнить на нем )). только пока еще совсем-совсем не представляю как это осуществить. Понимаю, что с помощью МК могу управлять скважностью импульсов через повышающий трансформатор, но не представляю как осуществить контроль за выходным напряжением, чтоб МК начал изменять эту самую скважность ((.
Делитель на вход ADC.
Цитата(rx3apf @ Dec 7 2011, 23:13)

Делитель на вход ADC.
Ох , не надо ему пока этого . Тем более
Цитата
Источник 400В получился, им я доволен
Сначала сделать вывод , а уж потом убрать источник и подключать ADC, таймер и прерывания
shadow86
Dec 7 2011, 19:51
ATtiny26 - его же можно перепрограммировать много раз? не один и на всю жизнь? И когда я закончу его прошивать, мне нужно будет лишь отключить +5В и можно выковыривать микросхему из гнезда? или нужно еще и удлиннительный шнур вынуть из COM? Вот эти вопросы меня всегда волновали, а ответ на них Google мне так и не дал (. Поясните, пожалуйста, начинающему ).
P.S.: а втыкать МК в гнездо программатора можно, если программатор подключен к COM порту, или сначала вынуть из COM, а потом втыкать МК?
Цитата
не один и на всю жизнь?
Это как захотите
Цитата
мне нужно будет лишь отключить +5В и можно выковыривать микросхему из гнезда?
или нужно еще и удлиннительный шнур вынуть из COM?
Лучше всего всегда полностью "обесточить" MC , а потом проводить с ним "втыкание - вытыкание"
shadow86
Dec 7 2011, 21:11
Спасибо! Я так и предпологал, но теперь знаю точно )
shadow86
Dec 8 2011, 08:26
ААААА! У меня сейчас взорвется мосК!
Объясните дураку:
Пример 4. Вывод цифр от 0 до 99.
Преобразование двоичных чисел в двоично-десятичные (BCD)
________________________________________
#include <ioavr.h>
#include <intrinsics.h>
unsigned char number[] =
{
0x3f, //0
0x06, //1
0x5b, //2
0x4f, //3
0x66, //4
0x6d, //5
0x7d, //6
0x07, //7
0x7f, //8
0x6f //9
};
//числа для вывода на индикатор
volatile unsigned char data1 = 0;
volatile unsigned char data2 = 0;
//программный счетчик секунд
unsigned char counterProg = 0;
int main( void )
{
//порт, к которому подкл. сегменты
PORTB = 0xff;
DDRB = 0xff;
//порт, к которому подкл. катод
PORTD = 0;
DDRD |= (1<<1)|(1<<0);
//инициализация таймера Т0
TIMSK = (1<<TOIE0);
TCCR0 = (1<<CS02)|(0<<CS01)|(1<<CS00);
TCNT0 = 0xb2;
__enable_interrupt();
while(1){
//программный счетчик секунд
counterProg++;
if (counterProg == 100) counterProg = 0;
data1 = counterProg % 10;
data2 = counterProg/10;
__delay_cycles(8000000);
}
return 0;
}
//прерывания таймера Т0 - вывод на индикатор
#pragma vector = TIMER0_OVF_vect
__interrupt void Timer0_Ovf(void)
{
static unsigned char count = 0;
TCNT0 = 0xb2;
//гасим оба разряда
PORTD &= ~((1<<1)|(1<<0));
//выводим код цифры в порт
//и зажигаем следующий разряд
if (count == 0) {
PORTB = number[data2];
PORTD |= (1<<1);
}
if (count == 1) {
PORTB = number[data1];
PORTD |= (1<<0);
}
count++;
if (count == 2) count = 0;
}
Никак не пойму:
int main( void )
{
//порт, к которому подкл. сегменты
PORTB = 0xff;
DDRB = 0xff - это тут все порта задействуются или один порт В? как тогда указать, чтобы включились нужные мне 7 портов под сегменты? и как указать номера выводов микросхемы, которые должны соответствовать этим портам (сегментам).
И что это значит? :
unsigned char number[] =
{
0x3f, //0
0x06, //1
0x5b, //2
0x4f, //3
0x66, //4
0x6d, //5
0x7d, //6
0x07, //7
0x7f, //8
0x6f //9
};
это какая-то встроенная функция для разбивания цыфр на сегменты? применима ли она к ATtiny26 ?
Цитата(shadow86 @ Dec 8 2011, 12:26)

//порт, к которому подкл. сегменты
PORTB = 0xff;
DDRB = 0xff - это тут все порта задействуются или один порт В?
Порт - это типично 8 (или меньше) линий ввода-вывода. В данном случае восемь линий настраиваются на вывод.
Цитата
И что это значит? :
unsigned char number[] =
{
0x3f, //0
0x06, //1
....
Таблица преобразования десятичной цифры в ее "семисегментное" представление. Делается, исходя из необходимого соответствия бита порта и сегмента.
shadow86
Dec 8 2011, 21:01
Насчет порта и входов-выводов понял и осознал, а вот как указать на какой ножке порта какой сегмент выводится будет? и
Цитата
Таблица преобразования десятичной цифры в ее "семисегментное" представление. Делается, исходя из необходимого соответствия бита порта и сегмента.
- эта таблица одна для всех МК? Подойдет ли она мне для ATtiny26?
toweroff
Dec 9 2011, 01:38
Это - массив байтов, каждый байт содержит 7 значащих бит (начиная с младшего - судя по всему, старший не используется. Его обычно на точку сажают), в которых единица "зажигает" соответствующий сегмент (хотя странно... обычно катод к земле коммутируют... или я так привык?

)
соответственно, команда
Код
PORTB = number[data2];
запишет в порт значение элемента массива number с индексом data2
нумерация элементов с нуля
Цитата(shadow86 @ Dec 9 2011, 01:01)

эта таблица одна для всех МК? Подойдет ли она мне для ATtiny26?
она подойдет для любого
А там уж как ножки порта B подключите

разберитесь, какой бит за какой сегмент отвечает и все станет просто
shadow86
Dec 9 2011, 05:23
Понял! У ATtiny26 есть два порта ввода-вывода данных, которые подключеня к своим 8-ми ножкам микросхемы, от меня требуется найти соответствее сегментов индикатора ножкам МК. Эта программа на 2 цыфры (только не пойму, где в коде ее это указано), а чтоб добавить еще один розряд индикации, что мне и куда нужно дописать?
toweroff
Dec 9 2011, 10:00
это ДИНАМИЧЕСКАЯ индикация. В один момент времени горит ОДИН индикатор из двух. Но, так как это происходит с частотой около 1 КГц, глаз не успевает это увидеть.
shadow86
Dec 9 2011, 10:33
я понимаю, что такое динамическая индикация. мне не понятно где указано, чтоб МК зажигал сначала первую цыфру, потом ее тушил и включал вторую, массу подключал к индикатору, чтоли
toweroff
Dec 9 2011, 11:14
Цитата(shadow86 @ Dec 9 2011, 14:33)

я понимаю, что такое динамическая индикация. мне не понятно где указано, чтоб МК зажигал сначала первую цыфру, потом ее тушил и включал вторую, массу подключал к индикатору, чтоли
ну так если индикация динамическая, рулит этим таймер, значит где? Правильно, в обработчике прерывания таймера
Код
__interrupt void Timer0_Ovf(void)
на выходы ставятся NPN коллектором на общий катод и эмиттером на землю
shadow86
Dec 11 2011, 22:13
так и не смог понять ((. скиньте пожалуйста текст программы для управления 3 знаковым 7-ми сегментным индикатором. Если это военная тайна, то скажите хотябы, как заставить МК переключаться между цыфрами? Высказывание:
Цитата
__interrupt void Timer0_Ovf(void)
- мне ниочем не сказало (((
toweroff
Dec 12 2011, 06:38
Цитата(shadow86 @ Dec 12 2011, 02:13)

так и не смог понять ((. скиньте пожалуйста текст программы для управления 3 знаковым 7-ми сегментным индикатором. Если это военная тайна, то скажите хотябы, как заставить МК переключаться между цыфрами? Высказывание: - мне ниочем не сказало (((
а почитать свою же программу и найти в ней эту строчку, посмотреть тело самой функции слабо?
учите С
shadow86
Dec 12 2011, 08:31
Это хороший совет - учить С, но как-то плохо он мне дается после Паскаля, тут одно и то же можно написать 10 способами, при этом одно на другое аж никак не похоже будет. Нахожу примеры похожие между собой по функционалу, а написанное совсем разное ((. Как то не по-людски в нём все! Ладно, верю, что разгадка где-то рядом.
О! Объясните, пожалуйста, русским языком:
DDRA = 0xFF;
PORTA = 0;
я понимаю, что написанное активизирует порт А для вывода, тоесть все его ножки работают как выходы, а как Вы бы написали если бы захотели например 2 ножки сделать выходами, 2 входами, потом еще 3 выходами и 1 входом, или так нельзя поступать с выходами одного порта?
toweroff
Dec 12 2011, 09:08
Цитата(shadow86 @ Dec 12 2011, 12:31)

или так нельзя поступать с выходами одного порта?
документацию на контроллер в руки и читать

Цитата(shadow86 @ Dec 12 2011, 12:31)

Это хороший совет - учить С, но как-то плохо он мне дается после Паскаля
нужно. Под контроллеры все пишется на С
Цитата(shadow86 @ Dec 12 2011, 12:31)

О! Объясните, пожалуйста, русским языком:
DDRA = 0xFF;
PORTA = 0;
я понимаю, что написанное активизирует порт А для вывода, тоесть все его ножки работают как выходы, а как Вы бы написали если бы захотели например 2 ножки сделать выходами, 2 входами, потом еще 3 выходами и 1 входом,
очень просто. Нужно соответствующие биты выставить в 1
DDRA = 0x80 | 0x40 | 0x0E;
В результате компилятор вычислит значение 0xCE и подставит в выражение. В двоичном виде это будет (11001110), что и требовалось. Но так неудобочитаемо
Лучше будет объявить значения битов (все равно где-то понадобится)
bits.h
Код
#ifndef __BITS_H__
#define __BITS_H__
#define BIT0 0x01
#define BIT1 0x02
#define BIT2 0x03
#define BIT3 0x04
#define BIT4 0x10
#define BIT5 0x20
#define BIT6 0x40
#define BIT7 0x80
#endif
а потом просто подключать эти объявления где нужно:
Код
#include "bits.h"
DDRA = BIT7 | BIT6 | BIT3 | BIT2 | BIT1;
shadow86
Dec 12 2011, 19:25
пожалуй, Ваш русский я тоже не понимаю ((. Объясните как полному идиоту: откуда мне взять эти
Цитата
соответствующие биты
, чтоб
Цитата
выставить в 1
.
Теперь совсем совсем запутался.. эти биты - это адреса ножек микросхемы? которые мне нужно сделать выводами данных..?
toweroff
Dec 12 2011, 19:40
Цитата(shadow86 @ Dec 12 2011, 23:25)

мдя...
даже в этой ветке есть 90% ответов как минимум... разбирайтесь
последний пост... убил
Цитата(shadow86 @ Dec 12 2011, 23:25)

пожалуй, Ваш русский я тоже не понимаю ((. Объясните как полному идиоту: откуда мне взять эти , чтоб .
Теперь совсем совсем запутался.. эти биты - это адреса ножек микросхемы? которые мне нужно сделать выводами данных..?
Мдя, вам не с С разбираться нужно, а с микроконтроллерами

'Биты' оттуда идут, а не от языка программирования.
shadow86
Dec 13 2011, 14:05
использовал мозговой штурм и разобрался немного с битами. прошу прощения за тупорылые вопросы..
запись
Цитата
#include "bits.h"
DDRA = BIT7 | BIT6 | BIT3 | BIT2 | BIT1;
включает нужные мне ножки как выходы, а остальные ножки порта автоматически будут входами? мне этого нигде объявлять не нужно?
или нужно написать:
"bits.h"
DDRA = BIT7 | BIT6 | BIT3 | BIT2 | BIT1;
PINA = BIT5 | BIT4 | BIT0;
shadow86
Dec 14 2011, 15:47
подскажите, пожалуйста, в каком виде эта запись 0x0C как ее понимать, переводить в десятичную или хотябы двоичную форму?
Цитата(shadow86 @ Dec 14 2011, 19:47)

подскажите, пожалуйста, в каком виде эта запись 0x0C как ее понимать, переводить в десятичную или хотябы двоичную форму?
Это шестнадцатиричная запись. В двоичном виде это будет 0000_1100 (подчеркивание добавил для наглядности)
shadow86
Dec 14 2011, 19:07
Спасибо большое! Двигаюсь дальше..
shadow86
Dec 16 2011, 20:46
И снова здравствуйте, уважаемые программисты!
в неравном бою с CodeVisionAVR побеждает машина! Бился над ним 3 дня, вцелом, достиг некоторых успехов (это мое личное мнение), но голова уже трещит.. Помогите запустить этот счетчик, чтоб его.. В приложенном файле текст программы, которую удалось сложить из кусков разных программ и которая благополучно не работает (((((((((. Как его перетасовать, чтоб входные импульсы в ножки РА1 считасись МК и выводились на 3 розрядный 7 сегментный индикатор???

Вот последняя более-менее подходящая наработка
Нажмите для просмотра прикрепленного файла тут происходит индикация, но вторая и третья цифры при выводе одинаковы ((( помогите это исправить
У вас неправильно вычисляется средняя цифра (в процедуре IND_Conv). Ошибка в строке 48
shadow86
Dec 17 2011, 20:34
вот исправил недочет, на который Вы мне указали, но все равно выводит не корректно (((((. Подскажите, пожалуйста, где бок?
shadow86
Dec 18 2011, 07:28
Спасибо всем за участие! Разобрался! Теперь счетчик выводит корректно. Добавить еще немного штрихов и можно запускать живую модель. )))
Извиняюсь за глупые вопросы и благодарен за помощь ))
shadow86
Dec 18 2011, 18:45
Уважаемые программисты, подскажите, пожалуйста, где мне (и что) добавить, чтоб программа считала импульсы в течение 46с и выдавала на индикатор последнее посчитанное значение, тоесть спустя 46с показало первый раз, а потом через 46с обновило показание и так далее.
вот текст моей программы:
Нажмите для просмотра прикрепленного файла