Arduino Polska Forum

Pełna wersja: Arduino Uno Int0 dziwne zachowanie?
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2
Witam,


Mam problem z programem poniżej (używam Arduino Uno).


Program powinien przełączać zmienna state na przerwaniu generowanym na pinie2 (na zbocze RISING)

(do pinu 2 podłączony jest pilot rc na układzie PT2262-generujący stan wysoki na naciśniecie przycisku)

(Dodam, że na zbocze FALLING działa poprawnie)


Czy któś może mi powiedzieć, dlaczego program poniżej bez tej linijki działa ok, a z nia juz nie?

Kod:
//digitalWrite(Usb1, StateCopy);






Program:


Kod:
const byte button1Pin = 2;     // the number of the pushbutton pin
const byte Usb1 =  4;      // the number of the LED pin
const byte interruptPin = 2;

volatile byte state = 0;
byte StateCopy=0;

void setup() {
  pinMode(Usb1, OUTPUT);
  pinMode(button1Pin, INPUT);
  //pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), blink, RISING);
  Serial.begin(9600);
  }

void loop() {
 
noInterrupts();
StateCopy=state;
interrupts();

//digitalWrite(Usb1, StateCopy);          /////////////////////////////////bez tego dziala///////                            

Serial.print("state = ");
Serial.println(StateCopy);

delay(10);



}


void blink() {
  state=!state;  
}

Z góry dziękuję za pomoc
dodam jeszcze, żeby było śmiesznie, że jeżeli
pod Usb1 (w linijce ponizej) ustawie diode na Pinie13, to działa,
ale jak ustawie przekaźnik na Pinie4, do nie działa
(zarówno przy zasilaniu z portu usb pc jak i z zasilacza usb)

//digitalWrite(Usb1, StateCopy);          /////////////////////////////////bez tego dziala///////
Kod:
//pinMode(interruptPin, INPUT_PULLUP);
dlaczego masz to za komentowane to bardzo ważna linijka
Kod:
noInterrupts();

interrupts();
gdzie są te pod programy
z tą linijką, czy bez działa tak samo.

Interrupts()
NoInterrpts()
to funkcje, skoro się skompilowało tzn, że raczej są dodane (tak myślę, w końcu działają, prawie dobrze Wink )
podobnie używam

attachInterrupt

a nigdzie nie deklarowałem dodania przerwań
Słuchaj pullup musi być do button to niweluje hazard ja mam na to iny sposób ale to sposób twórców po 2 skąd wiesz czy pod programach kuter są niewiadome nie masz twardej definicji pinu dlatego programy pisze od zera a nie z innych programów.
dla pin13 działa, dla pin4 nie. dziwne
Kod:
const byte button1Pin = 2;     // the number of the pushbutton pin
const byte Usb1 =  4;      // the number of the LED pin
const byte interruptPin = 2;

volatile byte state = 0;
byte StateCopy=0;

void setup() {
  pinMode(Usb1, OUTPUT);
  pinMode(button1Pin, INPUT);
  //pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), blink, RISING);
  Serial.begin(9600);
  }

void loop() {


noInterrupts();
StateCopy=state;
digitalWrite(Usb1, StateCopy);  
interrupts();

//       /////////////////////////////////bez tego dziala///////                            

Serial.print("state = ");
Serial.println(StateCopy);

delay(10);



}


void blink() {
  state=!state;  
}
Sprawdz to.
też próbowałem i jest to samo.

przerwanie jest generowane przez układ pilot/odbiornik pt2262/2272

jak zbliże je do siebie na odległośc 1cm to działa dla przekaźnika

(dla diody dystans może być znacznie większy i działa)
bo przekaźnik ma duży pobór mocy i możne robić spadki w zasilaniu pokaż schemat połączeń
arduino relay shield v2. mało bierze prądu. z zewnętrznego zasilacza usb tak samo jest
Stron: 1 2