|
Счетчик импульсов с выводом на 7-ми сегментный индикатор, Помогите, пожалуйста, создать схему |
|
|
|
Dec 6 2011, 20:11
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

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

Группа: Участник
Сообщений: 48
Регистрация: 18-02-06
Из: Москва
Пользователь №: 14 482

|
Цитата(shadow86 @ Dec 7 2011, 00:11)  количество импульсов со счетчика будет численно равно уровню радиации в мкР/ч. 3600/78=46,15 секунд ? Правильно Цитата(shadow86 @ Dec 7 2011, 00:11)  С МК пока не работаю - нет программатора Это - главная ошибка. ATtiny26, да и любой похожий решит все проблемы, в том числе накачку 400вольт и всяческий пересчет, том более, что нельзя тупо считать импульсы за 46сек, нужно вводить программный фильтр для сглаживания показаний, без него цифры будут скакать. Программатор делается из резисторов и проводов от LPT. А жесткую логику в этом случае нужно забыть.
|
|
|
|
|
Dec 7 2011, 05:44
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
Спасибо, Air77! так, если использовать МК, то я могу применить 3-х значный индикатор с динамическим управлением. А что Вы говорите насчет програмной фильтрации? Я на осциллографе наблюдал импульсы после СБМ и засекал их количество по секундомеру: за 46 секунд получалось 17, 16, 17, 17, 16, 18, 17.. Вы имеету ввиду осреднять что-ли? Скиньте, пожалуйста ссылку на какой нибудь простой программатор. И проще его сделать через COM или LPT все-же? у меня есть провод переходник USB->COM смогу ли я через него подключаться как через COM? А программируемая логика - о таком я еще не слышал. Спасибо, YIG, за новое для меня направление! Почитаю, прикину. )
|
|
|
|
|
Dec 7 2011, 08:57
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
я думал над стрелочным индиктором, но выбор был сделан в пользу цыфровой индикации, из-за большей наглядности + планирую, как Вы Tanya и предложили, каждую частицу встречать вспышкой отдельно выведенного светодиода и звуровым сопровождением. ))
|
|
|
|
|
Dec 7 2011, 09:52
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
подскажите, пожалуйста простенькую схему программатора через СОМ-порт, желательно. И будет ли работать такой программатор через USB->COM переходник? вот наткнулся на простую схему программатора
, будет ли он работать через переходник?
Сообщение отредактировал shadow86 - Dec 7 2011, 09:58
|
|
|
|
|
Dec 7 2011, 10:12
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
Спасибо, Tanya, но душа просит цыфр )).
|
|
|
|
|
Dec 7 2011, 10:15
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

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

Частый гость
 
Группа: Участник
Сообщений: 136
Регистрация: 7-01-09
Из: Нефтеюганск
Пользователь №: 42 967

|
Цитата(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», то всё-равно скорость будет всё-равно настолько низкой, что единственное осмысленное его применение — прошивка собственного микроконтроллера программатора.
--------------------
С уважением, Алексей Шапошников.
|
|
|
|
|
Dec 7 2011, 10:36
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
эти схемы сложнее в повторении (. а приведенная мной схема даст возможность программировать ATtiny26 через реальный COM? и для того, чтоб подключить микроконтроллер к схеме, мне нужно его вставить в соответствующую колодку и включить ему питание VCC=+5В. я правильно понимаю?
|
|
|
|
|
Dec 7 2011, 11:04
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
Вы совершенно правы, Tanya, индикация должна хорошо читаться и при дневном свете и в темноте, а яркость (и как следствие, потребление тока индикатором) будет меняться ).
|
|
|
|
|
Dec 7 2011, 11:11
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

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

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
Есть возможность купить TIC71, Вы такой наподобие имеете ввиду? можно и с этим поэкспериментировать ))
|
|
|
|
|
Dec 7 2011, 13:54
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
Аааааа!!! Собрал свою схему и Uniprof мне показала наличие моего МК и его содержимое!!! )))))))) Теперь я непобедЮм!!! Столько эмоций испытал, сродни тому, как запустил свой первый УНЧ ))))). Так теперь можно приниматься за реализацию задуманного! Уверен, будет еще оооочень большая куча вопросов. Спасибо всем за советы! Теперь только тема по-настоящему открывается!
Сообщение отредактировал shadow86 - Dec 7 2011, 13:54
|
|
|
|
|
Dec 7 2011, 16:37
|

Voltage Control Output
     
