Xscs проблема настройки

Protez1999
Offline
Зарегистрирован: 08.07.2012

сделал часы http://arduino.ru/forum/apparatnye-voprosy/led-2-tsifry-8-kontaktov-prik...

если код в начальном виде все нормально как только добавляю переменную все сбивается и начинается отсчет после 60 в минутах.

unsigned long time;

int latchPin = 10;//Пин подключен к ST_CP входу 74HC595
int clockPin = 6;//Пин подключен к SH_CP входу 74HC595
int dataPin = 7;//Пин подключен к DS входу 74HC595
int dir = 1;                                                                                ;// задержка
int led1 = 8;
int led2 = 9; //мин
int led3 =11;
 int led4 =12; //часы
 int led5 = 4; //сек
  int led6 = 5; //сек
  int min1=59; // настройка минут
  int cas2 = 23; //настройка часов
 

boolean catod = 0;

void setup() {
  //устанавливаем режим OUTPUT
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  pinMode(led6, OUTPUT);
   Serial.begin(9600);
}

byte mask[10] = 
{
B11010111, //0
B00010001,//1
B01100111,//2
B01110101,//3
B10110001,//4
B11110100,//5
B11110110,//6
B01010001,//7
B11110111,//8
B11110101//9

  /*
  B11111001, // 0
  B01100000, // 1
  B10101011, // 2
  B01101011, // 3
  B01110010, // 4
  B01011011, // 5
  B11011011, // 6
  B01101000, // 7
  B11111011, // 8
  B01111011  // 9  
  */
};

byte maskSek[10] = 
{
  B11111001, // 0
  B01100000, // 1
  B10101011, // 2
  B01101011, // 3
  B01110010, // 4
  B01011011, // 5
  B11011011, // 6
  B01101000, // 7
  B11111011, // 8
  B01111011  // 9  
  
};

void loop()
{
 time = millis();
int sek = time/1000;  
int minyt = (time/1000)/60;
int cas = (minyt/60);
int minyt2 = minyt;
if(cas>0) minyt2 =(minyt-60*cas);
if((time/1000)>60) sek =(sek-60*minyt);
  
  // настройка времени
  

  Serial.print(cas);
  Serial.print("c.");
  Serial.print(minyt2); 
  Serial.print("m:");
  Serial.print(sek);
  Serial.println("s:");




// точка
 digitalWrite(latchPin, LOW); 
    shiftOut(dataPin, clockPin, MSBFIRST, B00001000); // передаем последовательно на dataPin
    digitalWrite(latchPin, HIGH); //"защелкиваем" регистр

    digitalWrite(led3, 1); 
    delay(dir); // пауза перед следующей итерацией
    digitalWrite(led3, 0);
 // ждет секунду, перед следующей итерацией цикла.
// минуты

    digitalWrite(latchPin, LOW); 
    shiftOut(dataPin, clockPin, MSBFIRST, mask[(minyt2)/10]); // целые
    digitalWrite(latchPin, HIGH); //"защелкиваем" регистр

    digitalWrite(led2, 1);   
    delay(dir);// пауза перед следующей итерацией
    digitalWrite(led2, 0);     

    digitalWrite(latchPin, LOW); 
    shiftOut(dataPin, clockPin, MSBFIRST, mask[(minyt2)%10]); // десятые
    digitalWrite(latchPin, HIGH); //"защелкиваем" регистр

    digitalWrite(led1, 1); 
    delay(dir); // пауза перед следующей итерацией
    digitalWrite(led1, 0);
    
    ///////////
   // часы
     digitalWrite(latchPin, LOW); 
    shiftOut(dataPin, clockPin, MSBFIRST, mask[(cas)%10]); // передаем последовательно на dataPin
    digitalWrite(latchPin, HIGH); //"защелкиваем" регистр

    digitalWrite(led3, 1); 
    delay(dir); // пауза перед следующей итерацией
    digitalWrite(led3, 0);
    //
    digitalWrite(latchPin, LOW); 
    shiftOut(dataPin, clockPin, MSBFIRST, mask[(cas)/10]); // передаем последовательно на dataPin
    digitalWrite(latchPin, HIGH); //"защелкиваем" регистр

    digitalWrite(led4, 1); 
    delay(dir); // пауза перед следующей итерацией
    digitalWrite(led4, 0);
    
    // второй экран секунды
    digitalWrite(latchPin, LOW); 
    shiftOut(dataPin, clockPin, MSBFIRST, maskSek[sek/10]); // передаем последовательно на dataPin     
    digitalWrite(latchPin, HIGH); //"защелкиваем" регистр

    digitalWrite(led6, 1);   
    delay(dir);// пауза перед следующей итерацией
    digitalWrite(led6, 0);     

    digitalWrite(latchPin, LOW); 
    shiftOut(dataPin, clockPin, MSBFIRST, maskSek[sek%10]); // передаем последовательно на dataPin
    digitalWrite(latchPin, HIGH); //"защелкиваем" регистр

    digitalWrite(led5, 1); 
    delay(dir); // пауза перед следующей итерацией
    digitalWrite(led5, 0);
    
  }

 

Protez1999
Offline
Зарегистрирован: 08.07.2012

не могу вставить переменные чтоб можно было настраивать часы 

maksim
Offline
Зарегистрирован: 12.02.2012

Для начала по коду, что бы не плодить одни и теже куски кода, нужно создать функцию, которая выводит цыфру на дисплей.
Единственная глобальная переменная у вас это time, вот к ней и можно плюсовать настройку.

