Witam
klopot mam z obsługą przerwania ... a mianowicie jestem początkującym programistą w języku C ...
lecz ... potrzebuję by program wykrył wciśnięcie przycisku (podanie 1 logicznej , 0 logiczne robione jest poprzez rezystor podłączony do masy)
i tu jest klopot ...
program reaguje na przerwanie INT1 lecz 2 razy ! raz jak wcisnę przycisk a drugi raz jak go puszczę ...
jak wyeliminować taką sytuację ...
program w c :
jeżeli mogę prośić o pomoc w ustawieniu obsługi przerwania będę bardzo wdzięczny.
jeszcze raz w skrócie
potrzebuję by procesor reagował TYLKO na zbocze opadające lub narastające ... (najlepiej na narastające)
pozdrawiam
Marek
Proszę umieszczać listingi programów w znacznikach "Code". [c_p]
klopot mam z obsługą przerwania ... a mianowicie jestem początkującym programistą w języku C ...
lecz ... potrzebuję by program wykrył wciśnięcie przycisku (podanie 1 logicznej , 0 logiczne robione jest poprzez rezystor podłączony do masy)
i tu jest klopot ...
program reaguje na przerwanie INT1 lecz 2 razy ! raz jak wcisnę przycisk a drugi raz jak go puszczę ...
jak wyeliminować taką sytuację ...
program w c :
#include "stdio.h"
#include "stdlib.h"
#include <avr/io.h> //adresy rejestrow
#include <util\delay.h> //biblioteka z opoznieniami
#include <avr/interrupt.h>
volatile int liczba_monet;
volatile int zmienna,zmienna2,zmienna3;
void inicjalizacja_licznika(void)
{
//TCCR1B = _BV(ICNC1)|_BV(ICES1)|_BV(CS11)|_BV(CS12); // testowałem i taką kombinację lecz także nie działa prawidłowo
GIMSK = _BV(INT1); //włącz obsługę przerwania INT1
MCUCR=_BV(ISC01)|~_BV(ISC00);
sei(); // włącz obsługę przerwań
}
void odczytaj_piny(void)
{
if (bit_is_set(PINB,7)) liczba_monet = 1;
if (bit_is_set(PINB,6)) liczba_monet = 2;
if (bit_is_set(PINB,5)) liczba_monet = 3;
if (bit_is_set(PINB,4)) liczba_monet = 4;
if (bit_is_set(PINB,3)) liczba_monet = 5;
if (bit_is_set(PINB,2)) liczba_monet = 6;
if (bit_is_set(PINB,1)) liczba_monet = 7;
if (bit_is_set(PINB,0)) liczba_monet = 8;
}
void krec_silnikiem(void)
{
cli();
PORTD&=~_BV(6);
_delay_ms(500);
while((bit_is_set(PIND,0))){
PORTD&=~_BV(6);
}
PORTD|=_BV(6);
_delay_ms(500);
zmienna=0;
zmienna2=1;
sei();
}
void czekaj_na_przycisk(void)
{
cli();
while (bit_is_clear(PIND,1));
krec_silnikiem();
}
SIGNAL (SIG_INTERRUPT1)
{
cli();
zmienna3=0;
if (zmienna>8) zmienna=0;
_delay_ms(600);
zmienna2=liczba_monet - zmienna;
++zmienna;
PORTD^=_BV(4); //pod ten pin podłączony jest led , który "miga" mi zawsze 2 razy (czyli raz jak naciskam przycisk a 2 raz jak go puszczę) a powinien 1 raz gdy przycisk jest użyty ...
if (zmienna2==0) czekaj_na_przycisk();
_delay_ms(100);
sei();
}
int main(void) {
DDRB = 0x00; // porb jako wejścia (ilosc_monet)
DDRD = 0b01010000; // PIN D6 WYJSCIE
DDRA = 0b00000100; // PIN A.2 WEJSCIE
PORTD|=_BV(4);
PORTD|=_BV(6);
PORTD&=~_BV(1);
zmienna=0;
zmienna2=0;
zmienna3=1;
odczytaj_piny();
inicjalizacja_licznika();
do
{
_delay_ms(100); // pętla pusta i tak wszystko jest w przerwaniu.
}
while(1);
}
jeżeli mogę prośić o pomoc w ustawieniu obsługi przerwania będę bardzo wdzięczny.
jeszcze raz w skrócie
potrzebuję by procesor reagował TYLKO na zbocze opadające lub narastające ... (najlepiej na narastające)
pozdrawiam
Marek
Proszę umieszczać listingi programów w znacznikach "Code". [c_p]