Помогите добавить в код еще 8 разрядов семисегмента
- Войдите на сайт для отправки комментариев
Чт, 20/12/2018 - 21:29
Всем привет. Помогите дописать код. Схема такая три регистра 74HC595 и 16 разрядов семисегмента нашол код на иностранном сайте на две 74HC595 и 8 разрядов работает отлично но как добавить еще 8 незнаю помогите пожалуйста
const int clock = 13; //SCK
const int latch = 10; //RCK
const int data = 11; //DIO
byte value[] ={0x7E, 0xC, 0xB6, 0x9E, 0x9E, 0xCC, 0xDA, 0xFA, 0xE, 0xFE, 0xDE, 0xC6, 0x72};
byte digit[] ={B11111110,B11111101,B11111011,B11110111,B11101111,B11011111,B10111111,B01111111};
byte ii = 0;
byte v0, v1,v2,v3,v4,v5,v6,v7;
byte vvalue = value[0];
void setup() {
pinMode(clock, OUTPUT);
pinMode(latch, OUTPUT);
pinMode(data, OUTPUT);
cli();//stop interrupts
//set timer0 interrupt at 980Hz
TCCR0A = 0;// set entire TCCR0A register to 0
TCCR0B = 0;// same for TCCR0B
TCNT0 = 0;//initialize counter value to 0
OCR0A = 255;//(must be <256) --> 16000000 / (prescaler*255) = 980 Hz
TCCR0A |= (1 << WGM01);
TCCR0B |= (1 << CS01) | (1 << CS00); //prescaler = 64
TIMSK0 |= (1 << OCIE0A);
sei();//allow interrupts
v0=v1=v2=v3=v4=v5=v6=v7=0;
}
ISR(TIMER0_COMPA_vect){
ii++;
if (ii==8) ii=0;
if (ii==0) { vvalue = v0; }
else if (ii==1) { vvalue = v1; }
else if (ii==2) { vvalue = v2; }
else if (ii==3) { vvalue = v3; }
else if (ii==4) { vvalue = v4; }
else if (ii==5) { vvalue = v5; }
else if (ii==6) { vvalue = v6; }
else if (ii==7) { vvalue = v7; }
digitalWrite(latch,LOW);
shiftOut(data,clock,MSBFIRST,B11111111);
shiftOut(data,clock,MSBFIRST,B11111111);
shiftOut(data,clock,MSBFIRST,B11111111);
digitalWrite(latch,HIGH);
digitalWrite(latch,LOW);
shiftOut(data,clock,MSBFIRST,digit[ii]);
shiftOut(data,clock,MSBFIRST,value[vvalue]);
digitalWrite(latch,HIGH);
}
//long i;
void loop() {
// for (i=1;i<=99999999;i++) {
v7 = 7;//i % 10;
v6 = 6;//(i / 10) % 10;
v5 = 5;//(i / 100) % 10;
v4 = 4;//(i / 1000) % 10;
v3 = 3;//(i / 10000) % 10;
v2 = 2;//(i / 100000) % 10;
v1 = 1;//(i / 1000000) % 10;
v0 = 0;//(i / 10000000) % 10;
delay(30);
//}
}
/**/ const int clockPin = 13; //SCK const int latchPin = 10; //RCK const int dataPin = 11; //DIO const byte MAP[] = {0x7E, 0xC, 0xB6, 0x9E, 0x9E, 0xCC, 0xDA, 0xFA, 0xE, 0xFE, 0xDE, 0xC6, 0x72}; const byte DIG[] = {B11111110, B11111101, B11111011, B11110111, B11101111, B11011111, B10111111, B01111111}; byte ii = 0; byte v[16]; void clearDisplay() { for (int i = 0; i < 16; i++) v[i] = 0; } void initDisplay() { pinMode(clockPin, OUTPUT); pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); cli();//stop interrupts //set timer0 interrupt at 980Hz TCCR0A = 0;// set entire TCCR0A register to 0 TCCR0B = 0;// same for TCCR0B TCNT0 = 0;//initialize counter MAP to 0 OCR0A = 255;//(must be <256) --> 16000000 / (prescaler*255) = 980 Hz TCCR0A |= (1 << WGM01); TCCR0B |= (1 << CS01) | (1 << CS00); //prescaler = 64 TIMSK0 |= (1 << OCIE0A); sei();//allow interrupts clearDisplay(); } ISR(TIMER0_COMPA_vect) { ii++; if (ii > 15)ii = 0; if (ii < 8) { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, DIG[ii]); shiftOut(dataPin, clockPin, MSBFIRST, 0xFF); shiftOut(dataPin, clockPin, MSBFIRST, MAP[v[ii]]); digitalWrite(latchPin, HIGH); } else { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, 0xFF); shiftOut(dataPin, clockPin, MSBFIRST, DIG[ii-8]); shiftOut(dataPin, clockPin, MSBFIRST, MAP[v[ii]]); digitalWrite(latchPin, HIGH); } } //------------------------------------------ //----------------------------------------- void setup() { initDisplay(); } void loop() { // for (i=1;i<=99999999;i++) { v[7] = 7;//i % 10; v[6] = 6;//(i / 10) % 10; v[5] = 5;//(i / 100) % 10; v[4] = 4;//(i / 1000) % 10; v[3] = 3;//(i / 10000) % 10; v[2] = 2;//(i / 100000) % 10; v[1] = 1;//(i / 1000000) % 10; v[0] = 0;//(i / 10000000) % 10; delay(30); //} }Огромное спасибо единственное первый левый v8 до v15 потом v0 до v7 еще раз спасибо.
Я фигею с этих кодеров! А вот у меня Ардуино NG и чо?
Тоже найди код и принеси квону. Он отработает.
Не, ну я понимаю, практика, навыки... Но не до такой же степени!
/**/ const int clockPin = 13; //SCK const int latchPin = 10; //RCK const int dataPin = 11; //DIO const byte MAP[] = {0x7E, 0xC, 0xB6, 0x9E, 0x9E, 0xCC, 0xDA, 0xFA, 0xE, 0xFE, 0xDE, 0xC6, 0x72}; const byte DIG[] = {B11111110, B11111101, B11111011, B11110111, B11101111, B11011111, B10111111, B01111111}; byte ii = 0; byte v[16]; void clearDisplay() { for (int i = 0; i < 16; i++) v[i] = 0; } void initDisplay() { pinMode(clockPin, OUTPUT); pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); cli();//stop interrupts //set timer0 interrupt at 980Hz TCCR0A = 0;// set entire TCCR0A register to 0 TCCR0B = 0;// same for TCCR0B TCNT0 = 0;//initialize counter MAP to 0 OCR0A = 255;//(must be <256) --> 16000000 / (prescaler*255) = 980 Hz TCCR0A |= (1 << WGM01); TCCR0B |= (1 << CS01) | (1 << CS00); //prescaler = 64 TIMSK0 |= (1 << OCIE0A); sei();//allow interrupts clearDisplay(); } ISR(TIMER0_COMPA_vect) { ii++; if (ii > 15)ii = 0; if (ii < 8) { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, DIG[ii]); shiftOut(dataPin, clockPin, MSBFIRST, 0xFF); shiftOut(dataPin, clockPin, MSBFIRST, MAP[v[ii]]); digitalWrite(latchPin, HIGH); } else { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, 0xFF); shiftOut(dataPin, clockPin, MSBFIRST, DIG[ii-8]); shiftOut(dataPin, clockPin, MSBFIRST, MAP[v[ii]]); digitalWrite(latchPin, HIGH); } } //------------------------------------------ //----------------------------------------- void setup() { initDisplay(); } void loop() { // for (i=1;i<=99999999;i++) { v[7] = 7;//i % 10; v[6] = 6;//(i / 10) % 10; v[5] = 5;//(i / 100) % 10; v[4] = 4;//(i / 1000) % 10; v[3] = 3;//(i / 10000) % 10; v[2] = 2;//(i / 100000) % 10; v[1] = 1;//(i / 1000000) % 10; v[0] = 0;//(i / 10000000) % 10; delay(30); //} }qwone а если ещё 8 добавить чет невдуплюсь изменяю все 16 на 24 15 на 23 все сбивается
/**/ const int clockPin = 13; //SCK const int latchPin = 10; //RCK const int dataPin = 11; //DIO const byte MAP[] = {0x7E, 0xC, 0xB6, 0x9E, 0x9E, 0xCC, 0xDA, 0xFA, 0xE, 0xFE, 0xDE, 0xC6, 0x72}; const byte DIG[] = {B11111110, B11111101, B11111011, B11110111, B11101111, B11011111, B10111111, B01111111}; byte ii = 0; byte v[24]; void clearDisplay() { for (int i = 0; i < 24; i++) v[i] = 0; } void initDisplay() { pinMode(clockPin, OUTPUT); pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); cli();//stop interrupts //set timer0 interrupt at 980Hz TCCR0A = 0;// set entire TCCR0A register to 0 TCCR0B = 0;// same for TCCR0B TCNT0 = 0;//initialize counter MAP to 0 OCR0A = 255;//(must be <256) --> 16000000 / (prescaler*255) = 980 Hz TCCR0A |= (1 << WGM01); TCCR0B |= (1 << CS01) | (1 << CS00); //prescaler = 64 TIMSK0 |= (1 << OCIE0A); sei();//allow interrupts clearDisplay(); } ISR(TIMER0_COMPA_vect) { ii++; if (ii > 15)ii = 0; if (ii < 8) { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, DIG[ii]); shiftOut(dataPin, clockPin, MSBFIRST, 0xFF); shiftOut(dataPin, clockPin, MSBFIRST, 0xFF); shiftOut(dataPin, clockPin, MSBFIRST, MAP[v[ii]]); digitalWrite(latchPin, HIGH); } else if (ii < 16) { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, 0xFF); shiftOut(dataPin, clockPin, MSBFIRST, DIG[ii - 8]); shiftOut(dataPin, clockPin, MSBFIRST, 0xFF); shiftOut(dataPin, clockPin, MSBFIRST, MAP[v[ii]]); digitalWrite(latchPin, HIGH); } else { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, 0xFF); shiftOut(dataPin, clockPin, MSBFIRST, 0xFF); shiftOut(dataPin, clockPin, MSBFIRST, DIG[ii - 16]); shiftOut(dataPin, clockPin, MSBFIRST, MAP[v[ii]]); digitalWrite(latchPin, HIGH); } } //------------------------------------------ //----------------------------------------- void setup() { initDisplay(); } void loop() { // for (i=1;i<=99999999;i++) { v[7] = 7;//i % 10; v[6] = 6;//(i / 10) % 10; v[5] = 5;//(i / 100) % 10; v[4] = 4;//(i / 1000) % 10; v[3] = 3;//(i / 10000) % 10; v[2] = 2;//(i / 100000) % 10; v[1] = 1;//(i / 1000000) % 10; v[0] = 0;//(i / 10000000) % 10; delay(30); //} }/**/ const int clockPin = 13; //SCK const int latchPin = 10; //RCK const int dataPin = 11; //DIO const byte MAP[] = {0x7E, 0xC, 0xB6, 0x9E, 0x9E, 0xCC, 0xDA, 0xFA, 0xE, 0xFE, 0xDE, 0xC6, 0x72}; const byte DIG[] = {B11111110, B11111101, B11111011, B11110111, B11101111, B11011111, B10111111, B01111111}; byte ii = 0; byte v[24]; void clearDisplay() { for (int i = 0; i < 24; i++) v[i] = 0; } void initDisplay() { pinMode(clockPin, OUTPUT); pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); cli();//stop interrupts //set timer0 interrupt at 980Hz TCCR0A = 0;// set entire TCCR0A register to 0 TCCR0B = 0;// same for TCCR0B TCNT0 = 0;//initialize counter MAP to 0 OCR0A = 255;//(must be <256) --> 16000000 / (prescaler*255) = 980 Hz TCCR0A |= (1 << WGM01); TCCR0B |= (1 << CS01) | (1 << CS00); //prescaler = 64 TIMSK0 |= (1 << OCIE0A); sei();//allow interrupts clearDisplay(); } ISR(TIMER0_COMPA_vect) { ii++; if (ii > 15)ii = 0; if (ii < 8) { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, DIG[ii]); shiftOut(dataPin, clockPin, MSBFIRST, 0xFF); shiftOut(dataPin, clockPin, MSBFIRST, 0xFF); shiftOut(dataPin, clockPin, MSBFIRST, MAP[v[ii]]); digitalWrite(latchPin, HIGH); } else if (ii < 16) { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, 0xFF); shiftOut(dataPin, clockPin, MSBFIRST, DIG[ii - 8]); shiftOut(dataPin, clockPin, MSBFIRST, 0xFF); shiftOut(dataPin, clockPin, MSBFIRST, MAP[v[ii]]); digitalWrite(latchPin, HIGH); } else { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, 0xFF); shiftOut(dataPin, clockPin, MSBFIRST, 0xFF); shiftOut(dataPin, clockPin, MSBFIRST, DIG[ii - 16]); shiftOut(dataPin, clockPin, MSBFIRST, MAP[v[ii]]); digitalWrite(latchPin, HIGH); } } //------------------------------------------ //----------------------------------------- void setup() { initDisplay(); } void loop() { // for (i=1;i<=99999999;i++) { v[7] = 7;//i % 10; v[6] = 6;//(i / 10) % 10; v[5] = 5;//(i / 100) % 10; v[4] = 4;//(i / 1000) % 10; v[3] = 3;//(i / 10000) % 10; v[2] = 2;//(i / 100000) % 10; v[1] = 1;//(i / 1000000) % 10; v[0] = 0;//(i / 10000000) % 10; delay(30); //} }Ок заработало только вот почемуто середина 8 сегментов теперь невысвечивает
нашол
только теперь мерцание заметно
Дальше меняте shiftOut. Но это без меня.
void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val) { uint8_t i; for (i = 0; i < 8; i++) { if (bitOrder == LSBFIRST) digitalWrite(dataPin, !!(val & (1 << i))); else digitalWrite(dataPin, !!(val & (1 << (7 - i)))); digitalWrite(clockPin, HIGH); digitalWrite(clockPin, LOW); } }Дальше меняте shiftOut. Но это без меня.
void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val) { uint8_t i; for (i = 0; i < 8; i++) { if (bitOrder == LSBFIRST) digitalWrite(dataPin, !!(val & (1 << i))); else digitalWrite(dataPin, !!(val & (1 << (7 - i)))); digitalWrite(clockPin, HIGH); digitalWrite(clockPin, LOW); } }спасибо большое тебе
qwone помоги пожалуста добавить еще четыре датчика для тахометра
почитал про attachInterrupt оказалось только 2 пина можно использовать
хочу сделать приборку на комбайн обороты двигателя, барабана, вентилятора ну и еще 3 вала
#include <OneWire.h> long lastUpdateTime = 0,tax1 = 0L,tax2 = 0L,tax3 = 0L; bool _SV1CP0needSend = 0,_SV2CP0needSend = 0,_SV3CP0needSend = 0; unsigned long _SCT_1 = 0UL,_SCT_1IC = 0UL,_SCT_1P = 0UL,_SCT_2 = 0UL,_SCT_2IC = 0UL,_SCT_2P = 0UL,_SCT_3 = 0UL,_SCT_3IC = 0UL,_SCT_3P = 0UL; const int clockPin = 13; //SCK const int latchPin = 10; //RCK const int dataPin = 11; //DIO OneWire ds(4); // Создаем объект OneWire для шины 1-Wire, с помощью которого будет осуществляться работа с датчиком int temperature = 0; //long lastUpdateTime = 0;// Переменная для хранения времени последнего считывания с датчика const int TEMP_UPDATE_TIME = 1000;// Определяем периодичность проверок // 0 1 2 3 4 5 6 7 8, 9,знак гр, С - пусто,точка всего=15 const byte MAP[] = {0x7E,0xC,0xB6,0x9E,0xCC,0xDA,0xFA,0xE,0xFE,0xDE,0xC6,0x72,0x80,0x0,0x1};//0x1 const byte DIG[] = {B11111110, B11111101, B11111011, B11110111, B11101111, B11011111, B10111111, B01111111}; byte ii = 0; byte v[16]; void clearDisplay() { for (int i = 0; i < 16; i++) v[i] = 0; } void initDisplay() { pinMode(clockPin, OUTPUT); pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); cli();//stop interrupts //set timer0 interrupt at 980Hz TCCR0A = 0;// set entire TCCR0A register to 0 TCCR0B = 0;// same for TCCR0B TCNT0 = 0;//initialize counter MAP to 0 OCR0A = 255;//(must be <256) --> 16000000 / (prescaler*255) = 980 Hz TCCR0A |= (1 << WGM01); TCCR0B |= (1 << CS01) | (1 << CS00); //prescaler = 64 TIMSK0 |= (1 << OCIE0A); sei();//allow interrupts clearDisplay(); } ISR(TIMER0_COMPA_vect) { ii++; if (ii > 15)ii = 0; if (ii < 8) { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, DIG[ii]); shiftOut(dataPin, clockPin, MSBFIRST, 0xFF); shiftOut(dataPin, clockPin, MSBFIRST, MAP[v[ii]]); digitalWrite(latchPin, HIGH); } else { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, 0xFF); shiftOut(dataPin, clockPin, MSBFIRST, DIG[ii-8]); shiftOut(dataPin, clockPin, MSBFIRST, MAP[v[ii]]); digitalWrite(latchPin, HIGH); } } //------------------------------------------ //----------------------------------------- void setup() { initDisplay(); pinMode(2, INPUT); pinMode(3, INPUT); pinMode(5, INPUT); _SCT_1P=micros(); _SCT_2P=micros(); _SCT_3P=micros(); attachInterrupt( digitalPinToInterrupt (2), _SCT_1coutFunction, FALLING); attachInterrupt( digitalPinToInterrupt (3), _SCT_2coutFunction, FALLING); attachInterrupt( digitalPinToInterrupt (5), _SCT_3coutFunction, FALLING); } void temperaturaread(){ detectTemperature(); // Определяем температуру от датчика DS18b20 Serial.println(temperature); // Выводим полученное значение температуры // Т.к. переменная temperature имеет тип int, дробная часть будет просто отбрасываться } int detectTemperature(){ byte data[2]; ds.reset(); ds.write(0xCC); ds.write(0x44); if (millis() - lastUpdateTime > TEMP_UPDATE_TIME) { lastUpdateTime = millis(); ds.reset(); ds.write(0xCC); ds.write(0xBE); data[0] = ds.read(); data[1] = ds.read(); // Формируем значение temperature = (data[1] << 8) + data[0]; temperature = temperature >> 4; } } void TaxometrRead(){ if((( micros()-_SCT_1P) >1000000)||(( micros()-_SCT_1P) <0)){_SCT_1 = _SCT_1IC;_SCT_1IC=0;_SCT_1P = micros();} if(!(( (_SCT_1)*(30L))==(tax1))){_SV1CP0needSend = 1;} tax1 = (_SCT_1)*(30L); if((( micros()-_SCT_2P) >1000000)||(( micros()-_SCT_2P) <0)){_SCT_2 = _SCT_2IC;_SCT_2IC=0;_SCT_2P = micros();} if(!(( (_SCT_2)*(30L))==(tax2))){_SV2CP0needSend = 1;} tax2 = (_SCT_2)*(30L); if((( micros()-_SCT_3P) >1000000)||(( micros()-_SCT_3P) <0)){_SCT_3 = _SCT_3IC;_SCT_3IC=0;_SCT_3P = micros();} if(!(( (_SCT_3)*(30L))==(tax3))){_SV3CP0needSend = 1;} tax3 = (_SCT_3)*(30L); } long taxometr1,taxometr2,taxometr3,temp,tt; void loop() { detectTemperature(); temp = int(temperature); tt = int(temp / 100) % 10; v[12] = 10; v[13] = int(temp % 10); v[14] = int(temp / 10) % 10; if (tt > 0){ v[15] = int(temp / 100) % 10; } else{ v[15] = 0xff; } TaxometrRead(); taxometr1 = int(tax1); // пин 2 v[0] = int(taxometr1 % 10); v[1] = int(taxometr1 / 10) % 10; v[2] = int(taxometr1 / 100) % 10; v[3] = int(taxometr1 / 1000) % 10; taxometr2 = int(tax2); //пин 3 v[4] = int(taxometr2 % 10); v[5] = int(taxometr2 / 10) % 10; v[6] = int(taxometr2 / 100) % 10; v[7] = int(taxometr2 / 1000) % 10; taxometr3 = int(tax3); // пин 1 v[8] = int(taxometr3 % 10); v[9] = int(taxometr3 / 10) % 10; v[10] = int(taxometr3 / 100) % 10; v[11] = int(taxometr3 / 1000) % 10; } void _SCT_1coutFunction() { _SCT_1IC++; } void _SCT_2coutFunction() { _SCT_2IC++; } void _SCT_3coutFunction() { _SCT_3IC++; }Люди добрые помогите пожалуйста нехочется использовать мегу2560
Люди добрые помогите пожалуйста нехочется использовать мегу2560
Помочь с чем именно?
добавить еще четыре датчика для тахометра
почитал про attachInterrupt оказалось только 2 пина можно использовать
хочу сделать приборку на комбайн обороты двигателя, барабана, вентилятора ну и еще 3 вала
#include <OneWire.h> long lastUpdateTime = 0,tax1 = 0L,tax2 = 0L,tax3 = 0L; bool _SV1CP0needSend = 0,_SV2CP0needSend = 0,_SV3CP0needSend = 0; unsigned long _SCT_1 = 0UL,_SCT_1IC = 0UL,_SCT_1P = 0UL,_SCT_2 = 0UL,_SCT_2IC = 0UL,_SCT_2P = 0UL,_SCT_3 = 0UL,_SCT_3IC = 0UL,_SCT_3P = 0UL; const int clockPin = 13; //SCK const int latchPin = 10; //RCK const int dataPin = 11; //DIO OneWire ds(4); // Создаем объект OneWire для шины 1-Wire, с помощью которого будет осуществляться работа с датчиком int temperature = 0; //long lastUpdateTime = 0;// Переменная для хранения времени последнего считывания с датчика const int TEMP_UPDATE_TIME = 1000;// Определяем периодичность проверок // 0 1 2 3 4 5 6 7 8, 9,знак гр, С - пусто,точка всего=15 const byte MAP[] = {0x7E,0xC,0xB6,0x9E,0xCC,0xDA,0xFA,0xE,0xFE,0xDE,0xC6,0x72,0x80,0x0,0x1};//0x1 const byte DIG[] = {B11111110, B11111101, B11111011, B11110111, B11101111, B11011111, B10111111, B01111111}; byte ii = 0; byte v[16]; void clearDisplay() { for (int i = 0; i < 16; i++) v[i] = 0; } void initDisplay() { pinMode(clockPin, OUTPUT); pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); cli();//stop interrupts //set timer0 interrupt at 980Hz TCCR0A = 0;// set entire TCCR0A register to 0 TCCR0B = 0;// same for TCCR0B TCNT0 = 0;//initialize counter MAP to 0 OCR0A = 255;//(must be <256) --> 16000000 / (prescaler*255) = 980 Hz TCCR0A |= (1 << WGM01); TCCR0B |= (1 << CS01) | (1 << CS00); //prescaler = 64 TIMSK0 |= (1 << OCIE0A); sei();//allow interrupts clearDisplay(); } ISR(TIMER0_COMPA_vect) { ii++; if (ii > 15)ii = 0; if (ii < 8) { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, DIG[ii]); shiftOut(dataPin, clockPin, MSBFIRST, 0xFF); shiftOut(dataPin, clockPin, MSBFIRST, MAP[v[ii]]); digitalWrite(latchPin, HIGH); } else { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, 0xFF); shiftOut(dataPin, clockPin, MSBFIRST, DIG[ii-8]); shiftOut(dataPin, clockPin, MSBFIRST, MAP[v[ii]]); digitalWrite(latchPin, HIGH); } } //------------------------------------------ //----------------------------------------- void setup() { initDisplay(); pinMode(2, INPUT); pinMode(3, INPUT); pinMode(5, INPUT); _SCT_1P=micros(); _SCT_2P=micros(); _SCT_3P=micros(); attachInterrupt( digitalPinToInterrupt (2), _SCT_1coutFunction, FALLING); attachInterrupt( digitalPinToInterrupt (3), _SCT_2coutFunction, FALLING); attachInterrupt( digitalPinToInterrupt (5), _SCT_3coutFunction, FALLING); } void temperaturaread(){ detectTemperature(); // Определяем температуру от датчика DS18b20 Serial.println(temperature); // Выводим полученное значение температуры // Т.к. переменная temperature имеет тип int, дробная часть будет просто отбрасываться } int detectTemperature(){ byte data[2]; ds.reset(); ds.write(0xCC); ds.write(0x44); if (millis() - lastUpdateTime > TEMP_UPDATE_TIME) { lastUpdateTime = millis(); ds.reset(); ds.write(0xCC); ds.write(0xBE); data[0] = ds.read(); data[1] = ds.read(); // Формируем значение temperature = (data[1] << 8) + data[0]; temperature = temperature >> 4; } } void TaxometrRead(){ if((( micros()-_SCT_1P) >1000000)||(( micros()-_SCT_1P) <0)){_SCT_1 = _SCT_1IC;_SCT_1IC=0;_SCT_1P = micros();} if(!(( (_SCT_1)*(30L))==(tax1))){_SV1CP0needSend = 1;} tax1 = (_SCT_1)*(30L); if((( micros()-_SCT_2P) >1000000)||(( micros()-_SCT_2P) <0)){_SCT_2 = _SCT_2IC;_SCT_2IC=0;_SCT_2P = micros();} if(!(( (_SCT_2)*(30L))==(tax2))){_SV2CP0needSend = 1;} tax2 = (_SCT_2)*(30L); if((( micros()-_SCT_3P) >1000000)||(( micros()-_SCT_3P) <0)){_SCT_3 = _SCT_3IC;_SCT_3IC=0;_SCT_3P = micros();} if(!(( (_SCT_3)*(30L))==(tax3))){_SV3CP0needSend = 1;} tax3 = (_SCT_3)*(30L); } long taxometr1,taxometr2,taxometr3,temp,tt; void loop() { detectTemperature(); temp = int(temperature); tt = int(temp / 100) % 10; v[12] = 10; v[13] = int(temp % 10); v[14] = int(temp / 10) % 10; if (tt > 0){ v[15] = int(temp / 100) % 10; } else{ v[15] = 0xff; } TaxometrRead(); taxometr1 = int(tax1); // пин 2 v[0] = int(taxometr1 % 10); v[1] = int(taxometr1 / 10) % 10; v[2] = int(taxometr1 / 100) % 10; v[3] = int(taxometr1 / 1000) % 10; taxometr2 = int(tax2); //пин 3 v[4] = int(taxometr2 % 10); v[5] = int(taxometr2 / 10) % 10; v[6] = int(taxometr2 / 100) % 10; v[7] = int(taxometr2 / 1000) % 10; taxometr3 = int(tax3); // пин 1 v[8] = int(taxometr3 % 10); v[9] = int(taxometr3 / 10) % 10; v[10] = int(taxometr3 / 100) % 10; v[11] = int(taxometr3 / 1000) % 10; } void _SCT_1coutFunction() { _SCT_1IC++; } void _SCT_2coutFunction() { _SCT_2IC++; } void _SCT_3coutFunction() { _SCT_3IC++; }дай водицы испить, а то так есть хочется, что переночевать негде )))
Мда. Вот говорят же умные люди как надо поступать в таких случаях, а Квон не слушает никого. Попал в общем. Завтра ещё пара датчиков вылезет :)
Всем привет посмотрите пожалуйста код все ли правильно?
void SPI_init(void) { DDRB |= ((1 << PORTB2) | (1 << PORTB3) | (1 << PORTB5)); //ножки SPI на выход PORTB &= ~((1 << PORTB2) | (1 << PORTB3) | (1 << PORTB5)); //низкий уровень SPCR = ((1 << SPE) | (1 << MSTR)); //включим шину, объ¤вим ведущим } //------------------------------------------ const byte MAP[] = {0x7E, 0xC, 0xB6, 0x9E, 0xCC, 0xDA, 0xFA, 0xE, 0xFE, 0xDE, 0xC6, 0x72}; const byte DIG[] = {B11111110, B11111101, B11111011, B11110111, B11101111, B11011111, B10111111, B01111111}; byte ii = 0; byte v[24]; void clearDisplay() { for (int i = 0; i < 24; i++) v[i] = 0; } //------------------------------------------ void initDisplay() { cli();//stop interrupts //set timer0 interrupt at 980Hz TCCR0A = 0;// set entire TCCR0A register to 0 TCCR0B = 0;// same for TCCR0B TCNT0 = 0;//initialize counter MAP to 0 OCR0A = 254;//(must be <256) --> 16000000 / (prescaler*255) = 980 Hz TCCR0A |= (1 << WGM01); TCCR0B |= (1 << CS01) | (1 << CS00); //prescaler = 64 TIMSK0 |= (1 << OCIE0A); sei();//allow interrupts clearDisplay(); } ISR(TIMER0_COMPA_vect) { ii++; if (ii > 23) ii = 0; if (ii < 8) { SPDR = DIG[ii]; while (!(SPSR & (1 << SPIF))); led595(); led595(); SPDR = MAP[v[ii]]; while (!(SPSR & (1 << SPIF))); sdvig(); } else if (ii < 16) { led595(); SPDR = DIG[ii - 8]; while (!(SPSR & (1 << SPIF))); led595(); SPDR = MAP[v[ii]]; while (!(SPSR & (1 << SPIF))); sdvig(); } else { led595(); led595(); SPDR = DIG[ii - 16]; while (!(SPSR & (1 << SPIF))); SPDR = MAP[v[ii]]; while (!(SPSR & (1 << SPIF))); sdvig(); } } //------------------------------------------ void led595() { SPDR = 0b11111111; while (!(SPSR & (1 << SPIF))); } //------------------------------------------ void sdvig() { PORTB |= (1 << PORTB2); //высокий уровень dWrite(latchPin, LOW); PORTB &= ~(1 << PORTB2); //низкий уровень dWrite(latchPin, HIGH); } //----------------------------------------- void setup() { SPI_init(); initDisplay(); // sei(); } //------------------------------------------ void loop() { // v[7] = 7;//i % 10; // v[6] = 6;//(i / 10) % 10; v[5] = 5;//(i / 100) % 10; v[4] = 4;//(i / 1000) % 10; v[3] = 3;//(i / 10000) % 10; v[2] = 2;//(i / 100000) % 10; v[1] = 1;//(i / 1000000) % 10; v[0] = 0;//(i / 10000000) % 10; v[8] = 9; v[9] = 8; v[10] = 7; v[11] = 6; v[12] = 5; v[13] = 4; v[14] = 3; v[15] = 2; v[16] = 0; v[17] = 0; v[18] = 0; v[19] = 0; v[20] = 0; v[21] = 0; v[22] = 0; v[23] = 1; }Всем привет посмотрите пожалуйста код все ли правильно?
Сами запускали? Работает? Устраивает или что-то не так? Если не запускали - садитесь и запускайте. Если запускали - описывайте.
Почему-то кто за Вас это должен делать?
Извините писал сам запускал работает вроде все нравиться а вот коменты неуспел написать
просто нужен глаз спеца.
void SPI_init(void) { DDRB |= ((1 << PORTB2) | (1 << PORTB3) | (1 << PORTB5)); //ножки SPI на выход PORTB &= ~((1 << PORTB2) | (1 << PORTB3) | (1 << PORTB5)); //низкий уровень SPCR = ((1 << SPE) | (1 << MSTR)); //включим шину, объ¤вим ведущим } //------------------------------------------ const byte MAP[] = {0x7E, 0xC, 0xB6, 0x9E, 0xCC, 0xDA, 0xFA, 0xE, 0xFE, 0xDE, 0xC6, 0x72}; const byte DIG[] = {B11111110, B11111101, B11111011, B11110111, B11101111, B11011111, B10111111, B01111111}; byte ii = 0; byte v[24]; void clearDisplay() { for (int i = 0; i < 24; i++) v[i] = 0; } //------------------------------------------ void initDisplay() { cli();//stop interrupts //set timer0 interrupt at 980Hz TCCR0A = 0;// set entire TCCR0A register to 0 TCCR0B = 0;// same for TCCR0B TCNT0 = 0;//initialize counter MAP to 0 OCR0A = 254;//(must be <256) --> 16000000 / (prescaler*255) = 980 Hz TCCR0A |= (1 << WGM01); TCCR0B |= (1 << CS01) | (1 << CS00); //prescaler = 64 TIMSK0 |= (1 << OCIE0A); sei();//allow interrupts clearDisplay(); } ISR(TIMER0_COMPA_vect) { ii++; if (ii > 23) ii = 0; if (ii < 8) { SPDR = DIG[ii]; // Передаем биты разряда while (!(SPSR & (1 << SPIF)));//подождем пока данные передадутся led595(); led595(); SPDR = MAP[v[ii]]; // Передаем биты сегмента while (!(SPSR & (1 << SPIF)));//подождем пока данные передадутся sdvig(); } else if (ii < 16) { led595(); SPDR = DIG[ii - 8]; // Передаем биты разряда while (!(SPSR & (1 << SPIF))); //подождем пока данные передадутся led595(); SPDR = MAP[v[ii]]; // Передаем биты сегмента while (!(SPSR & (1 << SPIF)));//подождем пока данные передадутся sdvig(); } else { led595(); led595(); SPDR = DIG[ii - 16]; // Передаем биты разряда while (!(SPSR & (1 << SPIF)));//подождем пока данные передадутся SPDR = MAP[v[ii]]; // Передаем биты сегмента while (!(SPSR & (1 << SPIF)));//подождем пока данные передадутся sdvig(); } } //------------------------------------------ void led595() { SPDR = 0b11111111; while (!(SPSR & (1 << SPIF))); } //------------------------------------------ void sdvig() { //сгенерируем отрицательный фронт дл¤ записи в STORAGE REGISTER PORTB |= (1 << PORTB2); //высокий уровень PORTB &= ~(1 << PORTB2); //низкий уровень } //----------------------------------------- void setup() { SPI_init(); //Инициализируем шину SPI initDisplay(); // sei(); } //------------------------------------------ void loop() { // v[7] = 7;//i % 10; // v[6] = 6;//(i / 10) % 10; // выводим цыфры v[5] = 5;//(i / 100) % 10; v[4] = 4;//(i / 1000) % 10; v[3] = 3;//(i / 10000) % 10; v[2] = 2;//(i / 100000) % 10; v[1] = 1;//(i / 1000000) % 10; v[0] = 0;//(i / 10000000) % 10; v[8] = 9; v[9] = 8; v[10] = 7; v[11] = 6; v[12] = 5; v[13] = 4; v[14] = 3; v[15] = 2; v[16] = 0; v[17] = 0; v[18] = 0; v[19] = 0; v[20] = 0; v[21] = 0; v[22] = 0; v[23] = 1; }щас телефон зарядиться скину фото работы
awladimer. Основное замечание. Очень все не удобно. По какой команде вы будете показывать значение , к примеру на 3-м дисплее? или на 5-м.
awladimer. Основное замечание. Очень все не удобно. По какой команде вы будете показывать значение , к примеру на 3-м дисплее? или на 5-м.
вот мне очень понравилось даже написал, на другое пока голова несоображает или просто непойму. Очень тяжело особено в в мои 47 для меня и это прогресс
detectTemperature(); temp = int(temperature); v[20] = 10; v[21] = int(temp % 10); if (temp > 9){ v[22] = int(temp / 10) % 10; } else{ v[22] = 0xff; } if (temp > 99){ v[23] = int(temp / 100) % 10; } else{ v[23] = 0xff; } /////////////////////////вывод температуры двигателя////////////////////////////// /////////////////////////вывод оборотов вентилятора////////////////////////////// TaxometrRead(); taxometr1 = int(tax1); // пин 2 v[8] = int(taxometr1 % 10); if (tax1 > 9){ //убираем 2 знак с лева v[9] = int(taxometr1 / 10) % 10; } else{ v[9] = 0xff; } if (tax1 > 99){ //убираем 3 знак с лева v[10] = int(taxometr1 / 100) % 10; } else{ v[10] = 0xff; } if (tax1 > 999){ //убираем 4 знак с лева v[11] = int(taxometr1 / 1000) % 10; } else{ v[11] = 0xff; } /////////////////////////вывод оборотов вентилятора///////////////////Если Вы думаете, что здесь толкуются малолетки, то я Вас разочарую. Здесь Ваши ровесники и старше.
byte v[24]; /*вывод на первый экран*/ void print1(int val) { } /*вывод на второй экран*/ void print2(int val) { } /*вывод на третий экран*/ void print3int val) { } /*вывод на четвертый экран*/ void print4(int val) { } /*вывод на пятый экран*/ void print5(int val) { } /*вывод на шестой экран*/ void print6(int val) { } void setup() { } void loop() { }Если Вы думаете, что здесь толкуются малолетки, то я Вас разочарую. Здесь Ваши ровесники и старше.
вы имели виду так
byte v[24]; /*вывод на первый экран*/ void print1(int val) { temp = int(temperature); v[20] = 10; v[21] = int(temp % 10); if (temp > 9){ v[22] = int(temp / 10) % 10; } else{ v[22] = 0xff; } if (temp > 99){ v[23] = int(temp / 100) % 10; } else{ v[23] = 0xff; } } /*вывод на второй экран*/ void print2(int val) { } void loop() { print1(0); // а здесь что прописывать }