Группа: Свой
Сообщений: 4 598
Регистрация: 21-07-09
Из: Kursk
Пользователь №: 51 436

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

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

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

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата(rx3apf @ Dec 7 2011, 23:13)  Делитель на вход ADC. Ох , не надо ему пока этого . Тем более Цитата Источник 400В получился, им я доволен Сначала сделать вывод , а уж потом убрать источник и подключать ADC, таймер и прерывания
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Dec 7 2011, 19:51
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
ATtiny26 - его же можно перепрограммировать много раз? не один и на всю жизнь? И когда я закончу его прошивать, мне нужно будет лишь отключить +5В и можно выковыривать микросхему из гнезда? или нужно еще и удлиннительный шнур вынуть из COM? Вот эти вопросы меня всегда волновали, а ответ на них Google мне так и не дал (. Поясните, пожалуйста, начинающему ). P.S.: а втыкать МК в гнездо программатора можно, если программатор подключен к COM порту, или сначала вынуть из COM, а потом втыкать МК?
Сообщение отредактировал shadow86 - Dec 7 2011, 19:53
|
|
|
|
|
Dec 7 2011, 20:18
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата не один и на всю жизнь? Это как захотите Цитата мне нужно будет лишь отключить +5В и можно выковыривать микросхему из гнезда? или нужно еще и удлиннительный шнур вынуть из COM? Лучше всего всегда полностью "обесточить" MC , а потом проводить с ним "втыкание - вытыкание"
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Dec 7 2011, 21:11
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
Спасибо! Я так и предпологал, но теперь знаю точно )
|
|
|
|
|
Dec 8 2011, 08:26
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
ААААА! У меня сейчас взорвется мосК! Объясните дураку: Пример 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, 08:28
|
|
|
|
|
Dec 8 2011, 09:32
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

