Skocz do zawartości
vifus

Licznik na atmega8, zliczanie liczby kliknięć, 1 seg wyświetlacz

Pomocna odpowiedź

Witam, do tej pory wszystkie moje "projekty" ograniczały się do mrugania diodami itp. Teraz wydaje mi się mam ambitniejsze zadanie do wykonania, problem w tym, że nie wiem jak sięza to zabrać.. a mianowicie muszę zrobić licznik - dane mają być wyświetlane na wyświetlaczu 1-segmentowym, (mają to być liczby od 1 do 9 oczywiscie) jest na kursc.forbot.pl coś takiego, tylko że na innym wyświetlaczu i jest to o wiele "większy" projekt, ja chcę prosty licznik: 2 switche - pierwszy po kliknięciu dodaje liczbe, drugi odejmuje. Jeśli ktoś gdzieś widział jakiś tutorial jak to wykonać, albo ma chwilkę i chciałby ją zmarnować na takiego laika jak ja to dziękuję z góry i czekam na porady / wskazówki / schematy.

Udostępnij ten post


Link to post
Share on other sites

Pewnie chodzi o jeden wyświetlacz 7-segmentowy?

Problem leży w obsłudze wyświetlacza czy w ogóle nie wiesz jak się za to zabrać?

Udostępnij ten post


Link to post
Share on other sites

Oj, tak jeden wyświetlacz 7-segmentowy, sorki. Problem w tym, że kompletnie nie wiem jak się za to zabrać..

Udostępnij ten post


Link to post
Share on other sites

To wydaję się proste. Jeśli ma realizować tylko to to nie musisz wykorzystywać nawet przerwań tylko porgramowe delay_ms(); (jeśli piszesz w C ). Sprawdzasz kl robisz delay_ms(200); sprawdzasz drugi

to samo opóźnienie potem robisz funkcje odpowiedzialną za wyświetlanie, i w zależności od tego, który jest wcisniety robisz n-- lub n++. Będzie to switch, który będzie zależny od n. W zależności od tego jaką wartość ma n, ustawia on stan portu.

Jak na mnie wyglądało by to tak mnw (dawno nie pisałem więc sorka za ewentualne błędy 😋 )

/*
  0
  =
1| |5
  =----- 6
2| |4
  =  .-----7
  3	
*/
#define DIS0 0x3F // bo binarnie 0011 1111
#define DIS1 0x30 // bo binarnie 0011 0000
#define DIS2 0x6D // bo binarnie 0110 1101
#define DIS3 0x79 // bo binarnie 0111 1001
#define DIS4 0x72 // bo binarnie 0111 0010
#define DIS5 0x5D // bo binarnie 0101 1101
#define DIS6 0x5F // bo binarnie 0101 1111
#define DIS7 0x71 // bo binarnie 0111 0001
#define DIS8 0x7F // bo binarnie 0111 1111
#define DIS9 0x7B // bo binarnie 0111 1011
//pewnie tu coś skopałem ale to sobie poprawisz :D

int main()
{
 int n=0;
 DDRD = 0xFF; //Zależnie od tego jakim wyświetlaczem dysponujesz
 PORTD = 0x00;
 //do c podłaczysz przyciski, które podciągniesz progamowo do ziemi
 DDRC = 0x00;
 PORTC = 0x03;
 while(1)
 {
if(PINC & 0x01)	//tutaj sprawdzamy pierwszy bit z portu C
{
	_delay_ms(200); //czekamy, aż drgania styków ustaną, zobacz co będzie jak to zakomentujesz
	n++;
}
if(PINC & 0x02)
{
	_delay_ms(200); //czekamy, aż drgania styków ustaną, zobacz co będzie jak to zakomentujesz
	n--;
}
switch(n&10) //bo liczby większej od 10 i tak nie wyświetlimy
{
 case 0:
	PORTD = DIS0; 
	break;
case 1:
	PORTD = DIS1;  
	break;
case 2:
	PORTD = DIS2;  
	break;
case 3:
	PORTD = DIS3;  
	break;
case 4:
	PORTD = DIS4;  
	break;
case 5:
	PORTD = DIS5;  
	break;
case 6:
	PORTD = DIS6;  
	break;
case 7:
	PORTD = DIS7;  
	break;
case 8:
	PORTD = DIS8;  
	break;
case 9:
	PORTD = DIS9;  
	break;
default:
	PORTD = 0x00;
	break;
}
 }
return 0;
}

