Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.84/135: Рейтинг темы: голосов - 135, средняя оценка - 4.84
TyomiMIT
0 / 0 / 0
Регистрация: 22.11.2012
Сообщений: 19
1

частотомер на atmega8

25.11.2012, 23:19. Просмотров 25711. Ответов 18
Метки нет (Все метки)

всем доброго времени.

Ох... вот и я пришел со своей проблемой. Обычно помощи просят у меня, но вот и мне понадобилась помощь. Я заканчиваю универ, и хочу для дипломной создать один проект. Но для реализации оного, мне понадобился частотомер, и я решил создать его сам. и столкнулся с проблемой.
Короче я написал код и начал проверять в протеусе. там все работает как нельзя лучше. частота считывается вплоть до 1Гц. но когда дело перешло в железо, прибор правильно работать отказывается. подаю на T1 тики, он выдает случайные цифры.

Вроде бы схема простая но что то не сходится


код тоже простой. на си
Код
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define F_CPU 4000000UL
int g=0;
int i;
int kg=0;
int num[10]={
0b11000000,
0b11001111,
0b10100100,
0b10000110,
0b10001011,
0b10010010,
0b10010000,
0b11000111,
0b10000000,
0b10000010};
int str[4]={0};

ISR(TIMER0_OVF_vect)
{// прерывание по переполнению T0
if(g>15625)
{// через секунду подсчитать количество тиков
str[0]=TCNT1/1000;
i=TCNT1%1000;

str[1]=i/100;
i=i%100;

str[2]=i/10;
str[3]=i%10;

g=0;
TCNT1=0;

}
g++;
}

int main(void)
{
DDRB=0xff;
DDRC=0xff;

PORTB=0x00;
PORTC=0xff;
TCCR0 |= (1<<CS00)|(0<<CS01)|(0<<CS02);
TCCR1B |= (1<<CS10)|(1<<CS11)|(1<<CS12);
TIMSK |= (1<<TOIE0);
sei();
while(1)
{
for(i=0; i<4; i++)
{
PORTB = num[str[i]];

if(i==0)
PORTC = 0b00000010;
if(i==1)
PORTC = 0b00001000;
if(i==2)
PORTC = 0b00000100;
if(i==3)
PORTC = 0b00000001;
_delay_ms(1);
PORTB=0xff;
}
}
}
в общем посоветуйте что да как. Может альтернативу какую..
Благодарю за потраченное время.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2012, 23:19
Ответы с готовыми решениями:

Частотомер-Тахометр на Atmega8
Доброго времени суток дорогие посетители форума ! Возникла идея сделать электронное управление...

Разница между ATMEGA8-16AI и ATMEGA8-16AU
Кто подскажет, в чем разница между ATMEGA8-16AI и ATMEGA8-16AU. Смотрю в Платане цены между ними...

Частотомер.
Делаю частотомер для струнного датчика с автогенератором, сигнал на выходе 0,3 В прямоугольный от 2...

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

Частотомер
Привет всем, есть программа таймера ( частотомера) написана на ассемблере, в протеусе проверил сам...

18
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
25.11.2012, 23:54 2
Цитата Сообщение от TyomiMIT
Код:
str[0]=TCNT1/1000;

Я стесняюсь спросить, разве можно так использовать РВВ, состоящий из двух восьмибитных? Может надо сперва что то типа “count = (TCNT1H<<8)| TCNT1L;" ?
0
TyomiMIT
0 / 0 / 0
Регистрация: 22.11.2012
Сообщений: 19
26.11.2012, 00:01 3
Цитата Сообщение от tyzord66
Цитата Сообщение от TyomiMIT
Код:
str[0]=TCNT1/1000;

Я стесняюсь спросить, разве можно так использовать РВВ, состоящий из двух восьмибитных? Может надо сперва что то типа “count = (TCNT1H<<8)| TCNT1L;" ?

