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