Mam na zajęcia zrealizować program stopera w programie AVR Studio... I mam problem z obsłużeniem 2 przycisków które nim sterują...
Pierwszy przycisk SW_1 ma resetować stoper
Drugi przycisk SW_2 ma go zatrzymywać (po pierwszym naciśnięciu) i startować dalej (po drugim naciśnięciu) i tak w kółko...
Napisałem obsługę do przycisku SW_1 (w sposób pewnie toporny niektórzy uznają - ale działa )
Na natomiast nie potrafię zapisać obsługi drugiego przycisku SW_2
Zrobiłem w sumie zatrzymywanie czasu ale chyba nie tak to powinno wyglądać...
MÓGŁBY MI KTOŚ POMÓC BO SAM NIE DAM RADY ....
Oto kod programu głównego :
Kod: Zaznacz cały
#include <avr\io.h> // dostęp do rejestrów
#include <inttypes.h> // definicje typów uint8...
#include <avr\signal.h> // definicje SIGNAL, INTERRUPT
#include <avr\interrupt.h> // funkcje sei(), cli()
#include "makra.h"
#include "harddef.h"
#include "czas.h"
#define T0_INIT (256-15)
#define T1_INIT (65536-5000)
uint8_t bufor;
int main(void)
{
// Konfiguracja portów I/O
DDR(LED) = 0xff;
DDR(SEG) = 1<<SEG_1 | 1<<SEG_2 | 1<<SEG_3 | 1<<SEG_4;
DDR(SW) &= ~(1<<SW_1 | 1<<SW_2);
TCCR0 = 1<<CS02;
TIMSK = 1<<TOIE0 | 1 << TOIE1;
TCNT0 = T0_INIT;
TCNT1 = T1_INIT;
// ustawienie trybów pracy liczników
TCCR1A = 0x00;
TCCR1B |= (1<<CS11);
// globalne odblokowanie przerwań
sei();
// nieskończona pętla
for(;;)
reset();
return 0;
}
// procedury obslugi przerwania
SIGNAL(SIG_OVERFLOW0)
{
pokaz_czas();
TCNT0=T0_INIT;
}
SIGNAL (SIG_OVERFLOW1)
{
akt_czas();
TCNT1 = T1_INIT;
}
A to program do obsługi czasu:
Kod: Zaznacz cały
#include "czas.h"
#include "harddef.h"
#include "makra.h"
#include "znaki.h"
#include <avr/delay.h> // funkcje opóźniające
uint8_t jednostki_msekund = 0, dziesiatki_msekund = 0,
jednostki_sekund = 0, dziesiatki_sekund = 0;
int r,t1,t2,t3,t4;
r=1;
void akt_czas(void){
(r==0){
jednostki_msekund++; // zwiększ licznik jednostek milisekund o 1
if(jednostki_msekund == 10) // jeśli licznik jednostek milisekund osiągnął wartość 10 to
{
jednostki_msekund = 0; // wyzeruj licznik jednostek milisekund
dziesiatki_msekund++; // zwiększ licznik dziesiątek milisekund o 1
if(dziesiatki_msekund == 10) // jeśli licznik dziesiątek milisekund osiągnął wartość 10 to
{
dziesiatki_msekund = 0; // wyzeruj licznik dziesiątek milisekund
jednostki_sekund++; // zwiększ licznik dziesiątek sekund o 1
if(jednostki_sekund == 10) // jeśli licznik jednostek sekund osiągnął wartość 10 to
{
jednostki_sekund = 0; // wyzeruj licznik jednostek sekund
dziesiatki_sekund++; // zwiększ licznik dziesiątek sekund o 1
if(dziesiatki_sekund == 10) // jeśli licznik dziesiątek sekund osiągnął wartość 6 to
{
dziesiatki_sekund = 0; // wyzeruj licznik dziesiątek sekund
}
}
}
}
t1=jednostki_msekund;
t2=dziesiatki_msekund;
t3=jednostki_sekund;
t4=dziesiatki_sekund;
}
}
void pokaz_czas(void){
AktWysw++;
if(!(PIN(SW) & 1<<SW_2))
{
switch(AktWysw){
case 1:
{
PORT(LED)= Liczby[t1]; // na wyświetlaczu wyświetl odpowiedni znak pobrany z pliku znaki.h
PORT(SEG) = WSeg[3]; // włącz pierwszą cyfrę wyświetlcza
break; // opuść instrukcję switch
}
case 2:
{
PORT(LED)= Liczby[t2];
PORT(SEG) = WSeg[2];
break; // opuść instrukcję switch
}
case 3:
{
PORT(LED)= Liczby[t3];
PORT(SEG) = WSeg[1];
break; // opuść instrukcję switch
}
case 4:
{
PORT(LED)= Liczby[t4];
PORT(SEG) = WSeg[0];
break; // opuść instrukcję switch
}
case 5:
{
AktWysw=0; // zeruj zmienną AktWysw
break; // opuść instrukcję switch
}
}
r=1;
}
else {
switch(AktWysw){
case 1:
{
PORT(LED)= Liczby[jednostki_msekund];
PORT(SEG) = WSeg[3];
break; // opuść instrukcję switch
}
case 2:
{
PORT(LED)= Liczby[dziesiatki_msekund];
PORT(SEG) = WSeg[2];
break; // opuść instrukcję switch
}
case 3:
{
PORT(LED)= Liczby[jednostki_sekund];
PORT(SEG) = WSeg[1];
break; // opuść instrukcję switch
}
case 4:
{
PORT(LED)= Liczby[dziesiatki_sekund];
PORT(SEG) = WSeg[0];
break; // opuść instrukcję switch
}
case 5:
{
AktWysw=0; // zeruj zmienną AktWysw
break; // opuść instrukcję switch
}
}
}
}
// PRZYCISK RESETU
void reset(void){
if(!(PIN(SW) & 1<<SW_1))
{
jednostki_msekund = 0;
dziesiatki_msekund = 0;
jednostki_sekund = 0;
dziesiatki_sekund = 0;
r=0;
}
}
BARDZO PROSZĘ O POMOC