Частотометр на Atmega8
Вт, 29.04.2014, 20:56 | Сообщение # 1
Jojik745
Постов: 280
Друзья
нашел в просторах интернета такую схему частотометра прошивка была в виде скрина но один умелец переписал в hex осталось разобраться с фьюзами ну и спаять печатку рисовал сам как мог вроде без ошибок в печатке добавил стабилизатор будет время попробую собрать
Вт, 29.04.2014, 21:02 | Сообщение # 2
ГУБЕРНАТОР
Постов: 2114
Друзья
предел каков?
Вт, 29.04.2014, 21:09 | Сообщение # 3
Jojik745
Постов: 280
Друзья
ГУБЕРНАТОР , Не знаю о описании не было толком ничего думаю что не много придется добавлять делитель Добавлено (29.04.2014, 22:09) --------------------------------------------- Исходный код программы с подробными комментариями показан ниже:
Смотреть кодПечататьПомощь
001.
// Измерение частоты сигнала с помощью микроконтроллеров AVR. Простой частотомер.
002.
#include
003. #include 004. #include 005. 006. volatile unsigned int edgecounter = 0, counter = 0; 007. 008. // Обработчик прерывания по переполнению Т0, вызывается 4000 раз в секунду 009. ISR(TIMER0_OVF_vect) 010. { 011. TCNT0 = 6; // Счетчик Т0 начинает считать с 6, т.к. 1MHz/(256-6) = 4000Hz 012. counter++; 013. } 014. // Обработчик внешнего прерывания 015. ISR(INT0_vect) 016. { 017. edgecounter++; 018. } 019. 020. // Функции работы с LCD 021. #define RS PD0 022. #define EN PD1 023. // Функция передачи команды 024. void lcd_com(unsigned char p) 025. { 026. PORTD &= ~(1 << RS); // RS = 0 (запись команд) 027. PORTD |= (1 << EN); // EN = 1 (начало записи команды в LCD) 028. PORTD &= 0x0F; PORTD |= (p & 0xF0); // старший нибл 029. _delay_us(100); 030. PORTD &= ~(1 << EN); // EN = 0 (конец записи команды в LCD) 031. _delay_us(100); 032. PORTD |= (1 << EN); // EN = 1 (начало записи команды в LCD) 033. PORTD &= 0x0F; PORTD |= (p << 4); // младший нибл 034. _delay_us(100); 035. PORTD &= ~(1 << EN); // EN = 0 (конец записи команды в LCD) 036. _delay_us(100); 037. } 038. // Функция передачи данных 039. void lcd_data(unsigned char p) 040. { 041. PORTD |= (1 << RS)|(1 << EN); // RS = 1 (запись данных), EN - 1 (начало записи команды в LCD) 042. PORTD &= 0x0F; PORTD |= (p & 0xF0); // старший нибл 043. _delay_us(100); 044. PORTD &= ~(1 << EN); // EN = 0 (конец записи команды в LCD) 045. _delay_us(100); 046. PORTD |= (1 << EN); // EN = 1 (начало записи команды в LCD) 047. PORTD &= 0x0F; PORTD |= (p << 4); // младший нибл 048. _delay_us(100); 049. PORTD &= ~(1 << EN); // EN = 0 (конец записи команды в LCD) 050. _delay_us(100); 051. } 052. 053. // Функция вывода строки на LCD 054. void lcd_string(unsigned char command, char *string) 055. { 056. lcd_com(0x0C); 057. lcd_com(command); 058. while(*string != '\0') 059. { 060. lcd_data(*string); 061. string++; 062. } 063. } 064. 065. // Функция вывода переменной 066. void lcd_num_to_str(unsigned int value, unsigned char nDigit) 067. { 068. switch(nDigit) 069. { 070. case 4: lcd_data((value/1000)+'0'); 071. case 3: lcd_data(((value/100)%10)+'0'); 072. case 2: lcd_data(((value/10)%10)+'0'); 073. case 1: lcd_data((value%10)+'0'); 074. } 075. } 076. // Функция инициализации LCD 077. void lcd_init(void) 078. { 079. _delay_ms(50); // Ожидание готовности ЖК-модуля 080. 081. // Конфигурирование четырехразрядного режима 082. PORTD |= (1 << PD5); 083. PORTD &= ~(1 << PD4); 084. 085. // Активизация четырехразрядного режима 086. PORTD |= (1 << EN); 087. PORTD &= ~(1 << EN); 088. _delay_ms(5); 089. 090. lcd_com(0x28); // шина 4 бит, LCD - 2 строки 091. lcd_com(0x08); // полное выключение дисплея 092. lcd_com(0x01); // очистка дисплея 093. _delay_us(100); 094. lcd_com(0x06); // сдвиг курсора вправо 095. lcd_com(0x0C); // включение дисплея, курсор не видим 096. } 097. 098. int main(void) 099. { 100. PORTD = 0x00; // Настраиваем входы/выходы 101. DDRD = 0b11110011; 102. 103. TCCR0 |= (1 << CS01); // Предделитель на 8, частота таймера 1 MHz 104. TIMSK |= (1 << TOIE0); // Разрешаем прерывание от таймера Т0 105. 106. GICR |= (1 << INT0); // Разрешаем внешнее прерывание на входе INT0 107. MCUCR |= (1 << ISC01)|(1 << ISC00); // Внешнее прерывание формируется по переднему фронту 108. 109. sei(); // Глобально разрешаем прерывания 110. 111. lcd_init(); // Инициализация дисплея 112. 113. lcd_com(0x01); 114. lcd_string(0x80, "Frequency Meter"); 115. lcd_string(0xC0, "F = Hz"); 116. 117. while(1) 118. { 119. // Выводим показания на дисплей 120. if(counter == 4000) 121. { 122. lcd_com(0xC4); 123. lcd_num_to_str(edgecounter, 4); 124. counter = 0; 125. edgecounter = 0; 126. } 127. } 128. }
Вт, 29.04.2014, 21:12 | Сообщение # 4
ГУБЕРНАТОР
Постов: 2114
Друзья
Jojik745 , попробуй этот: http://radioskot.ru/forum/12-3323-1 Добавлено (29.04.2014, 22:12) --------------------------------------------- ты лучше архивом бы сюда выложил исходник.
Вт, 29.04.2014, 21:17 | Сообщение # 5
Hellojello
Постов: 43
ОК
На Atmega8 лучше собрать вот такой. Технические характеристики Диапазон измерения частоты Гц 0.1-8000000 Диапазон генерации частоты Гц 0-60000 Количество точек по горизонтали для осциллографа Шт 16 Количество точек вывода по вертикале для осциллографа Шт 8 Диапазон чувствительности входа осциллографа В 3-5 Диапазон измерения емкости мкФ 0.00002 – 2000 Диапазон измерения сопротивления ОМ 4 - 200000000 Напряжение питания В 5 Рабочая температура оС 0 - +60
Вт, 29.04.2014, 21:23 | Сообщение # 6
ГУБЕРНАТОР
Постов: 2114
Друзья
Hellojello , смотря для каких целей лучше, если ограничиться порогом измерения 8мГц, то вполне подойдет. Собирал этот прибор, работает вполне сносно, хоть и есть замечания: http://radioskot.ru/forum/12-1189-1
Вт, 29.04.2014, 21:32 | Сообщение # 7
Jojik745
Постов: 280
Друзья
во с 6 смс буду собирать отличный аппарат
Вт, 29.04.2014, 21:41 | Сообщение # 8
Hellojello
Постов: 43
ОК
Порог измерения конечно маленький, но зато прибор многофункциональный.
Вт, 29.04.2014, 21:44 | Сообщение # 9
Jojik745
Постов: 280
Друзья
ГУБЕРНАТОР , смотрю на печатку и не пойму надо её зеркалить для фоторезиста или нет поправку в печатке сделал.
Чт, 12.05.2016, 15:14 | Сообщение # 10
Vik1972
Постов: 2
ОК
Господа. а подскажите на каком языке написан исходник