да не, компилятор нормальный. эт он после такого кода перед тем как повеситься тоже малость решил пошутить ![]()  | 
			
					roboforum.ruТехнический форум по робототехнике.  | 
			
				
					 | 
		
		    
  | 
	    
 да не, компилятор нормальный. эт он после такого кода перед тем как повеситься тоже малость решил пошутить| Реклама | ||||
| 
 | 
  | 
|||

а как тогда прыгать из одной в другую (из одного места программы в другое)? В asm с этим проблем не было.По поводу первой ошибки: goto из одной функции в другую не прыгает.
  Неужели придётся вводить ещё одну переменную, чтобы записывать в неё должный выбор, а потом проверку этой переменной...хотя проверяться-то всё ровно в функции будет... запутался, помогите плз. Писали, что на Си лучше и помощников больше будет, а реально на asm я за такое же время уже почти всё написал тогда)дык, где-то (у AVR123?) написано было, что функции, которые потом вызывают, определяются до main - я так понял, что это и есть подпрограммы. Так же было написано, что читать код начинают с main - причём здесь тогда все те функции, что находятся до main?По поводу второй: в main мешает зайти вот этот бесконечный цикл while (1 != 1);

#include <mega8.h>
#include <delay.h>
/////////////////// функция инициализации портов ////////
void init(void)
{
 DDRB=0b00000110;               // PB1 PB2 на выход
 DDRD=0b00000000;               // PORTD на вход
 PORTD=0b00000111;              // PD0,PD1,PD2 подключаем подтягивающие резисторы  
}
////////////////// основная функция /////////////////////
void main(void)
{  
  init();                       // вызываем подпрограмму инициализации
  while(1)                      // бесконечный цикл
    {  
     if(PIND.0)                 // сканируем кнопку если нажата
         PORTB.1 = ~PORTB.1;    // то мигаем синим светодиодом
         else                   // если нет
          PORTB.2 = ~PORTB.2;   // то зелёным
       delay_ms(500);           // пауза 0,5 сек.
    }
}
/////////////////// end /////////////////////////////////
#include <mega8.h>
#include <delay.h>
/////////////////// функция инициализации портов ////////
void init(void)
{
 DDRB=0b00000110;               // PB1 PB2 на выход
 DDRD=0b00000000;               // PORTD на вход
 PORTD=0b00000111;              // PD0,PD1,PD2 подключаем подтягивающие резисторы  
}
////////////////// основная функция /////////////////////
void main(void)
{  
  init();                       // вызываем подпрограмму инициализации
  while(1)                      // бесконечный цикл
    {  
     if(PIND.0==0)                 // сканируем кнопку если нажата PD0=0
         {if (PIND.1 && PIND.2)   // и  не нажаты PD1=1 и PD2=1
              PORTB.0 = 1;       // вкл РВ0                                      
          else                   // если нажата PD0==0 и нажата любая PD1 и PD2
              PORTB.2 = ~PORTB.2;// мигаем, тут можно уйти на ПП мигания.              
         }
     else                         // если не нажата PD0==1
         {PORTB.0 = 0             // то гасим РВ0          
         }
     delay_ms(500);           // пауза 0,5 сек.
    }
}
/////////////////// end /////////////////////////////////| Реклама | ||||
| 
 | 
  | 
|||
 )- Если ножка PD0 соединена с землёй, и если ни одна из ножек PD1 и PD2 не соединены с землёй, то подать напряжение на ножку PB0.
- Если ни одна из ножек (PD0, PD1, PD2) не соединены с землёй, то убрать напряжение с ножки PB0.
- Если ножка PD0 соединена с землёй, а так же если хотя бы одна из ножек PD1 и PD2 соединены с землёй, то "поморгать" (метка: Fast_Burning).
while(1=1){
  
  if(PIND.0==1){
    if((PIND.1==1)&&(PIND.2==1)){
      PORTB.0=0
    }else{
      //?????
    };
  }else{
    if((PIND.1==1)&&(PIND.2==1)){
      PORTB.0=1
    }else{
      //Flashing PB0
      PORTB.0^=1;
    };
  };
  
  delay_ms(500);
};
 - Если ножка PD0 соединена с землёй, и если ни одна из ножек PD1 и PD2 не соединены с землёй, то подать напряжение на ножку PB0.
