Witam. Od razu zaznaczam, że nie jestem jakimś profesjonalistą w programowaniu, język C znam bardzo słabo - zdołałem jednak coś naskrobać, by moje oświetlenie schodów zapalało się i gasiło jak należy(zapalanie i gaszenie realizuję za pomocą czujników ruchu). Jednak mam problem z napisaniem funkcji, która wykona mi wygaszenie oświetlenia led, po jakimś czasie (przykładowo 30 sekundach) bezczynności, gdy przypadkowo schody się zapalą. Poniżej wstawiam napisany przeze mnie program.
//OPIS NA KOŃCU
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
//Port B i D jako wyjścia
DDRB = 0XFF;
DDRD = 0XFF;
//Stan niski na wyjściach
PORTB = 0X00;
PORTD = 0X00;
//Port C jako wejścia
DDRC = 0x00;
//wejścia podciągnięte do GND (PRZYCISK TEST "PC5" DO VCC!)
PORTC = 0x20;
//inicjowanie zmiennych ustalających opóźnienie czasowe
int a;
int b;
int c;
a = 250;
b = 1000;
c = 350;
//Początek nieskończonej pętli
while (1) {
// jeżeli na PINC3 padany zostanie stan wysoki
if (PINC & 0X08) {
_delay_ms(0);
if (PORTB == 0) // jeżeli schody wygaszone, świeć
{
//sekwencja zapalania schodów od punktu A do punktu B
PORTB = 0X01;
PORTD = 0X00;
_delay_ms(a);
PORTB = 0X03;
PORTD = 0X00;
_delay_ms(a);
PORTB = 0X07;
PORTD = 0X00;
_delay_ms(a);
PORTB = 0X0F;
PORTD = 0X00;
_delay_ms(a);
PORTB = 0X1F;
PORTD = 0X00;
_delay_ms(a);
PORTB = 0X3F;
PORTD = 0X00;
_delay_ms(a);
PORTB = 0X7F;
PORTD = 0X00;
_delay_ms(a);
PORTB = 0XFF;
PORTD = 0X00;
_delay_ms(a);
PORTB = 0XFF;
PORTD = 0X01;
_delay_ms(a);
PORTB = 0XFF;
PORTD = 0X03;
_delay_ms(a);
PORTB = 0XFF;
PORTD = 0X07;
_delay_ms(a);
PORTB = 0XFF;
PORTD = 0X0F;
_delay_ms(a);
PORTB = 0XFF;
PORTD = 0X1F;
_delay_ms(a);
PORTB = 0XFF;
PORTD = 0X3F;
_delay_ms(a);
PORTB = 0XFF;
PORTD = 0X7F;
_delay_ms(a);
PORTB = 0XFF;
PORTD = 0XFF;
_delay_ms(1000);
}
else //jeżeli schody zapalone, gaś
{
//sekwencja wygaszania schodów od punktu B do punktu A
_delay_ms(5000);
PORTB = 0XFF;
PORTD = 0XFF;
_delay_ms(c);
PORTB = 0XFF;
PORTD = 0X7F;
_delay_ms(c);
PORTB = 0XFF;
PORTD = 0X3F;
_delay_ms(c);
PORTB = 0XFF;
PORTD = 0X1F;
_delay_ms(c);
PORTB = 0XFF;
PORTD = 0X0F;
_delay_ms(c);
PORTB = 0XFF;
PORTD = 0X07;
_delay_ms(c);
PORTB = 0XFF;
PORTD = 0X03;
_delay_ms(c);
PORTB = 0XFF;
PORTD = 0X01;
_delay_ms(c);
PORTB = 0XFF;
PORTD = 0X00;
_delay_ms(c);
PORTB = 0X7F;
PORTD = 0X00;
_delay_ms(c);
PORTB = 0X3F;
PORTD = 0X00;
_delay_ms(c);
PORTB = 0X1F;
PORTD = 0X00;
_delay_ms(c);
PORTB = 0X0F;
PORTD = 0X00;
_delay_ms(c);
PORTB = 0X07;
PORTD = 0X00;
_delay_ms(c);
PORTB = 0X03;
PORTD = 0X00;
_delay_ms(c);
PORTB = 0X01;
PORTD = 0X00;
_delay_ms(c);
PORTB = 0X00;
PORTD = 0X00;
_delay_ms(1000);
}
}
if (PINC & 0X10) //Jeżeli na PINC4 podany zostanie stany wysoki
{
_delay_ms(0);
if (PORTB == 0) //Jeżeli schody wygaszone, świeć
{
//sekwencja świecenia schodów od punktu B do punktu A
PORTB = 0X00;
PORTD = 0X80;
_delay_ms(a);
PORTB = 0X00;
PORTD = 0XC0;
_delay_ms(a);
PORTB = 0X00;
PORTD = 0XE0;
_delay_ms(a);
PORTB = 0X00;
PORTD = 0XF0;
_delay_ms(a);
PORTB = 0X00;
PORTD = 0XF8;
_delay_ms(a);
PORTB = 0X00;
PORTD = 0XFC;
_delay_ms(a);
PORTB = 0X00;
PORTD = 0XFE;
_delay_ms(a);
PORTB = 0X00;
PORTD = 0XFF;
_delay_ms(a);
PORTB = 0X80;
PORTD = 0XFF;
_delay_ms(a);
PORTB = 0XC0;
PORTD = 0XFF;
_delay_ms(a);
PORTB = 0XE0;
PORTD = 0XFF;
_delay_ms(a);
PORTB = 0XF0;
PORTD = 0XFF;
_delay_ms(a);
PORTB = 0XF8;
PORTD = 0XFF;
_delay_ms(a);
PORTB = 0XFC;
PORTD = 0XFF;
_delay_ms(a);
PORTB = 0XFE;
PORTD = 0XFF;
_delay_ms(a);
PORTB = 0XFF;
PORTD = 0XFF;
_delay_ms(1000);
}
else //jeżeli schody zapalone, gaś
{
//sekwencja gaszenia schodów od punktu A do punktu B
_delay_ms(5000);
PORTB = 0XFE;
PORTD = 0XFF;
_delay_ms(c);
PORTB = 0XFC;
PORTD = 0XFF;
_delay_ms(c);
PORTB = 0XF8;
PORTD = 0XFF;
_delay_ms(c);
PORTB = 0XF0;
PORTD = 0XFF;
_delay_ms(c);
PORTB = 0XE0;
PORTD = 0XFF;
_delay_ms(c);
PORTB = 0XC0;
PORTD = 0XFF;
_delay_ms(c);
PORTB = 0X80;
PORTD = 0XFF;
_delay_ms(c);
PORTB = 0X00;
PORTD = 0XFF;
_delay_ms(c);
PORTB = 0X00;
PORTD = 0XFE;
_delay_ms(c);
PORTB = 0X00;
PORTD = 0XFC;
_delay_ms(c);
PORTB = 0X00;
PORTD = 0XF8;
_delay_ms(c);
PORTB = 0X00;
PORTD = 0XF0;
_delay_ms(c);
PORTB = 0X00;
PORTD = 0XE0;
_delay_ms(c);
PORTB = 0X00;
PORTD = 0XC0;
_delay_ms(c);
PORTB = 0X00;
PORTD = 0X80;
_delay_ms(c);
PORTB = 0X00;
PORTD = 0X00;
_delay_ms(1000);
}
}
//program testujący (Przycisk TEST)
if (!(PINC & 0X20)) //jeżli podany zostanie stan niski na PINC5
{
//sekwencja zapalania od punktu A do B
_delay_ms(100);
PORTB = 0X01;
PORTD = 0X00;
_delay_ms(a);
PORTB = 0X03;
PORTD = 0X00;
_delay_ms(a);
PORTB = 0X07;
PORTD = 0X00;
_delay_ms(a);
PORTB = 0X0F;
PORTD = 0X00;
_delay_ms(a);
PORTB = 0X1F;
PORTD = 0X00;
_delay_ms(a);
PORTB = 0X3F;
PORTD = 0X00;
_delay_ms(a);
PORTB = 0X7F;
PORTD = 0X00;
_delay_ms(a);
PORTB = 0XFF;
PORTD = 0X00;
_delay_ms(a);
PORTB = 0XFF;
PORTD = 0X01;
_delay_ms(a);
PORTB = 0XFF;
PORTD = 0X03;
_delay_ms(a);
PORTB = 0XFF;
PORTD = 0X07;
_delay_ms(a);
PORTB = 0XFF;
PORTD = 0X0F;
_delay_ms(a);
PORTB = 0XFF;
PORTD = 0X1F;
_delay_ms(a);
PORTB = 0XFF;
PORTD = 0X3F;
_delay_ms(a);
PORTB = 0XFF;
PORTD = 0X7F;
_delay_ms(a);
PORTB = 0XFF;
PORTD = 0XFF; //wszystkie schody swiecą
//sekwencja wygaszania od punktu A do B
_delay_ms(a);
PORTB = 0XFE;
PORTD = 0XFF;
_delay_ms(a);
PORTB = 0XFC;
PORTD = 0XFF;
_delay_ms(a);
PORTB = 0XF8;
PORTD = 0XFF;
_delay_ms(a);
PORTB = 0XF0;
PORTD = 0XFF;
_delay_ms(a);
PORTB = 0XE0;
PORTD = 0XFF;
_delay_ms(a);
PORTB = 0XC0;
PORTD = 0XFF;
_delay_ms(a);
PORTB = 0X80;
PORTD = 0XFF;
_delay_ms(a);
PORTB = 0X00;
PORTD = 0XFF;
_delay_ms(a);
PORTB = 0X00;
PORTD = 0XFE;
_delay_ms(a);
PORTB = 0X00;
PORTD = 0XFC;
_delay_ms(a);
PORTB = 0X00;
PORTD = 0XF8;
_delay_ms(a);
PORTB = 0X00;
PORTD = 0XF0;
_delay_ms(a);
PORTB = 0X00;
PORTD = 0XE0;
_delay_ms(a);
PORTB = 0X00;
PORTD = 0XC0;
_delay_ms(a);
PORTB = 0X00;
PORTD = 0X80;
_delay_ms(a);
PORTB = 0X00;
PORTD = 0X00;
//wszystkie wygaszone
//pojedyncze zapalanie tam i z powrotem
_delay_ms(b);
PORTB = 0X01;
PORTD = 0X00;
_delay_ms(b);
PORTB = 0X02;
PORTD = 0X00;
_delay_ms(b);
PORTB = 0X04;
PORTD = 0X00;
_delay_ms(b);
PORTB = 0X08;
PORTD = 0X00;
_delay_ms(b);
PORTB = 0X10;
PORTD = 0X00;
_delay_ms(b);
PORTB = 0X20;
PORTD = 0X00;
_delay_ms(b);
PORTB = 0X40;
PORTD = 0X00;
_delay_ms(b);
PORTB = 0X80;
PORTD = 0X00;
_delay_ms(b);
PORTB = 0X00;
PORTD = 0X01;
_delay_ms(b);
PORTB = 0X00;
PORTD = 0X02;
_delay_ms(b);
PORTB = 0X00;
PORTD = 0X04;
_delay_ms(b);
PORTB = 0X00;
PORTD = 0X08;
_delay_ms(b);
PORTB = 0X00;
PORTD = 0X10;
_delay_ms(b);
PORTB = 0X00;
PORTD = 0X20;
_delay_ms(b);
PORTB = 0X00;
PORTD = 0X40;
_delay_ms(b);
PORTB = 0X00;
PORTD = 0X80;
_delay_ms(b);
PORTB = 0X80;
PORTD = 0X00;
_delay_ms(b);
PORTB = 0X40;
PORTD = 0X00;
_delay_ms(b);
PORTB = 0X20;
PORTD = 0X00;
_delay_ms(b);
PORTB = 0X10;
PORTD = 0X00;
_delay_ms(b);
PORTB = 0X08;
PORTD = 0X00;
_delay_ms(b);
PORTB = 0X04;
PORTD = 0X00;
_delay_ms(b);
PORTB = 0X02;
PORTD = 0X00;
_delay_ms(b);
PORTB = 0X01;
PORTD = 0X00;
_delay_ms(b);
PORTB = 0X00;
PORTD = 0X80;
_delay_ms(b);
PORTB = 0X00;
PORTD = 0X40;
_delay_ms(b);
PORTB = 0X00;
PORTD = 0X20;
_delay_ms(b);
PORTB = 0X00;
PORTD = 0X10;
_delay_ms(b);
PORTB = 0X00;
PORTD = 0X08;
_delay_ms(b);
PORTB = 0X00;
PORTD = 0X04;
_delay_ms(b);
PORTB = 0X00;
PORTD = 0X02;
_delay_ms(b);
PORTB = 0X00;
PORTD = 0X00;
_delay_ms(b);
}
}
}
Format! Style:
C++ online code formatter © 2014 by KrzaQ
Powered by vibe.d, the D language and clang-format
@Edit Wszystko teraz poprawione, przepraszam. Po prostu nie wklejałem napisanego programu testującego - teraz jest całość od początku do końca.
Co do tych magicznych liczb, to chodzi Ci o przykładowo: PORTD = 0x02? Jest to zapis szesnastkowy. Wywołuje stan wysoki na PD1, czyli zapalenie danego stopnia.