Помогите сэкономить пин
- Войдите на сайт для отправки комментариев
Пт, 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 могут выступать только аналоговыми входами!
Класс. Спасибо всем.