Помогите сэкономить пин
- Войдите на сайт для отправки комментариев
Пт, 18/09/2015 - 17:40
#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 не принимают в таком коде.
или через 74hc595
https://github.com/deisterhold/Serial-LCD/blob/master/LiquidCrystal595/L...
или i2c
http://www.geeetech.com/wiki/index.php/Serial_I2C_1602_16%C3%972_Charact...
http://arduino.ru/Reference/DigitalWrite
Цитата:
Аналоговые входы (analog pins) могут быть использованы как цифровые вход/выходы (digital pins). Обращение к ним идет по номерам от 14 (для аналогового входа 0) до 19 (для аналогового входа 5).
еще есть аналоговые 6 и 7
6 и 7 могут выступать только аналоговыми входами!
Класс. Спасибо всем.