В чем тут может быть ошибка?

Yura21
Offline
Зарегистрирован: 26.02.2017

В чем тут может быть ошибка? Делал прогу на игру зимняя охота(ссылка прилагается), но с у четом того что мишени подлючаются к счетчику к 561 ие8, и переключаение мишеней осуществяется за сет него. И также при попадании или непопадании звучит мелодия(пока что поставил просто вибрацию). Также при попадании мишень выключается и идет заново выбор мишени. Входы пистолета приходят на пины 2(сигнал с курка) и 3(сигнал с засвечивания мишени). Динамическая индикация также осуществяется за счет ардуино(сегменты подключены к аналовым входам). Особенность в том что каждые 10 мс срабатывает прерывание по таймеру и происходит переключение чисел с единицы на десятки и т.д. а после P-ое количества таких прерываений происходит переключение мишени путем подачи счетного сигнала на тактирующий вход микросхемы к561ие8. 

Ардуино нано v3. ссылка на игру:  http://zimnjaja-ohota.15kop.ru/game/

А теперь к делу. Уход в подпрограмму происходит нормально, НО сигнал на включение лисы(пин 13) загорается и не выключается. Также и на 1 пине(он не выключается, даже если сигнал с курка(пин 3) закорачиваешь на массу. Зато музыка прекращается.

Прилагаю код программы. Срочно нужно

byte A=0;//единицы попаданий
byte B=0;//десятки попаданий
byte TimeGame = 3606;//время игры         
byte vibor = 0; //выбор мишени   
byte mishen = 0;//счет мишени
byte N=0;//количество прерываний(установка уровня)
byte C=0;//выбор разрядности
byte P=50;//выбор уровня
byte L1=0;//биты выбра уровня
byte L2=0; 
byte ON=0;//бит включения игры
byte N1=0;//бит задержки после выстрела
const int a =  14;//выводы цифровой индикации           
const int b =  15;              
const int c =  16;             
const int d =  17;               
const int e =  18;             
const int f =  19;             
const int g =  20;              
const int x=1;            

byte flag=0;
void setup() {
  pinMode(a, OUTPUT);//сегменты индикатора
  pinMode(b, OUTPUT);//
  pinMode(c, OUTPUT);//
  pinMode(d, OUTPUT);//
  pinMode(e, OUTPUT);//
  pinMode(f, OUTPUT);//
  pinMode(g, OUTPUT);//
  pinMode(10, OUTPUT);//заяц
  pinMode(11, OUTPUT);//волк
  pinMode(12, OUTPUT);//куропатка
  pinMode(13, OUTPUT);//лиса
  pinMode(5, OUTPUT);//сброс счетчика
  pinMode(4, OUTPUT);//такт счетчика
  pinMode(21, INPUT);//сигнал от монетоприемника
  pinMode(6, OUTPUT);//выход на реле(выход единиц разряда, А)
  pinMode(7, INPUT);//выбор уровня L1
  pinMode(8, INPUT);//выбор уровня L2
  pinMode(2, INPUT);//курок
  pinMode(3, INPUT);//засвечивание мишени
  pinMode(9, OUTPUT);//выход разряда десятков, В
  TCCR1A=0;
  TCCR1B=0;
  TCCR1B=(1<<WGM12);
  TCCR1B|=(1<<CS10) | (1<<CS12);
  OCR1A=160;
  TIMSK1=(1<<OCIE1A);
  sei();
  
}

void loop() {

 L1=digitalRead(7);//выбор уровня
 L2=digitalRead(8); 
  if(L2==0){if(L1==0){
    P=50; }
    else { P=40;}}
    else {if(L1==0){
    P=30;}
    else {P=20;}}

N=P;//установка уровня

STOP:
while(TimeGame=0){if(digitalRead(21)==1){TimeGame=3606;}}
ON=1;
while(digitalRead(2)==0){};//тут можно вывести на одельный светодиод и поставить его под кнопку запуска игры

Vibor_Misheni:

vibor=0;
if(TimeGame=0){goto STOP;}
vibor=random(10,16);

if(vibor<13){
  digitalWrite(vibor, HIGH);
  mishen=0;}
  else{
    for(int i=0; i<(vibor-12);i++){
    digitalWrite(4, HIGH);
    digitalWrite(4, LOW);}
    mishen=0;}//
    
    if(vibor>12){
     digitalWrite(13, HIGH);
    while(mishen<1){
    if(digitalRead(2)==1){
      if(digitalRead(3)==1){
     A=A+1;
     if(A==10){A=0;
     B=B=1;}
     goto Melodia2;
     goto Popal1;}
     N1=N;
     goto Melodia1;
     goto Najato1;}}}
    
     Next:
       while(mishen<=10){
       if(digitalRead(2)==1){
       if(digitalRead(3)==1){
     A=A+1;
     if(A==10){A=0;
     B=B=1;}
     goto Melodia2;
     goto Popal1;}
     N1=N;
     goto Melodia1;}
     goto Najato2;}
     Popal2:
     digitalWrite(5, HIGH);
     digitalWrite(5, LOW);
     digitalWrite(vibor, LOW);
     goto Vibor_Misheni;





Melodia1:
digitalWrite(x, HIGH);//мелодия

digitalWrite(x,LOW);
tone(x, 1050, 200);
digitalWrite(x,LOW);
return;

Melodia2:
digitalWrite(x, HIGH);//мелодия
tone(x, 350, 200);
digitalWrite(x, LOW);
return;

 Najato1:
while(N<P){
 if(N1<=N){goto Popal1;}}

 Popal1:
 digitalWrite(5, HIGH);
 digitalWrite(5, LOW);
 digitalWrite(13, LOW);
 digitalWrite(13, LOW);
 mishen=0;
 goto Vibor_Misheni;




Najato2:
while(N<P){
 if(N1<=N){goto Next;}}
return;
}


ISR(TIMER1_COMPA_vect){
  if(ON==1){
  N=N-1;
  TimeGame=TimeGame-1;
  }
  
  digitalWrite(a, LOW);//обнуление
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
      
  if(flag==0){C = A;//установка разряда числа
    digitalWrite(6, HIGH);
    digitalWrite(9, LOW);
    flag=flag+1;}
    else {C=B;
    digitalWrite(9, HIGH);
    digitalWrite(6, LOW);
    flag=flag-1;}
    
  switch(C){//засвечивание числа
   case 0:
    digitalWrite(a,1);
    digitalWrite(b,1);
    digitalWrite(c,1);
    digitalWrite(d,1);
    digitalWrite(e,1);
    digitalWrite(f,1);
    break;
   case 1: 
    digitalWrite(b,1);
    digitalWrite(c,1);
    break;
    case 2:
    digitalWrite(a,1);
    digitalWrite(b,1);
    digitalWrite(g,1);
    digitalWrite(e,1);
    digitalWrite(d,1);
    break;
   case 3:
    digitalWrite(a,1);
    digitalWrite(b,1);
    digitalWrite(g,1);
    digitalWrite(c,1);
    digitalWrite(d,1);
    break;
    case 4:
    digitalWrite(f,1);
    digitalWrite(b,1);
    digitalWrite(g,1);
    digitalWrite(c,1);
    break;
    case 5:
    digitalWrite(a,1);
    digitalWrite(f,1);
    digitalWrite(g,1);
    digitalWrite(c,1);
    digitalWrite(d,1);
    break;
    case 6:
    digitalWrite(a,1);
    digitalWrite(f,1);
    digitalWrite(g,1);
    digitalWrite(e,1);
    digitalWrite(d,1);
    digitalWrite(c,1);
    break;
    case 7:
    digitalWrite(a,1);
    digitalWrite(b,1);
    digitalWrite(c,1);
    break;
    case 8:
     digitalWrite(a,1);
    digitalWrite(b,1);
    digitalWrite(c,1);
    digitalWrite(d,1);
    digitalWrite(e,1);
    digitalWrite(f,1);
    digitalWrite(g,1);
    break;
    case 9:
    digitalWrite(a,1);
    digitalWrite(b,1);
    digitalWrite(c,1);
    digitalWrite(d,1);
    digitalWrite(f,1);
    digitalWrite(g,1);
    break;
      
  }
 if(N==0){//переключение мишени
  mishen=mishen+1;
  N=P;
  digitalWrite(4, HIGH);
  digitalWrite(4, LOW);
  digitalWrite(x, HIGH);
  digitalWrite(x, LOW);
  }

UPD: перемещено в Программирование by Yarik.Yar

Yura21
Offline
Зарегистрирован: 26.02.2017

 

также хочу добавить что сигналы и на остальные мишени тоже тупо горят и не выключаются и не переключаются
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Александр,

а нельзя переименоать это раздел в "Готовые проекты"?  Может, понятнее будет людям что сюда постить? А то заходишь посмотреть чего люди делают, а тут филиал детского сада.

И, кстати, раздел "Детский сад", тоже нормально бы смотрелся.

Yura21
Offline
Зарегистрирован: 26.02.2017

Для остромных дибилов как вы вполне сойдет.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ЕвгенийП пишет:

а нельзя переименоать это раздел в "Готовые проекты"?  Может, понятнее будет людям что сюда постить?

Я так понимаю, это было написано до перемещения темы.

Честно говоря, думаю, переименовывать именно так нецелесообразно: после того, как проект завершен, автору, по сути, уже нечего обсуждать, так что "Готовые проекты" потом придется переименовывать в "Готовые проекты, обсуждаемые без их авторов".