Jump to content
ELFORUM - Forumul electronistilor

digitalRead()


Guest

Recommended Posts

Arduino UNO

Am nevoie sa inlocuiesc pentru a salva timp, digitalRead(A3) cu o citire din PINC sau PORTC care credeti ca e mai potrivita pentru citire mai rapida.

As vrea un exemplu.

Edited by Guest
Link to comment
  • Replies 11
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

temp = PINC & 0x01; //ignora tot, mai putin pinul 1
if (temp == 0x00) //daca butonul de pe pin 1 este actionat fa ceva.

Nota: butonul este conectat intre pinul 1 si GND.

Era suficient sa citesti foaia de catalog la sectiunea "Porturi", dar iti este mai comod sa faci ca altii sa-si piarda timpul pentru ceva banal.

Link to comment

inainte sa postez am cautat prin manual dar nu prea m-am lamurit.  

eu am incercat asa fara succes, codul postat nu l-am incercat inca pentru ca nu am aici un arduino 

 

ISR (PCINT1_vect)
{
  //partea care conteaza aici
  if ((PINC&0b0001000) == 0x01) {
		i++;
	}
}  

 

codul postat din ce am inteles eu in ds nu ar trebuii sa fie ?

 

temp = PINC & 0x03; //ignora tot, mai putin A3
if (temp == 0x01) //daca butonul de pe pin A3 este actionat fa ceva.

 

Edited by Guest
Link to comment
0 & 1 = 0
1 & 1 = 1
temp = PINC & 0x01; //ignora tot, mai putin pinul 1
if (temp == 0x00) //daca butonul de pe pin 1 este actionat fa ceva

Nota: butonul este conectat intre pinul 1 si GND.

In alta ordine de idei, ca sa folosesti intreruperile asignate schimbarii starii pinilor (PCINT) ai activat vreunul din bitii PCIEx din registrul PCICR, si daca da, care anume?

Pentru exemplul dat de mine, daca vrei sa activezi intreruperea aferenta PINC.1, trebuie sa activezi  PCIE1 si, in continuare sa activezi bitul PCINT9 din registrul PCMSK1.

 

Un exemplu pentru utilizarea PINB.0, 1 si 2 pentru generarea de intrerupere:

DDRB=0b11111000;
PORTB=0b00000111;
/* in main, inainte de a activa intreruperile cu sei() */
PCICR = (1<<PCIE0);
PCMSK0 = (1<<PCINT2)|(1<<PCINT1)|(1<<PCINT0);
/*------*/
if ((PINB & (1<<PINB2))==0)
	{
		fa ceva ...
		
		
	}
	
	if ((PINB &(1<<PINB1)) == 0)
	{
		fa altceva ...

	}
	

	if ((PINB &(1<<PINB0)) == 0)
	{
	 fa cu totul si cu totul altceva
	}

 

Link to comment
void setup(){
 SetupISR(A3);
}

void SetupISR(byte pin)
{
  *digitalPinToPCMSK(pin) |= bit (digitalPinToPCMSKbit(pin));
  PCIFR  |= bit (digitalPinToPCICRbit(pin));
  PCICR  |= bit (digitalPinToPCICRbit(pin));
}

ISR (PCINT1_vect)
{
	//
}

 

Link to comment

a mers cu

volatile int iX = 0;

void setup(){
 SetupISR(A3);
 /* sau
  cli();
  PCICR |= 0x02;
  PCMSK1 = 0b0001000;
  sei();
 */
}

void SetupISR(byte pin)
{
  *digitalPinToPCMSK(pin) |= bit (digitalPinToPCMSKbit(pin));
  PCIFR  |= bit (digitalPinToPCICRbit(pin));
  PCICR  |= bit (digitalPinToPCICRbit(pin));
}

ISR (PCINT1_vect)
{
	if (((PINC>>0x03) & 1) == 0x01) iX++;
}

 

Link to comment

da, fireste. aveam deja cablajul facut in configuratia asta pe pin A3... de asta trebuia asa. 

 

nu stiu cat e de corect, dar merge bine. pe osciloscop e ok. fac detecție la zero cross acolo. 

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