Witam
Próbuje zrobić program na AtMege16
Program ma działać w następujący sposób:
Przyciskam 1 guzik z klawiatury (klawiaturka jest 4x4, ale wykorzystywane tylko 3x4) i ma zapalić się dioda 0 (podłączona do portu A pin 0) i zgasnąć z opóźnieniem powiedzmy 30sekund
Przyciskam 2 guzik i zapala się dioda 1 (PA 1) z opóźnieniem 30 sekund i gaśnie po takim samym czasie
Program teraz działa tak:
wciskam 1 zapalają sie w ten sposób diody 00001110 a jak dwójkę to 00001101 i gasna automatycznie
Gdzieś coś pomieszałem i męczę się co jest nie tak, ale wszystko wydaje się być ok. najgorzej jest sprawdzać błędy we własnym programie, bo wtedy ciężko coś znaleść.
Mój kod wygląda tak
Próbuje zrobić program na AtMege16
Program ma działać w następujący sposób:
Przyciskam 1 guzik z klawiatury (klawiaturka jest 4x4, ale wykorzystywane tylko 3x4) i ma zapalić się dioda 0 (podłączona do portu A pin 0) i zgasnąć z opóźnieniem powiedzmy 30sekund
Przyciskam 2 guzik i zapala się dioda 1 (PA 1) z opóźnieniem 30 sekund i gaśnie po takim samym czasie
Program teraz działa tak:
wciskam 1 zapalają sie w ten sposób diody 00001110 a jak dwójkę to 00001101 i gasna automatycznie
Gdzieś coś pomieszałem i męczę się co jest nie tak, ale wszystko wydaje się być ok. najgorzej jest sprawdzać błędy we własnym programie, bo wtedy ciężko coś znaleść.
Mój kod wygląda tak
/* ATmega 1MHz */
#define F_CPU 1000000L
#include <avr/io.h>
#include <util/delay.h>
signed char v; // zmienna do odliczania przebiegu pętli opóźniającej
void ustawienia(void)
{
//Ustawienie portów dla wyjść (LEDy, LCD) i wejścia (Klawiatura)
//Port A bity 0-3 - LED-y
DDRA = 0x0F;
PORTA = 0x0F;
//klawiatura 4kolumny i 3 linie
DDRD = 0x0f;
PORTD = 0x7f;
}
/*Sprawdzanie klawiatury - szukanie wciśniętego guzika */
unsigned char read_keypad(void)
{
unsigned char row,col,key;
/* Wybierany jest wiersz i wyszukiwanie wcisniętego guzika w kolumnach*/
for(row=0x7e,key=1; row>=0x77; row=(row<<1|0x1)&0x7f)
{
PORTD = row;
for(col=0x10; col< 0x80; col<<=1, key++)
if(!(PIND & col)) return key;
}
/* Jeśli żaden z przycisków nie został wciśnięty,
wyjście z kodem zero */
return 0;
}
int main(void)
{
unsigned char key;
ustawienia(); //wywołanie funkcji ustawiającej porty
for(;;)
{
/*wygaszenie wszystkich diód (diody mają za zadanie zastąpienie dowolnego urządzenia, którym program miałby sterować)*/
PORTA |= 0x0F;
//sprawdzanie wcisniętego klawisza
while(!(key = read_keypad()));
{
if(key == 1) // włączenie diody 1 (PA 0) na 30 sekund
{
PORTA &= 0x01;//zapalenie LED0
v==30;
do
{
_delay_ms(960); // Prawie sekunda opóźnienia
v--;
}
while(v>0);
PORTA |= 0x01;//zgaszenie LED0
}
if(key == 2) // włączenie diody 2 (PA 0) po 30 sekundach na 30 sekund
{
v==30;
do
{
_delay_ms(960); // Prawie sekunda opóźnienia
v--;
}
while(v>0);
PORTA &= 0x02;//zapalenie LED1
do
{
_delay_ms(960); // Prawie sekunda opóźnienia
v--;
}
while(v>0);
PORTA |= 0x02;//zgaszenie LED1
}
}
}
}