Udostępnij ten post


Link to post
Share on other sites

other19, po co czekać aż styki przestaną drgać, skoro i tak zmieni się wartość zmiennej?

Należałoby poczekać na koniec drgania styków (wg. mnie ( i nie tylko mnie 😋 ), 80ms wystarczy) a następnie, sprawdzić czy przycisk nadal jest wciśnięty.

Udostępnij ten post


Link to post
Share on other sites

Kurcze racja nie przemyślałem tego. Chociaż, nie jest dobrze. Wciśnie raz, poczeka aż styki przestaną drgać, zmniejszy. Gdyby tego nie było, to leciał by i na jednych drganiach wykonało by się kilka iteracji.

Udostępnij ten post


Link to post
Share on other sites
Kurcze racja nie przemyślałem tego. Chociaż, nie jest dobrze. Wciśnie raz, poczeka aż styki przestaną drgać, zmniejszy. Gdyby tego nie było, to leciał by i na jednych drganiach wykonało by się kilka iteracji.

A co jeśli program zinterpretuje drganie jako wciśnięcie przycisku?

Instrukcja nadal się wykona po 200ms...

Udostępnij ten post


Link to post
Share on other sites

Dzięki panowie za zainteresowanie tematem, możecie jeszcze podrzucić jakiś schemacik jak to wszystko podłączyć ?

Dzięki z góry.

Udostępnij ten post


Link to post
Share on other sites

Co do drgania styków, moim zdaniem nie ma się czym przejmować, bo one same z siebie nie drgają, tylko przy wciśnięciu następuje kilkakrotne złączenie i rozłączenie i właśnie po to jest to 200 ms, żeby styki się uspokoiły. Oczywiście ten czas może być krótszy, jednak 200ms to wystarczająco dużo by wcisnąć i puścić. Można by na końcu whila dać jeszcze jakieś opóźnienie, żeby nie było tak, że user trzyma przycisk przez jakiś czas pętla wykonuje iterację, zmienia się liczba, program znowu sprawdza warunek już dodaje, leci te 200msm użytkownik puszcza przycisk, a liczba "sama" zwiększa się.

Co do podłączenia, musimy wiedzieć jaki masz wyświetlacz czy jest to wspólna anoda czy katoda. Wtedy musisz sobie dopasować to co masz pod DDRD i chyba zanegować te define co zrobiłem, ale palca sobie za to uciąć nie dam. Przyciski łączysz z ziemią do C0 i C1. A wyświetlacz tak jak na "obrazku" w kodzie, sugerowałbym jakieś rezystory, lecz atmega raczej Ci go nie zniszczy, gdyż ma niską wydajność prądową.

Więc po tym wszystkim co opisałem kod wygląda w następujący sposób:

/*
  0
  =
1| |5
  =----- 6
2| |4
  =  .-----7
  3	
*/
#define DIS0 0x3F // bo binarnie 0011 1111
#define DIS1 0x30 // bo binarnie 0011 0000
#define DIS2 0x6D // bo binarnie 0110 1101
#define DIS3 0x79 // bo binarnie 0111 1001
#define DIS4 0x72 // bo binarnie 0111 0010
#define DIS5 0x5D // bo binarnie 0101 1101
#define DIS6 0x5F // bo binarnie 0101 1111
#define DIS7 0x71 // bo binarnie 0111 0001
#define DIS8 0x7F // bo binarnie 0111 1111
#define DIS9 0x7B // bo binarnie 0111 1011
//pewnie tu coś skopałem ale to sobie poprawisz :D