- Если ни одна из ножек (PD0, PD1, PD2) не соединены с землёй, то убрать напряжение с ножки PB0.
- Если ножка PD0 соединена с землёй, а так же если хотя бы одна из ножек PD1 и PD2 соединены с землёй, то "поморгать" (метка: Fast_Burning).
#include <mega8.h>
#include <delay.h>
/////////////////// функция инициализации портов ////////
void init(void)
{
 DDRB=0b00000110;               // PB1 PB2 на выход
 DDRD=0b00000000;               // PORTD на вход
 PORTD=0b00000111;              // PD0,PD1,PD2 подключаем подтягивающие резисторы   
}
////////////////// подпрограмма мигания ///////////////////
void flash(void)
{
 PORTB.1 = 1;          // зажечь светодиод
 delay_ms(500);        // пауза 0,5 сек.
 PORTB.1 = 0;          // погасить светодиод
 delay_ms(500);        // пауза 0,5 сек.    
}
////////////////// основная функция /////////////////////
void main(void)
{  
  init();                       // вызываем подпрограмму инициализации
  while(1)                      // бесконечный цикл
    {  
     if(!PIND.0)                // сканируем первый контакт. если есть... 
     { 
       if(!PIND.1 || !PIND.2 )  // ...сканируем другие два контакта, если есть, мигаем светодиодом
         flash();               // подпрограмма мигания (или дыхания)
         else                   // если только первый 
          PORTB.1 = 1;          // зажигаем постоянно
      } 
      else PORTB.1=0;           // если нет контактов, гасим светодиод       
    }
}                                        
/////////////////// end /////////////////////////////////


rig писал(а):автора не устаривает отсутствие оператора goto XX?

 while(1)
{   if(PIND.0==0)                 // сканируем кнопку если нажата PD0=0
         {if (PIND.1 && PIND.2)   // и  не нажаты PD1=1 и PD2=1
              PORTB.0 = 1;       // вкл РВ0                                      
          else                   // если нажата PD0==0 и нажата любая PD1 и PD2
              PORTB.2 = ~PORTB.2;// мигаем, тут можно уйти на ПП мигания.              
         }
     else                         // если не нажата PD0==1
         {PORTB.0 = 0             // то гасим РВ0          
         }
     delay_ms(500);           // пауза 0,5 сек.
}
 
GrayHunter писал(а):Спасибо за примеры, но я правильно понял, что ни в одном из них проверка перемычек в подпрограмму не выведена?
GrayHunter писал(а):Дело в том, что проверить мне нужно все три ножки отдельно, т.е.:
- проверить есть ли перемычка на ножке (условно назовём её так:) 1, и не замкнуты ли ножки 2 и 3
- проверить есть ли перемычка на ножке 2, и не замкнуты ли ножки 1 и 3
- проверить есть ли перемычка на ножке 3, и не замкнуты ли ножки 1 и 2
- если перемычки/замкнуто больше одной, то "быстро прогорать"
- если перемычек нет - просто моргать (технически)
- ...
GrayHunter писал(а):- проверить есть ли перемычка на ножке (условно назовём её так:) 1, и не замкнуты ли ножки 2 и 3- проверить есть ли перемычка на ножке 2, и не замкнуты ли ножки 1 и 3- проверить есть ли перемычка на ножке 3, и не замкнуты ли ножки 1 и 2
 Когда все заработает, можно потратить время на компактность кода.GrayHunter писал(а):Так у меня код программы будет не около 300, как на asm, а около 1000 строк на
Си, наверное
Сейчас этот форум просматривают: Google [Bot] и гости: 0