|
Цитата(shadow86 @ Dec 8 2011, 12:26)  //порт, к которому подкл. сегменты PORTB = 0xff; DDRB = 0xff - это тут все порта задействуются или один порт В? Порт - это типично 8 (или меньше) линий ввода-вывода. В данном случае восемь линий настраиваются на вывод. Цитата И что это значит? : unsigned char number[] = { 0x3f, //0 0x06, //1 .... Таблица преобразования десятичной цифры в ее "семисегментное" представление. Делается, исходя из необходимого соответствия бита порта и сегмента.
|
|
|
|
|
Dec 8 2011, 21:01
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
Насчет порта и входов-выводов понял и осознал, а вот как указать на какой ножке порта какой сегмент выводится будет? и Цитата Таблица преобразования десятичной цифры в ее "семисегментное" представление. Делается, исходя из необходимого соответствия бита порта и сегмента. - эта таблица одна для всех МК? Подойдет ли она мне для ATtiny26?
Сообщение отредактировал shadow86 - Dec 8 2011, 21:02
|
|
|
|
|
Dec 9 2011, 01:38
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Это - массив байтов, каждый байт содержит 7 значащих бит (начиная с младшего - судя по всему, старший не используется. Его обычно на точку сажают), в которых единица "зажигает" соответствующий сегмент (хотя странно... обычно катод к земле коммутируют... или я так привык?  ) соответственно, команда Код PORTB = number[data2]; запишет в порт значение элемента массива number с индексом data2 нумерация элементов с нуля Цитата(shadow86 @ Dec 9 2011, 01:01)  эта таблица одна для всех МК? Подойдет ли она мне для ATtiny26? она подойдет для любого А там уж как ножки порта B подключите  разберитесь, какой бит за какой сегмент отвечает и все станет просто
|
|
|
|
|
Dec 9 2011, 05:23
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
Понял! У ATtiny26 есть два порта ввода-вывода данных, которые подключеня к своим 8-ми ножкам микросхемы, от меня требуется найти соответствее сегментов индикатора ножкам МК. Эта программа на 2 цыфры (только не пойму, где в коде ее это указано), а чтоб добавить еще один розряд индикации, что мне и куда нужно дописать?
|
|
|
|
|
Dec 9 2011, 10:33
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
я понимаю, что такое динамическая индикация. мне не понятно где указано, чтоб МК зажигал сначала первую цыфру, потом ее тушил и включал вторую, массу подключал к индикатору, чтоли
|
|
|
|
|
Dec 9 2011, 11:14
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Цитата(shadow86 @ Dec 9 2011, 14:33)  я понимаю, что такое динамическая индикация. мне не понятно где указано, чтоб МК зажигал сначала первую цыфру, потом ее тушил и включал вторую, массу подключал к индикатору, чтоли ну так если индикация динамическая, рулит этим таймер, значит где? Правильно, в обработчике прерывания таймера Код __interrupt void Timer0_Ovf(void) на выходы ставятся NPN коллектором на общий катод и эмиттером на землю
|
|
|
|
|
Dec 11 2011, 22:13
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
так и не смог понять ((. скиньте пожалуйста текст программы для управления 3 знаковым 7-ми сегментным индикатором. Если это военная тайна, то скажите хотябы, как заставить МК переключаться между цыфрами? Высказывание: Цитата __interrupt void Timer0_Ovf(void) - мне ниочем не сказало (((
|
|
|
|
|
Dec 12 2011, 08:31
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

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

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Цитата(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;
|
|
|
|
|
Dec 12 2011, 19:25
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
пожалуй, Ваш русский я тоже не понимаю ((. Объясните как полному идиоту: откуда мне взять эти Цитата соответствующие биты , чтоб Цитата выставить в 1 . Теперь совсем совсем запутался.. эти биты - это адреса ножек микросхемы? которые мне нужно сделать выводами данных..?
|
|
|
|
|
Dec 13 2011, 14:05
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

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

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
подскажите, пожалуйста, в каком виде эта запись 0x0C как ее понимать, переводить в десятичную или хотябы двоичную форму?
|
|
|
|
|
Dec 14 2011, 19:07
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
Спасибо большое! Двигаюсь дальше..
|
|
|
|
|
Dec 16 2011, 20:46
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
И снова здравствуйте, уважаемые программисты! в неравном бою с CodeVisionAVR побеждает машина! Бился над ним 3 дня, вцелом, достиг некоторых успехов (это мое личное мнение), но голова уже трещит.. Помогите запустить этот счетчик, чтоб его.. В приложенном файле текст программы, которую удалось сложить из кусков разных программ и которая благополучно не работает (((((((((. Как его перетасовать, чтоб входные импульсы в ножки РА1 считасись МК и выводились на 3 розрядный 7 сегментный индикатор???  Вот последняя более-менее подходящая наработка
M4.rar ( 899 байт )
Кол-во скачиваний: 88 тут происходит индикация, но вторая и третья цифры при выводе одинаковы ((( помогите это исправить
Сообщение отредактировал shadow86 - Dec 16 2011, 22:09
|
|
|
|
|
Dec 17 2011, 20:34
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
вот исправил недочет, на который Вы мне указали, но все равно выводит не корректно (((((. Подскажите, пожалуйста, где бок?
Сообщение отредактировал shadow86 - Dec 18 2011, 07:25
|
|
|
|
|
Dec 18 2011, 07:28
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
Спасибо всем за участие! Разобрался! Теперь счетчик выводит корректно. Добавить еще немного штрихов и можно запускать живую модель. ))) Извиняюсь за глупые вопросы и благодарен за помощь ))
|
|
|
|
|
Dec 18 2011, 18:45
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
Уважаемые программисты, подскажите, пожалуйста, где мне (и что) добавить, чтоб программа считала импульсы в течение 46с и выдавала на индикатор последнее посчитанное значение, тоесть спустя 46с показало первый раз, а потом через 46с обновило показание и так далее. вот текст моей программы:
M4.rar ( 787 байт )
Кол-во скачиваний: 84
|
|
|
|
|
Dec 18 2011, 19:21
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(shadow86 @ Dec 18 2011, 22:45)  Уважаемые программисты, подскажите, пожалуйста, где мне (и что) добавить, чтоб программа считала импульсы в течение 46с и выдавала на индикатор последнее посчитанное значение, Для этого вам надо отсчитать 46 секунд. Единственное место у вас, где есть какая то известная периодичность - это динамическое сканирование индикатора (прерывание от таймера), вот в нем и отсчитывайте. Как насчитаете - копируйте накопленное значение счетчика в переменную, из которой и будете выводить на индикаторы, а счетчик сбрасывайте
|
|
|
|
|
Dec 19 2011, 11:03
|
Частый гость
 
Группа: Участник
Сообщений: 78
Регистрация: 24-01-06
Из: Ярославль
Пользователь №: 13 558

|
Цитата(shadow86 @ Dec 7 2011, 00:11)  чтоб во время счетного периода выводилось последнее посчитанное число импульсов, а не 1, 2, 3, .. и т.д. буферизуй индикацию регистрами-защелками (ИР24 или им подобными)по окончанию счета, и не надо микроконтроллера будет
--------------------
Разработка электронных устройств. Радиомонтаж. Ремонт оборудования в Ярославле i-link@bk.ru
|
|
|
|
|
Dec 23 2011, 13:31
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
Попробывал соеденить один из выходов-катодов с еще одной ножкой-входом, чтоб считать изменения уровня на этой ножке и от него отталкиваясь, получить 46с задержки, но что-то опять не получается (( . . . PORTA.3 = 0; DDRA.3 = 0; PORTA.4 = 0; DDRA.4 = 0; ACSR = 0x80; #asm("sei"); while(1){ while (PINA.3 == 1) {counterProg++;} // регистрирую изменение уровня на входе РА3 (соединенного с одним из зажигаемых катодов индикатора) while (PINA.4 == 1){} //считаю импульсы {imp ++;} while (PINA.4 == 0){} if (imp >= 1000) { imp -= 1000; } if (counterProg == 10) { //обнуляю количество импульсов imp = 0; counterProg = 0;} IND_Conv(imp); //вывожу количество имп. за счетный период на индикатор }
|
|
|
|
|
Dec 23 2011, 14:05
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
вот вам легко говорить... у меня 0-й работает на динамическую индикацию. когда пытаюсь запустить 1-й, то фигня какая-то получается.. либо индикация отказывает, либо счет останавливается.. не могу победить пока что использование 2 счетчиков-таймеров одновременно (((
|
|
|
|
|
Dec 23 2011, 14:37
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
а как это должно выглядеть? у меня вынесена отдельная функция на динамику: void IND_Update(void) { static unsigned char count = 0;
PORT_K &= ~((1<<KAT1)|(1<<KAT2)|(1<<KAT3)); PORT_IND = data[count]; { if (count == 0) { PORT_K |= (0<<KAT1); PORT_K |= (1<<KAT2); PORT_K |= (1<<KAT3); } if (count == 1){ PORT_K |= (0<<KAT2); PORT_K |= (1<<KAT1); PORT_K |= (1<<KAT3); } if (count == 2) { PORT_K |= (0<<KAT3); PORT_K |= (1<<KAT1); PORT_K |= (1<<KAT2); } count++; if (count == 3) {count = 0;} } } допустим, я могу повышать еще некоторую переменную на ряду с count, а как потом мне ее значение вынести в тело основной программы?
|
|
|
|
|
Dec 24 2011, 08:40
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
M4.rar ( 953 байт )
Кол-во скачиваний: 71Вот моя программа Она считает импульсы на РА3 и выводит их количество на 3-х знаковый 7-ми сегментный индикатор.
|
|
|
|
|
Dec 27 2011, 09:28
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
Вот попробывал добавить функцию на счет некоторой переменной.. ПОМОГИТЕ ПОЖАЛУЙСТА!!! У меня уже фантазия иссякла
#include <tiny26.h>
unsigned char number[] = { 0x3f, //0 0x06, //1 0x5b, //2 0x4f, //3 0x66, //4 0x6d, //5 0x7d, //6 0x07, //7 0x7f, //8 0x6f //9 };
#define PORT_IND PORTB #define DDR_IND DDRB #define PORT_K PORTA #define DDR_K DDRA #define KAT1 0 #define KAT2 1 #define KAT3 2
volatile unsigned char data[3]; static unsigned int time; void IND_Init(void) { //порт, к которому подкл. сегменты PORT_IND = 0xff; DDR_IND = 0xff; //порт, к которому подкл. катод PORT_K &= ~((1<<KAT1)|(1<<KAT2)|(1<<KAT3)); DDR_K |= ((1<<KAT1)|(1<<KAT2)|(1<<KAT3));
data[0] = 0; data[1] = 0; data[2] = 0; }
void IND_Conv(unsigned int value) { unsigned char tmp0, tmp1, tmp2; tmp0=tmp1=0; while (value >= 100) { value -= 100; tmp0++; } while (value >= 10) { value -= 10; tmp1++; } tmp2 = value; data[0]=number[tmp0]; //вывод сотен data[1]=number[tmp1]; //вывод десятков data[2]=number[tmp2]; //вывод единиц }
void IND_Update(void) { static unsigned char count = 0; PORT_K &= ~((1<<KAT1)|(1<<KAT2)|(1<<KAT3)); PORT_IND = data[count]; { if (count == 0) { PORT_K |= (0<<KAT1); PORT_K |= (1<<KAT2); PORT_K |= (1<<KAT3); } if (count == 1){ PORT_K |= (0<<KAT2); PORT_K |= (1<<KAT1); PORT_K |= (1<<KAT3); } if (count == 2) { PORT_K |= (0<<KAT3); PORT_K |= (1<<KAT1); PORT_K |= (1<<KAT2); } count++; if (count == 3) {count = 0;} } }
int Wait (void) { time++; return time; } unsigned int imp = 0; void main( void ) { IND_Init(); //инициализация таймера Т0 //частота прерываний 50Гц при частоте кварца 4МГц TIMSK = (1<<TOIE0); TCCR0 = (1<<CS02)|(0<<CS01)|(1<<CS00); TCNT0 = 0xb2; PORTA.3 = 1; DDRA.3 = 0; TCCR1A = (1<<CS13)|(0<<CS12)|(0<<CS11)|(1<<CS10); TCNT1 = 0x00; #asm("sei"); while(1){ while (PINA.3 == 1){} {imp ++;} while (PINA.3 == 0){} if (imp >= 1000) { imp -= 1000; }
IND_Conv(imp); if (Wait()>=10){ time=0; imp=0;} } }
//прерывания таймера Т0 - вывод на индикатор interrupt [TIM0_OVF] void Timer0Ovf(void) { TCNT0 = 0xb2; IND_Update(); Wait(); }
|
|
|
|
|
Dec 27 2011, 09:59
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Поскольку у Вас таймер "тикает" с частотой 50 Гц (верю Вам на слово), то за 49 сек таймер "натикает" 50 * 49 = 2450 раз. Поэтому: Код unsigned int t= 0;
//прерывания таймера Т0 - вывод на индикатор interrupt [TIM0_OVF] void Timer0Ovf(void) { TCNT0 = 0xb2; if(++t >= 2450) { t=0; IND_Conv(imp); imp= 0; } IND_Update(); } Возникает проблема с неатомарностью изменения переменной imp в функции main. Там, где эта переменная изменяется в main - необходимо обрамить командами запрета и разрешения прерывания. PS. Другое решение: не трогать переменную imp в обработчике прерывания от таймера, а по истечению 49 сек взвести некий флаг, а уж в main этот флаг анализировать, и, по нему вызывать IND_Conv и сбрасывать imp : Код unsigned int t= 0; volatile char flag= 0;
в main ........ if(flag) { flag=0; IND_Conv(imp); imp= 0; } ........ //прерывания таймера Т0 - вывод на индикатор interrupt [TIM0_OVF] void Timer0Ovf(void) { TCNT0 = 0xb2; if(++t >= 2450) { t=0; flag= 1; } IND_Update(); }
|
|
|
|
|
Jan 4 2012, 20:05
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
Всех с новым годом!!! Спасибо огромное, Палыч!
|
|
|
|
|
Feb 2 2012, 11:59
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
Снова здравствуйте, уважаемые программисты! У меня такой вопрос образовался: если я не хочу применять кварц для тактирования МК, а хочу, чтоб он от внутреннего генератора на 1МГц работал, мне в программе что-либо указывать нужно, или он по умолчанию от него запустится?
|
|
|
|
|
Feb 5 2012, 16:40
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
спасибо! буду теперь с этим разбираться..
|
|
|
|
|
Mar 19 2012, 00:48
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
Уважаемые форумчане, помогите разобраться с очередным бзиком моего Гейгера. Преобразователь на питание МК из 2.4В в 5В работает идеально: напряжение 5.02В, пульсации не вижу на осциллографе даже при максимальном усилении. На вход МК (РВ4) подаю сформированные подготовленные импульсы с ждущего мультивибратора на к155аг1 (пробовал разные длительности: от 0.1с до 0.1мс), а после заданного промежутка времени и счета на индикатор выводятся какие-то космические значения (как я заметил, кратные 10)!!! которых в принципе быть не может - вместо 11-17 -- 510-820. Как понимать что он считает и как это исправить??? на питании МК стоит 10мк+0.1мк потом дроссель на 10мкГн потом 0.1мк; после преобразователя - 0.1мк+220мк+1500мк. я так понимаю, что по входу идет наводка. как бы ее зашунтировать?
|
|
|
|
|
Mar 19 2012, 05:15
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
Спасибо за совет, Олег! Попробую так.
|
|
|
|
|
Mar 19 2012, 08:51
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
Спасибо большое за внимание! разобрался! это не наводка была по входу.. а кривые руки.. при изготовлении платы индикатора отзеркалил 1 и 3 разряд, вот у меня 3-х значные числа и лезли ))).
|
|
|
|
|
Mar 25 2012, 17:54
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
А подскажите, пожалуйста, как должен выглядеть текст программы, если я хочу сделать короткий звуковой сигнал с одной из ножек МК, который будет звучать при появлении счетного импульса на входной ножке? Интересует момент формирования звука.
Сообщение отредактировал shadow86 - Mar 25 2012, 17:58
|
|
|
|
|
Mar 26 2012, 10:09
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
спасибо за ответ! Бум стараться )
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|