unsigned long time, time_setup;

int latchPin = 10;//Пин подключен к ST_CP входу 74HC595
int clockPin = 6;//Пин подключен к SH_CP входу 74HC595
int dataPin = 7;//Пин подключен к DS входу 74HC595
int dir = 1;                                                                                
;// задержка
int led1 = 8;
int led2 = 9; //мин
int led3 =11;
int led4 =12; //часы
int led5 = 4; //сек
int led6 = 5; //сек

int min1 = 59; // настройка минут
int cas2 = 23; //настройка часов

void setup() {
  // Расчет миллисекунд
  time_setup = min1*60000 + cas2*3600000;
  
  //устанавливаем режим OUTPUT
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  pinMode(led6, OUTPUT);
  Serial.begin(9600);
}

byte mask[10] = 
{
  B11010111, //0
  B00010001,//1
  B01100111,//2
  B01110101,//3
  B10110001,//4
  B11110100,//5
  B11110110,//6
  B01010001,//7
  B11110111,//8
  B11110101//9

  /*
  B11111001, // 0
   B01100000, // 1
   B10101011, // 2
   B01101011, // 3
   B01110010, // 4
   B01011011, // 5
   B11011011, // 6
   B01101000, // 7
   B11111011, // 8
   B01111011  // 9  
   */
};

byte maskSek[10] = 
{
  B11111001, // 0
  B01100000, // 1
  B10101011, // 2
  B01101011, // 3
  B01110010, // 4
  B01011011, // 5
  B11011011, // 6
  B01101000, // 7
  B11111011, // 8
  B01111011  // 9  

};

void loop()
{
  time = millis()+time_setup;
  int sek = time/1000;
  int minyt = (time/1000)/60;
  int cas = (minyt/60);
  int minyt2 = minyt;
  if(cas>0) minyt2 =(minyt-60*cas);
  if((time/1000)>60) sek =(sek-60*minyt);

  // настройка времени


  Serial.print(cas);
  Serial.print("c.");
  Serial.print(minyt2); 
  Serial.print("m:");
  Serial.print(sek);
  Serial.println("s:");

  // точка
  out(led3, B00001000); // передаем последовательно на dataPin

  // минуты
  out(led2, mask[(minyt2)/10]); // целые
  out(led1, mask[(minyt2)%10]); // десятые

  // часы
  out(led3, mask[(cas)%10]); // передаем последовательно на dataPin
  out(led4, mask[(cas)/10]); // передаем последовательно на dataPin

  // второй экран секунды
  out(led6, maskSek[sek/10]); // передаем последовательно на dataPin     
  out(led5, maskSek[sek%10]);
}


void out(int catode, int numeric){
  digitalWrite(latchPin, LOW); 
  shiftOut(dataPin, clockPin, MSBFIRST, numeric); // передаем последовательно на dataPin
  digitalWrite(latchPin, HIGH); //"защелкиваем" регистр

  digitalWrite(catode, 1); 
  delay(dir); // пауза перед следующей итерацией
  digitalWrite(catode, 0);
}

 

 

Protez1999
Offline
Зарегистрирован: 08.07.2012

не понял. с минутами разобрался счас мучаю часы чтоб после 23 в 0 уходили 

Protez1999
Offline
Зарегистрирован: 08.07.2012
time = millis();
int sek = time/1000;  
int minyt = (time/1000)/60+min1;
int minyt3 = (time/1000)/60; // дубляж для того чтоб не сбились секунды
int cas = (minyt/60);
int cas3 = cas + cas2;
int minyt2 = minyt;
if(cas>0) minyt2 =(minyt-60*cas);
if(cas3 > 23) cas3 =cas3-24;
if((time/1000)>60) sek =(sek-60*minyt3);

вроде все работает 

Protez1999
Offline
Зарегистрирован: 08.07.2012

осталось узнать какое отставание или опережение с точными часами и внести поправки 

maksim
Offline
Зарегистрирован: 12.02.2012

 Смотрите сообщение #2, я его подредактировал.

Protez1999
Offline
Зарегистрирован: 08.07.2012

86 строкой добавить if(cas > 23) cas =cas-24; чтоб после 23 шло не 24 а 0. код у вас пограмотней написан и занимает на 200кб меньше а так оба работают нормально.

может разжуете - unsigned long time, time_setup; ??

и воид loop после точки буду благодарен!!!

maksim
Offline
Зарегистрирован: 12.02.2012

 В 20 строке расчитываются миллисекунды time_setup изходя из min1 и cas2, и плюсуется к глобальной переменной time. 

unsigned long time, time_setup; 

а так объявляются переменные одного типа, то есть так тоже самое:

unsigned long time; 
unsigned long time_setup;

 

Protez1999
Offline
Зарегистрирован: 08.07.2012

я имею ввиду в самом верху. первая строка.  

Protez1999
Offline
Зарегистрирован: 08.07.2012

а и вроде и остальное понял. кроме 114 и 116

maksim
Offline
Зарегистрирован: 12.02.2012

Protez1999 пишет:

я имею ввиду в самом верху. первая строка.  

maksim пишет:

unsigned long time, time_setup;
а так объявляются переменные одного типа, то есть так тоже самое:

unsigned long time;
unsigned long time_setup;

maksim
Offline
Зарегистрирован: 12.02.2012

Protez1999 пишет:

а и вроде и остальное понял. кроме 114 и 116

Функции