В этой точке все равно дробное отбрасывается...
0
яверт
0 / 0 / 0
Регистрация: 15.06.2012
Сообщений: 3,097
26.11.2012, 00:56 4
1. Глобальные переменные изменяемые в прерываниях надо декларировать как volatile.
2. Переменную i прерывание может изменить в самый не подходящий момент, например перед вызовом PORTB = num[str[i]];.
0
26.11.2012, 00:56
swk
0 / 0 / 0
Регистрация: 22.10.2015
26.11.2012, 09:31 5
Цитата Сообщение от TyomiMIT
в общем посоветуйте что да как. Может альтернативу какую...
http://www.cqham.ru/cons_trx.htm#10
Частотомеры, цифровые шкалы, ЦАПЧ :

Универсальный цифровой частотомер на процессоре AT89C2051. Д. Hечитайлов (UU9JDR).

Малогабаритный частотомер - цифровая шкала с ЖКИ дисплеем. И. Максимов

Универсальная цифровая шкала - частотомер с функцией ЦАПЧ. И. Максимов

Частотомер-цифровая шкала 100 кГц - 1500 МГц. И. Максимов

Частотомер - цифровая шкала. Ю. Савельев (RA3RUP)

Частотомер с использованием метода досчета.

Частотомер – цифровая шкала 10КГц –150МГц. Ю. Савельев (RA3RUP)

Частотомер 30/1200 MHz.

Цифровая шкала на PIC. P. Hotycky (OM3CPH)

Цифровая шкала c ЦАПЧ. И.А. Доброхотов (UN7GM)

ЦАПЧ для трансивера Л.Вербицкий (UR5LAK)

Цифровая шкала "ГЕРАНЬ" В. Тищенко (UR1MI).

Цифровой частотомер. В. Гвоздев (RU3AEP)

Цифровая шкала - частотомер на PIC16F84. А. Денисов (RA3RBE)

Цифровая шкала / частотомер на процессоре pic16f84(a) Аникин Днитрий (RW4LED)

Доработка цифровой шкалы – частотомера А.Денисова. И. Часовский (UR6HCP).

Цифровая шкала - частотомер с ЖК индикатором. А. Денисов (RA3RBE)

Цифровая шкала - частотомер с ЖК индикатором и автоподстройкой частоты. А. Денисов

Цифровая шкала-частотомер Сергей Сапотько (EW2AH).

Частотомер - цифровая шкала на PIC16CE625 (PIC16F84). Н. Хлюпин (RA4NAL).

Цифровой частотомер на микроконтроллере КР1830ВЕ31. Н. Хлюпин (RA4NAL).

Частотомер до 450 МГц

Частотомер - цифровая шкала с жидкокристаллическим индикатором.
Н. Хлюпин (RA4NAL).

Частотомер шкала для UW3DI. Э.Ю. Дергаев (UA4NX)
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
26.11.2012, 13:32 6
Гы..... индикатор перевернутый, эт специально..... или нечайно.....

Кстати я как то тоже баловался ентой темой, вот тут что получилось http://asis-kbr.ru/forum/viewtopys.php?f=11&t=125
Путем шлифовки напильником, можно оставить один 4-х разрядный индикатор, подвинув показания в нужную сторону.....
0
domis
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 82
26.11.2012, 14:21 7
Фьюзы в контроллере правильно прошиты?
0
TyomiMIT
0 / 0 / 0
Регистрация: 22.11.2012
Сообщений: 19
26.11.2012, 16:36 8
Цитата Сообщение от SWK
Цитата Сообщение от TyomiMIT
в общем посоветуйте что да как. Может альтернативу какую...
http://www.cqham.ru/cons_trx.htm#10
Частотомеры, цифровые шкалы, ЦАПЧ :

Универсальный цифровой частотомер на процессоре AT89C2051. Д. Hечитайлов (UU9JDR).

Малогабаритный частотомер - цифровая шкала с ЖКИ дисплеем. И. Максимов

Универсальная цифровая шкала - частотомер с функцией ЦАПЧ. И. Максимов

Частотомер-цифровая шкала 100 кГц - 1500 МГц. И. Максимов

Частотомер - цифровая шкала. Ю. Савельев (RA3RUP)

Частотомер с использованием метода досчета.

Частотомер – цифровая шкала 10КГц –150МГц. Ю. Савельев (RA3RUP)

Частотомер 30/1200 MHz.

