Jump to content
ELFORUM - Forumul electronistilor

masurare semnal INT0


Recommended Posts

Buna ziua,

 

Doresc sa 'citesc' durata semnalului pe intrarile INT0 respectiv INT1 pe rising edge.

2 intrerupatoare(mecanice) vor actiona intrarile prin 12V iar pe intrari am divizori rezistivi.

Ma intereseaza durata impulsului si nu nr ei.O cursa completa este de ~380ms iar daca nu si-a facut cursa completa atunci sa activeze iesirea pe PB0, daca cursa s-a facut complet atunci sa intre in temporizare si sa execute urmatoarea masurare dupa 2s.

 

Durata impulsurilor(cursa completa):

On = ~380ms

Off = ~336ms

 

post-8589-139829329565_thumb.jpg

 

uCul folosit va fi un Attiny2313 la 8Mhz.Masurarea o fac cu Timer0.

Inca nu am lucrat niciodata cu intrarile INT0 si INT1 si orice indrumare mi-ar prinde bine.

Sa le comfigurez stiu doar nu stiu ce metoda sa folosesc la masurarea ei?

 

#include <avr/io.h>#include <avr/interrupt.h>ISR(TIMER0_OVF_vect){static unsigned char CountTime = 0;static unsigned char one_unit = 0;   TCNT0 += 6; // Adjust count so we get 250 uS rollover period	   if (++CountTime == 4) //1 ms   {     CountBlinkTime = 0;		if (++one_unit==50) // 50 ms	{	one_unit = 0; //reset	}  }   }int main (void){DDRB |= (1 << 0); // test output  // Set Pin 6 (PD2) as the pin to use for this example  PCMSK |= (1<<PIND2);  // interrupt on INT0 pin rising edge (sensor triggered)   MCUCR = (1<<ISC01) | (1<<ISC00);  // turn on interrupts!  GIMSK  |= (1<<INT0);  // Setup Timer 0    TCCR0B |= (1 << CS01); // 8 divider   TCNT0 = 0;            // Initial value    TIMSK |= (1 << TOIE0);      // Timer 0 Interrupt // sei(); //  Enable global interrupts while (1) {}}SIGNAL (SIG_INT0){ // masurare}
Link to comment
  • 1 month later...
  • Replies 1
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Posted Images

Salut !

pe tine te intereseaza timpul pana cand se intrerupe semnalul pe INTx ?

daca da eu vad un mod foarte simplu:

activezi INTx la rising edge, cand apare triggerul, modifici INTx sa fie la falling edge , si tot asa ( intrerupt intx ( rising ) -> pornit timerul -> intrerupt intx(falling) -> masurat )

si desigur cu overflow, sau cum vrei..

iinterrupt(int0)

{ if (ISC0= rising edge ) up=1;

else if ( isc0= falling edge ) up=0;

}

 

int main(){

activezi int;

while()

{ while( up==1) {count bla bla}

if loops=xx; ( xx = bucle divizate sau cum vrei ) do whatever

}

}

mai ai varianta sa folosesti un timer pe 16biti sau cum iti convine tie ca sa nu folosesti aiurea cpu time

nu uita sa schimbi de la rising edge la falling edge dupa fiecare triger ( de la rising -> falling , si invers )

 

Table 9-2. Interrupt 0 Sense ControlISC01 ISC00 Description0 0 The low level of INT0 generates an interrupt request.0 1 Any logical change on INT0 generates an interrupt request.1 0 The falling edge of INT0 generates an interrupt request.1 1 The rising edge of INT0 generates an interrupt request

cauta in datasheet ce e pt mcu-ul tau, asta e luat de la un attiny13, desi nu ar trebuii sa fie diferit :)

si nu uita sa pui un condensator la intrare ( nu mare ) sa filtrezi spike-urile :)

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines