Помогите сэкономить пин

Анатолий439781k
Offline
Зарегистрирован: 13.01.2015
#include <LiquidCrystal.h>
LiquidCrystal lcd(3,5,7,9,10,11);
 int val = 0;
 float ADC0=0;
 float value;
 float DC;
 float MaxF = 1000;
 float A;
 int SW1 = 12;
 int SW2 = 13;
#include <util/delay.h>   
volatile unsigned int tachBuf;   
unsigned long tachValue;   

ISR(TIMER1_CAPT_vect)   
{    
    TCNT1 = 0;     
    tachBuf = ICR1+2;   
}   
//********************************************************************   
void setup()       
{   
   lcd.begin(20,4);
   attachInterrupt(0, encoder, CHANGE);
   pinMode(SW1, INPUT);
   digitalWrite(SW1, LOW);
   pinMode(SW2, INPUT);
   digitalWrite(SW2, LOW); 
   pinMode(8, INPUT);  //Вход импульсов энкодера   
   pinMode(6, OUTPUT);//выход ШИМ   
   TCCR0B = TCCR0B & 0b11111000 | 4;//частота ШИМ  243 Гц  
   analogWrite(6, 128);  //Запустить ШИМ   
   digitalWrite(8, HIGH); // включить подтяжку входа   
   //Serial.begin(115200);   
   TIM_Init();//инициализация таймера   
  _delay_ms(50);   
}     
//********************************************************************   
void loop()       
{ 
 if(digitalRead(SW1)== HIGH)
  {
    if(MaxF<1000)MaxF++;
    delay(10);
  }
  else if(digitalRead(SW2)== HIGH)
  {
    if(MaxF!=0)MaxF--;
    delay(10);}
//pinMode(13, OUTPUT);
lcd.setCursor(0,2);
lcd.print("Rotation=");
lcd.print(val);
lcd.print("    ");
  cli();     
  tachValue = 250000/tachBuf; 
  analogWrite(6, constrain(map(tachValue, 0, MaxF, 0, 255), 0, 255));  //Запустить ШИМ на 6 выводе
  tachBuf=64000;   
  sei();   
  _delay_ms(100);
  value=analogRead(ADC0);
  DC=value / 205;
   A=MaxF/10;
  lcd.setCursor(0,0);
  lcd.print("Frequency=");
  lcd.print(tachValue,DEC);
  lcd.print("       ");
  
  lcd.setCursor(0,1);
  lcd.print("DC = ");
  lcd.print(DC);
  lcd.print(" volt     ");
  
  lcd.setCursor(0,3);
  lcd.print("Weft Density=");
  lcd.print(A);
  lcd.print(" ");
}      
//********************************************************************   
void TIM_Init(void)   
{   
   TIMSK1=(1<<ICIE1);    
   TCCR1A=(0<<COM1A1)|(0<<COM1A0)|(0<<WGM11)|(0<<WGM10);     
   TCCR1B=(1<<ICNC1)|(1<<ICES1)|(0<<WGM13)|(0<<WGM12)|(0<<CS12)|(1<<CS11)|(1<<CS10);   
   TCNT1 = 0;                                              
}  
void encoder() {
byte n =PIND&B00010100;
if (n==4||n==16) {val++;//digitalWrite(13, HIGH);
}
if (n==0||n==20) {val--;//digitalWrite(13, LOW);
}
}

У меня UNO. Можно ли вход энкодера(pin 2 или 4) задействовать в частотомер вместо отдельного входа(pin 8)? А то одна нога как раз нужна для выхода сигнала направления вращения. ТХ RX не принимают в таком коде.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013
arduinec
Offline
Зарегистрирован: 01.09.2015

http://arduino.ru/Reference/DigitalWrite

Цитата:
Аналоговые входы (analog pins) могут быть использованы как цифровые вход/выходы (digital pins). Обращение к ним идет по номерам от 14 (для аналогового входа 0) до 19 (для аналогового входа 5).

fagot
Offline
Зарегистрирован: 28.04.2015

еще есть аналоговые 6 и 7 

 

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

6 и 7 могут выступать только аналоговыми входами!

Анатолий439781k
Offline
Зарегистрирован: 13.01.2015

Класс. Спасибо всем.