Цифровая шкала на PIC. P. Hotycky (OM3CPH)

Цифровая шкала c ЦАПЧ. И.А. Доброхотов (UN7GM)

ЦАПЧ для трансивера Л.Вербицкий (UR5LAK)

Цифровая шкала "ГЕРАНЬ" В. Тищенко (UR1MI).

Цифровой частотомер. В. Гвоздев (RU3AEP)

Цифровая шкала - частотомер на PIC16F84. А. Денисов (RA3RBE)

Цифровая шкала / частотомер на процессоре pic16f84(a) Аникин Днитрий (RW4LED)

Доработка цифровой шкалы – частотомера А.Денисова. И. Часовский (UR6HCP).

Цифровая шкала - частотомер с ЖК индикатором. А. Денисов (RA3RBE)

Цифровая шкала - частотомер с ЖК индикатором и автоподстройкой частоты. А. Денисов

Цифровая шкала-частотомер Сергей Сапотько (EW2AH).

Частотомер - цифровая шкала на PIC16CE625 (PIC16F84). Н. Хлюпин (RA4NAL).

Цифровой частотомер на микроконтроллере КР1830ВЕ31. Н. Хлюпин (RA4NAL).

Частотомер до 450 МГц

Частотомер - цифровая шкала с жидкокристаллическим индикатором.
Н. Хлюпин (RA4NAL).

Частотомер шкала для UW3DI. Э.Ю. Дергаев (UA4NX)

Премного благодарен за ресурс. Много полезного узнал.
0
TyomiMIT
0 / 0 / 0
Регистрация: 22.11.2012
Сообщений: 19
26.11.2012, 16:44 9
Цитата Сообщение от ShodS
Гы..... индикатор перевернутый, эт специально..... или нечайно.....

Кстати я как то тоже баловался ентой темой, вот тут что получилось http://asis-kbr.ru/forum/viewtopys.php?f=11&t=125
Путем шлифовки напильником, можно оставить один 4-х разрядный индикатор, подвинув показания в нужную сторону.....
Да. Я использую сегментник от старого ДВД плеера. Он немного нестандартный. Спасибо за код, посмотрю что получится из него.
0
TyomiMIT
0 / 0 / 0
Регистрация: 22.11.2012
Сообщений: 19
26.11.2012, 16:54 10
Цитата Сообщение от яверт
1. Глобальные переменные изменяемые в прерываниях надо декларировать как volatile.
2. Переменную i прерывание может изменить в самый не подходящий момент, например перед вызовом PORTB = num[str[i]];.
1. зачем в volatile. это вроде что то связанное с потоками на C#
2. при выводе на порт, i находится в цикле. что ее может затронуть?
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
26.11.2012, 17:25 11
А ничего что у тебя
#include <util/delay.h>
идет раньше чем
#define F_CPU 4000000UL

Помоему #define F_CPU 4000000UL надо ставить до #include <util/delay.h>
0
Финский
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
26.11.2012, 17:38 12
Код
 for(i=0; i<4; i++)
{
PORTB = num[str[i]];

if(i==0)
PORTC = 0b00000010;
if(i==1)
вот здесь, ВНЕЗАПНО - прерывание, в котором
i=i%100;

PORTC = 0b00001000;
if(i==2)
PORTC = 0b00000100;
if(i==3)
PORTC = 0b00000001;
_delay_ms(1);
PORTB=0xff;
}
Жалко было еще одну переменную завести?

2. при выводе на порт, i находится в цикле. что ее может затронуть?
Прерывание - оно на то и прерывание, чтобы не обращать внимание на циклы.
0
яверт
0 / 0 / 0
Регистрация: 15.06.2012
Сообщений: 3,097
26.11.2012, 17:54 13
Цитата Сообщение от TyomiMIT
1. зачем в volatile. это вроде что то связанное с потоками на C#
Квалификатор volatile есть во многих C style языках, в C он позволяет указать компилятору что переменная может быть изменена в параллельном потоке/прерывании и компилятор не будет оптимизировать её чтение.
0
TyomiMIT
0 / 0 / 0
Регистрация: 22.11.2012
Сообщений: 19
26.11.2012, 19:16 14
Цитата Сообщение от Финский
Код:
for(i=0; i<4; i++)
{
PORTB = num[str[i]];

if(i==0)
PORTC = 0b00000010;
if(i==1)
вот здесь, ВНЕЗАПНО - прерывание, в котором
i=i%100;

PORTC = 0b00001000;
if(i==2)
PORTC = 0b00000100;
if(i==3)
PORTC = 0b00000001;
_delay_ms(1);
PORTB=0xff;
}
Жалко было еще одну переменную завести?