int main()
{
 int n=0;
 DDRD = 0xFF; //Zależnie od tego jakim wyświetlaczem dysponujesz
 PORTD = 0x00;
 //do c podłaczysz przyciski, które podciągniesz progamowo do ziemi
 DDRC = 0x00;
 PORTC = 0x03;
 while(1)
 {
if(PINC & 0x01)	//tutaj sprawdzamy pierwszy bit z portu C
{
	_delay_ms(200); //czekamy, aż drgania styków ustaną, zobacz co będzie jak to zakomentujesz
	n++;
}
if(PINC & 0x02)
{
	_delay_ms(200); //czekamy, aż drgania styków ustaną, zobacz co będzie jak to zakomentujesz
	n--;
}
switch(n&10) //bo liczby większej od 10 i tak nie wyświetlimy
{
 case 0:
	PORTD = DIS0; 
	break;
case 1:
	PORTD = DIS1;  
	break;
case 2:
	PORTD = DIS2;  
	break;
case 3:
	PORTD = DIS3;  
	break;
case 4:
	PORTD = DIS4;  
	break;
case 5:
	PORTD = DIS5;  
	break;
case 6:
	PORTD = DIS6;  
	break;
case 7:
	PORTD = DIS7;  
	break;
case 8:
	PORTD = DIS8;  
	break;
case 9:
	PORTD = DIS9;  
	break;
default:
	PORTD = 0x00;
	break;
}
 _delay_ms(200);
 }
return 0;
}

Udostępnij ten post


Link to post
Share on other sites

ProrokWielki przeczytaj jeszcze raz artykuł. Pierwszy akapit:

Pod pozorem tego nieco przewrotnego tytułu chciałbym zwrócić wam uwagę na to, jaką krzywdę początkującym wyrządzają popularne ostatnio w internecie poradniki wszelkiego rodzaju, próbujące nieudolnie wyjaśnić może nie sam fakt istnienia drgań styków, bo takie zjawisko na pewno istnieje, ale tłumaczące w pokrętny i całkowicie zły sposób jak sobie z tym radzić w mikrokontrolerze, oraz czego one są przyczyną. Mamy tu do czynienia z totalną mistyfikacją w 80% przypadków 😉

Co do autora, mam wrażenie, że wyrządzasz sobie krzywdę:

Jeśli ktoś gdzieś widział jakiś tutorial jak to wykonać, albo ma chwilkę i chciałby ją zmarnować na takiego laika jak ja to dziękuję z góry i czekam na porady / wskazówki / schematy.
Dzięki panowie za zainteresowanie tematem, możecie jeszcze podrzucić jakiś schemacik jak to wszystko podłączyć ?

Projekt jaki obrałeś sobie do realizacji jest stosunkowo prosty i na pewno byłbyś w stanie wykonać go sam jeśli tylko byś spróbował. Pewnie dłużej byś to wykonywał niż z aktywną pomocą, ale jeśli chcesz się nauczyć to nie ma innej drogi niż samodzielne myślenie. Nie sieje hejtem tylko ostrzegam bo łatwo wyrobić sobie postawę roszczeniową i robić "swoje" projekty wykonując czyjeś instrukcje.

Powodzenia

Udostępnij ten post


Link to post
Share on other sites

Tak ale trzeba dać jakieś opóźnienie, żeby nie liczył podwójnie jednego wcisnięcia. Można oczywiście zrobić to inaczej np tak:

char flags; // ostatni bit znaczy wcisniety
if (PINC & 0x01)
{
flags & 0x01; //ustawia flagę wscisniętego przycisku
}

if(flags & 0x01)
{
if(!PINC & 0x01) //dopiero gdy przycisk jest puszczony zeruję flagę i inkrementuję liczbę...
{
	flags | 0x01;
	n++
}
}

Ale to tylko taka nieprzemyślana koncepcja na szybko XD

Udostępnij ten post


Link to post
Share on other sites

Temat zamykam, to nie forum od takich dyskusji.

Udostępnij ten post


Link to post
Share on other sites
Gość
Ten temat został zamknięty.

×
×
  • Utwórz nowe...