1

Тема: atmega128 частотомер 4 мгц

вход частотомера - pin 31
кнопка нажатие = замыкание на gnd - pin 34
кварц 12 мгц
как прошивать - http://rcl-radio.ru/?p=92690

http://forum.rcl-radio.ru/uploads/images/2021/03/3702db671069b75504fc76513460f344.png

http://forum.rcl-radio.ru/uploads/images/2021/03/e87fe3ad34b2b14031b86dad373490be.png


#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++;}