2. переменная off обнуляется в тексте программы при каждом нажатии на любую кнопку.
А если кнопку не нажимаем долгое время, а "off" так и крутится постоянно - это нормально будет?
ну вроде я так понял что это не на что не влияет.)) или я не прав?
Добавлено after 8 hours 20 minutes 33 seconds:Друзья, помогите пожалуйста. Стою на асфальте в лыжи обутый то ли лыжи не едут, то ли я стебанутый...
в общем, почти все работало. занимался отладкой уже на железе.... и тут как-то раз и перестало... вообще перестало..... то ли в проге где-то накосячил, то ли схему на макетке неправильно собрал...ТРИ атмеги не работают......у дочи др через 10 дней, боюсь, без вашей помощи не обойдусь....а еще плату травить....
теперь много буковок, кому лень читать ,я не обижусь, просто почти отчаялся....
1. шью китайским USBASP.
2. микруху ставлю в китайскую платочку с мин. обвязкой
Спойлер
3. МК пишется, верификация без ошибок. но на всех трех микрухак на PС4 почему-то всегда висит 0". Остальные подтяжки работают. если подключить кноки в соответствии со схемой, то мк на нажатие кнопок не реагирует.
3. не знаю могло ли повлиять, но несколько раз я вхерачивал питание в плату, когда был подключен разъем для программирования т.е. 5в с USB и 5в с БП.
5. пробовал сегодня записать эти же контроллеры программатором AUTOPROG, но изменений нет, купил новый МК, но еще не пробовал записать его.
6. если закоментить часть текста проги (условия где встречается PC4) и строчку "sei(); " то прога частично начинает работать.
Ну и самое интересное
7. в PROTEUS все работает как надо
что я могу делать не так? ((
схема
Спойлер
текст программы(коменты могут не соответствовать из-за копипаста):
Спойлер
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 1000000UL
#include <util/delay.h>
volatile unsigned char off=0; //для выключения всего
unsigned char flag=0; //флаг нажатой кнопки светофора
unsigned char cifra=0; //для семисегментника
unsigned char svet=0; //для светофора
unsigned char vykl=0; //для выключателя
unsigned char rozetka=0; //для розетки
unsigned char sv=0;
unsigned char mag=0;
unsigned char SEGMENTE[] =
{// gfedcba
0b11111111,
0b11000000, // 0
0b11111001, // 1
0b10100100, // 2
0b10110000, // 3
0b10011001, // 4
0b10010010, // 5
0b10000010, // 6
0b11111000, // 7
0b10000000, // 8
0b10010000, // 9
};
ISR( TIMER1_OVF_vect )
{
off++;
if (8 == off)
{
PORTD &= ~(1<<6); //Выключить розетку (Вентилятор)
}
if (15 == off)
{
PORTA |= 1<<7; //погасить семисегментник
PORTB = 0b11111111; //погасить светофор
}
if (28 == off)
{
PORTD |= 1<<7;//выключить Свет
}
}
ISR (INT2_vect)
{
_delay_ms(50);
off=0;
cifra = TCNT0; //переменной присвоить значение счетчика
if (cifra>0 && cifra<11) // если цифра >0 и <10
{
PORTA = SEGMENTE[cifra]; //вывести на семисегментник цифру
cifra=0; //обнулить переменную
}
else
{
if (11 == cifra) //если переменная равна 10
{
cifra=1; //обнулить переменную
PORTA = SEGMENTE[cifra]; //вывести на семисегментник цифру 0
}
}
PORTA &= ~(1<<7);// зажечь семисегментник
cifra=0; //обнулить переменную
TCNT0 = 0;
}
int main(void)
{
DDRA = 0b11111111; // порты на выход
PORTA = 0b11111111; // подтягиваем к 1
DDRB = 0b11111010;
PORTB = 0b11111111; //подтягивем к 1
DDRC = 0b00000000;
PORTC = 0b11111111; // подтягиваем к 1
DDRD = 0b11000100;
PORTD = 0b10111011;
GICR |= (1<<INT2); //разрешить внешние прерывания инт2
MCUCSR |=(1<<ISC2);//по спадающему фронту INT2
TCNT0 = 0; //установка таймера в ноль
TCCR0 |=(1<<CS02)|(1<<CS01)|(1<<CS00); //таймер от внеш. источника по переднему фронту для номеронабирателя
TIMSK |=(1<<TOIE1); //таймер по переполнению
TCCR1B |=(1<<CS11)|(1<<CS10); //делитель 64
sei(); //разрешить общее прерывание
while (1)
{
//---------- ТРИ КНОПКИ--------------------------------------------------
if (!(PINC & (1<<0))) // если PC0 = не 1 тк "!" перед условием
{
_delay_ms(50);
off=0;
if (!(PINC & (1<<0)))
{
PORTB &= ~(1<<1); // Установить на PB1 = 0
PORTB |= 1<<3; // Установить на PB3 = 1
}
while (!(PINC & (1<<0)))
{
}
}
//----------
if (!(PINC & (1<<2)))
{
_delay_ms(50);
off=0;
if (!(PINC & (1<<2)))
{
PORTB |= 1<<1;
PORTB &= ~(1<<3);
}
while (!(PINC & (1<<2)))
{
}
}
//----------
if (!(PINC & (1<<1)))
{
_delay_ms(50);
off=0;
if (!(PINC & (1<<1)))
{
PORTB &= ~(1<<3);
PORTB &= ~(1<<1);
}
while (!(PINC & (1<<1)))
{
}
}
//---------- ТРИ КНОПКИ--------------------------------------------------
if (!(PINC & (1<<3))) // если PC0 = не 1 тк "!" перед условием
{
_delay_ms(50);
off=0;
if (!(PINC & (1<<3)))
{
PORTB &= ~(1<<4); // Установить на PB1 = 0
PORTB |= 1<<5; // Установить на PB3 = 1
}
while (!(PINC & (1<<3)))
{
}
}
//----------
if (!(PINC & (1<<5)))
{
_delay_ms(50);
off=0;
if (!(PINC & (1<<5)))
{
PORTB |= 1<<4;
PORTB &= ~(1<<5);
}
while (!(PINC & (1<<5)))
{
}
}
//----------
if (!(PINC & (1<<4)))
{
_delay_ms(50);
off=0;
if (!(PINC & (1<<4)))
{
PORTB &= ~(1<<4);
PORTB &= ~(1<<5);
}
while (!(PINC & (1<<4)))
{
}
}
//---------- ТРИ КНОПКИ--------------------------------------------------
if (!(PINC & (1<<6))) // если PC6 = не 1 тк "!" перед условием
{
_delay_ms(50);
off=0;
if (!(PINC & (1<<6)))
{
PORTB &= ~(1<<6); // Установить на PB6 = 0
PORTB |= 1<<7; // Установить на PB7 = 1
}
while ((!PINC & (1<<6)))
{
}
}
//----------
if (!(PIND & (1<<0)))
{
_delay_ms(50);
off=0;
if (!(PIND & (1<<0)))
{
PORTB |= 1<<6;
PORTB &= ~(1<<7);
}
while (!(PIND & (1<<0)))
{
}
}
//----------
if (!(PINC & (1<<7)))
{
_delay_ms(50);
off=0;
if (!(PINC & (1<<7)))
{
PORTB &= ~(1<<6);
PORTB &= ~(1<<7);
}
while (!(PINC & (1<<7)))
{
}
}
//----------. ЗАМОК-----------------------------
if ((PINB & (1<<1)) && (!(PINB & (1<<3))) && (!(PINB & (1<<4))) && (!(PINB & (1<<5))) && (!(PINB & (1<<6))) && (PINB & (1<<7)))
{
PORTD |= 1<<2;
}
else
{
PORTD &= ~(1<<2);
}
//----------
if (!(PIND & (1<<1)))
{
if (0==rozetka)
{
off=0;
_delay_ms(50);
rozetka=1;
PORTD |= 1<<6;
}
}
else
{
PORTD &= ~(1<<6);
rozetka=0;
}
//---------- СВЕТА-------------
if (!(PIND & (1<<3)))
{
if (0==vykl)
{
off=0;
_delay_ms(50);
vykl=1;
PORTD &= ~(1<<7);
}
}
else
{
PORTD |= 1<<7;
vykl=0;
}
//---------- СВЕТОФОРА-------------------
if (!(PIND & (1<<4)))
{
off=0;
_delay_ms(50);
if (!(PIND & (1<<4)))
{
sv++; //переменной +1
switch (sv)
{
case 1: PORTB &= ~(1<<1);PORTB &= ~(1<<4);PORTB &= ~(1<<6);PORTB |= 1<<3;PORTB |= 1<<5;PORTB |= 1<<7; break;
case 2: PORTB &= ~(1<<1);PORTB &= ~(1<<4);PORTB &= ~(1<<6);PORTB &= ~(1<<3);PORTB &= ~(1<<5);PORTB &= ~(1<<7); break;
case 3: PORTB &= ~(1<<3);PORTB &= ~(1<<5);PORTB &= ~(1<<7);PORTB |= 1<<1;PORTB |= 1<<4;PORTB |= 1<<6;sv=0;break;
default: ;
}
}
while (!(PIND & (1<<4)))
{
}
}
//---------- ТЕЛЕФОНА------------------------------
if (!(PIND & (1<<5)))
{
off=0;
_delay_ms(50);
if (!(PIND & (1<<5)))
{
cifra++;
if (cifra>0 && cifra<11) // если цифра >0 и <10
{
PORTA = SEGMENTE[cifra]; //вывести на семисегментник цифру
PORTA &= ~(1<<7);// зажечь семисегментник
}
else
{
if (11==cifra) //если переменная равна 10
{
cifra=1; //обнулить переменную
PORTA = SEGMENTE[cifra]; //вывести на семисегментник цифру 0
PORTA &= ~(1<<7);// зажечь семисегментник
cifra=1;
}
}
}
while (!(PIND & (1<<5)))
{
}
}
}
}