2. при выводе на порт, i находится в цикле. что ее может затронуть?
Прерывание - оно на то и прерывание, чтобы не обращать внимание на циклы.

Благодарю, буду знать.
0
TyomiMIT
0 / 0 / 0
Регистрация: 22.11.2012
Сообщений: 19
26.11.2012, 19:31 15
Слушайте, а как можно организовать что то вроде "замыкателя" на транзисторе. например я использую звуковой генератор в котором можно выдавать как синусоиду, так и прямоугольные и пилообразные импульсы. При этом, чтобы контроллер мог подсчитать эти импульсы. может кто схему подскажет.
0
foxyt
0 / 0 / 0
Регистрация: 25.01.2010
Сообщений: 255
26.11.2012, 20:07 16
Цитата Сообщение от TyomiMIT
в общем посоветуйте что да как. Может альтернативу какую..
На мой взгляд частотомер FC-510 от ЛИ - один лучших на просторах нашего интернета.
http://rodyokot.ru/forum/viewtopys.php?f=10&t=65025
http://www.cqham.ru/forum/showthread.php?t=20109
0
btymdmom
0 / 0 / 0
Регистрация: 01.02.2011
Сообщений: 275
26.11.2012, 22:02 17
Цитата Сообщение от tyzord66
Я стесняюсь спросить, разве можно так использовать РВВ, состоящий из двух восьмибитных? Может надо сперва что то типа “count = (TCNT1H<<8)| TCNT1L;" ?
Не только можно, но и нужно. Такая запись обеспечивает правильный порядок чтения/записи байтов - читаем сначала младший, потом старший, пишем - наоборот. Если же читать/писать раздельно старший и младший - всегда надо помнить, в каком порядке нужно обращаться к байтам. (TCNT1H<<8)| TCNT1L - будет читать мусор.
0
TyomiMIT
0 / 0 / 0
Регистрация: 22.11.2012
Сообщений: 19
26.11.2012, 22:30 18
Цитата Сообщение от btymdmom
Цитата Сообщение от tyzord66
Я стесняюсь спросить, разве можно так использовать РВВ, состоящий из двух восьмибитных? Может надо сперва что то типа “count = (TCNT1H<<8)| TCNT1L;" ?
Не только можно, но и нужно. Такая запись обеспечивает правильный порядок чтения/записи байтов - читаем сначала младший, потом старший, пишем - наоборот. Если же читать/писать раздельно старший и младший - всегда надо помнить, в каком порядке нужно обращаться к байтам. (TCNT1H<<8)| TCNT1L - будет читать мусор.

Это правило идет на ассемблере. в си же компилятор сам распределяет байты. Во многих примерах на си я видел такое обращение к таймеру.
0
btymdmom
0 / 0 / 0
Регистрация: 01.02.2011
Сообщений: 275
27.11.2012, 04:23 19
Это правило вытекает из структуры микроконтроллера, и не зависит от языка программирования. И - да, компилятор сам обеспечивает нужный порядок, если использовать обращение к 16-битному регистру. Если обращаться раздельно к 8битным половинкам, нужно помнить про правильный порядок. И на С тоже. Да хоть на паскале или Аде
0
27.11.2012, 04:23
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2012, 04:23

частотомер на at89c51
Сделал модель частотомера ra4nalа в протеусе. &lt;Изображение удалено&gt; не могу разобраться,...

Частотомер на Tiny12L
Всем привет! Не могу побороть программу-частотомер, прошу помощи. Код перепроверил вдоль и поперёк,...

Частотомер и atmega16
Собираюсь сделать тахометр для мотоцикла на индукционном датчике(катушке собственного изготовления)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.