Тема: atmega128 частотомер 4 мгц
вход частотомера - pin 31
кнопка нажатие = замыкание на gnd - pin 34
кварц 12 мгц
как прошивать - http://rcl-radio.ru/?p=92690
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 10, 11, 12, 13); // LCD (RS, E, DB4, DB5, DB6, DB7)
// PIN(PB0,PB1,PB2, PB3, PB4, PB5)
volatile int x;
unsigned long f;
int timer3;
byte ind7,ind6,ind5,ind4,ind3,ind2,ind1,ind0;
byte mn=1;
int vr_s;
void setup(){
lcd.begin(16, 2);
DDRG &= ~(1 << 1);PORTG |= (1 << 1);// pin 31
DDRD &= ~(1 << 6); PORTD |= (1 << 6); // pin 34
cli();
TCCR1A = 0;
TCCR1B = 0;
TCCR1B = (1 << CS12)|(1 << CS11)|(1 << CS10);
TIMSK |= (1 << TOIE1);
//////////////
TCCR3A = 0;
TCCR3B = 0;
OCR3A = 18750; // 0.1 s || 25000 16MHz
TCCR3B |= (1 << WGM32);
TCCR3B |= (1 << CS31) | (1 << CS30); // 64
ETIMSK |= (1 << OCIE3A);
sei();
}
void loop(){
if(((PING >> 1) & 1) == 0 && mn==10){mn=1;delay(200);}
if(((PING >> 1) & 1) == 0 && mn==1){mn=10;delay(200);}
lcd.setCursor(0, 0); if(mn==1){lcd.print("1s ");}else{lcd.print("10s");}
lcd.setCursor(14, 0);if(timer3>0&&timer3<5)lcd.print(" ");else lcd.print("*");
if(timer3 == 5){
lcd.setCursor(6, 0); lcd.print("Freq");
lcd.setCursor(3, 1);
ind7=f/1000000/mn;
ind6=f/100000/mn%10;
ind5=f/10000/mn%10;
ind4=f/1000/mn%10;
ind3=f/100/mn%10;
ind2=f/10/mn%10;
ind1=f/mn%10;
if(mn==10){ ind0=f%10;}
lcd.print(ind7);lcd.print(".");lcd.print(ind6);lcd.print(ind5);lcd.print(ind4);lcd.print(".");lcd.print(ind3);lcd.print(ind2);lcd.print(ind1);
if(mn==10){lcd.print(",");lcd.print(ind0);}
lcd.print(" ");
}}
ISR(TIMER3_COMPA_vect){
if(mn==1){vr_s=11;}else{vr_s=101;}
timer3++;
if(timer3==1){
x = 0;TCNT1 = 0;
TCCR1B = (1 << CS12)|(1 << CS11)|(1 << CS10);}
if(timer3==vr_s){timer3=0;
TCCR1B &= ~(1 << CS12)|(1 << CS11)|(1 << CS10);
f = ((x*65535) + TCNT1)-1;}
}
ISR (TIMER1_OVF_vect){x++;}