Sari la conținut
ELFORUM - Forumul electronistilor

digitalRead()


Vizitator

Postări Recomandate

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.

Editat de Vizitator
Link spre comentariu
  • Răspunsuri 11
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • nico_2010

    6

Top autori în acest subiect

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 spre comentariu

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.

 

Editat de Vizitator
Link spre comentariu
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 spre comentariu
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 spre comentariu

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 spre comentariu
Acum 9 ore, Aw Genetix a spus:

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

Esti sigur ca este corect ceea ce am bolduit?

Butonul este conectat intre +5V si pinul A3, cu rezistenta la masa?

Link spre comentariu

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 spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări