да не, компилятор нормальный. эт он после такого кода перед тем как повеситься тоже малость решил пошутить
да не, компилятор нормальный. эт он после такого кода перед тем как повеситься тоже малость решил пошутить
а как тогда прыгать из одной в другую (из одного места программы в другое)? В 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 строк на
Си, наверное
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0