• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Modyfikacja dwóch bibliotek pod kątem kolidujących przerwań
#1
Witam, Mógłbym prosić o przerobienie tych dwóch bibliotek tak aby przerwania nie kolidowały że sobą?

Problem polega na tym że jak wyłączę :
Kod:
irrecv.enableIRIn();
Komputer rozpoznaje Arduino jako "Urządzenie klawiatury HID" aczkolwiek po włączeniu IR komputer wyświetla komunikat "Nie rozpoznano urządzenia USB"


Kod:
//-------------------------------Inicjowanie Biblotek----------------------------------------------------------
#include "UsbKeyboard.h"
#include <IRremote.h>
//-----------------------------------Deklarowanie Zmiennych----------------------------------------------------
//----------------------Pilot----------------------------------
IRrecv irrecv(11);
decode_results results;
//-------------------Klawiatura--------------------------------
#define PLAY 6
#define SSTOP 7
#define PAUSE 8
#define FORWARD 9
#define REVERSE 10
#define BYPASS_TIMER_ISR 1
int pushF = 0;
int pushR = 0;
//-------------------------------------------------------------------------------------------------------------
void setup() {
//--------------------------Pilot------------------------------------
Serial.begin(9600);
irrecv.enableIRIn();
pinMode(12, OUTPUT);        // PC ON/OFF
pinMode(13, OUTPUT);        // DIODA LED
pinMode(14, OUTPUT);        // PC DVD EJECT
//------------------------Klawiatura---------------------------------
pinMode(PLAY, INPUT);
pinMode(SSTOP, INPUT);
pinMode(PAUSE, INPUT);
pinMode(FORWARD, INPUT);
pinMode(REVERSE, INPUT);
digitalWrite(PLAY, HIGH);    
digitalWrite(SSTOP, HIGH);
digitalWrite(PAUSE, HIGH);    
digitalWrite(FORWARD, HIGH);
digitalWrite(REVERSE, HIGH);

#if BYPASS_TIMER_ISR
TIMSK0&=!(1<<TOIE0); // ++
#endif
 cli();

 // Force re-enumeration so the host will detect us
 usbDeviceDisconnect();
 delayMs(250);
 usbDeviceConnect();

 // Set interrupts again
 sei();
}

#if BYPASS_TIMER_ISR
void delayMs(unsigned int ms) {
for (int i = 0; i < ms; i++) {
  delayMicroseconds(1000);
}
}
#endif
//--------------------------------------------------------------------------------------------------------------
void loop() {
//-------------------------Sterowanie Pilotem---------------------------------------
if (irrecv.decode(&results)) {
  translateIR();
 // unknownRemoter();
   irrecv.resume(); // Receive the next value
}
//-----------------------Klawiatura USB------------------------------------------------
UsbKeyboard.update();
//digitalWrite(13, !digitalRead(13));
if (digitalRead(PLAY) == 0) {
   UsbKeyboard.sendKeyStroke(KEY_PLAY);
   Bypass();
}
if (digitalRead(SSTOP) == 0) {
   UsbKeyboard.sendKeyStroke(KEY_SSTOP);
   Bypass();
}
if (digitalRead(PAUSE) == 0) {
   UsbKeyboard.sendKeyStroke(KEY_PAUSE);
   Bypass();
}
if (digitalRead(FORWARD) == 0) {pushF ++;}
if (digitalRead(FORWARD) == 1) {pushF = 0;}
      if ( pushF > 1 and pushF < 4 ){
         UsbKeyboard.sendKeyStroke(KEY_FORWARD);
         Bypass(); }

      if ( pushF > 4 ){
         UsbKeyboard.sendKeyStroke(KEY_FASTFORWARD);
         Bypass(); }
if (digitalRead(REVERSE) == 0) {pushR ++;}
if (digitalRead(REVERSE) == 1) {pushR = 0;}
      if ( pushR > 1 and pushR < 4 ){
         UsbKeyboard.sendKeyStroke(KEY_REVERSE);
         Bypass(); }
      if ( pushR > 4 ){
         UsbKeyboard.sendKeyStroke(KEY_R);
         Bypass(); }
}
//----podejmuje działania na podstawie kodu IR otrzymanych opisując Car MP3 kodów IR-------
void translateIR(){
 
switch(results.value){  
 case 0x20D352AD:// POWER  
   digitalWrite(12, HIGH);
   delayMs(500);
   digitalWrite(12, LOW);
   break;
 case 0x20D322DD:// EJECT  
   digitalWrite(14, HIGH);
   delayMs(500);
   digitalWrite(14, LOW);
   break;
   break;
 case  0x20D3C837:// TV MODE  
   UsbKeyboard.sendKeyStroke(KEY_M);
   Bypass();
   break;
 case 0x20D3F00F:// SETUP  
   UsbKeyboard.sendKeyStroke(KEY_SSTOP);
   Bypass();
   break;
 case 0x20D3B24D:// SUSPEND
   UsbKeyboard.sendKeyStroke(KEY_TAB);
   Bypass();
   break;
 case 0x20D3827D:// 1  
   UsbKeyboard.sendKeyStroke(KEY_1);
   Bypass();
 case 0x20D3C03F:// 2  
   UsbKeyboard.sendKeyStroke(KEY_2);
   Bypass();
   break;
 case 0x20D342BD:// 3  
   UsbKeyboard.sendKeyStroke(KEY_3);
   Bypass();
   break;
 case 0x20D3A25D:// 4  
   UsbKeyboard.sendKeyStroke(KEY_4);
   Bypass();
   break;
 case 0x20D3E01F:// 5  
   UsbKeyboard.sendKeyStroke(KEY_5);
   Bypass();
   break;
 case 0x20D3629D:// 6  
   UsbKeyboard.sendKeyStroke(KEY_6);
   Bypass();
   break;
 case 0x20D3AA55:// 7  
   UsbKeyboard.sendKeyStroke(KEY_7);
   Bypass();
   break;
 case 0x20D3E817:// 8  
   UsbKeyboard.sendKeyStroke(KEY_8);
   Bypass();
   break;
 case 0x20D36A95:// 9  
   UsbKeyboard.sendKeyStroke(KEY_9);
   Bypass();
   break;
 case 0x20D3D827:// 0  
   UsbKeyboard.sendKeyStroke(KEY_0);
   Bypass();
   break;
 case 0x20D39A65:// DELETE  
   UsbKeyboard.sendKeyStroke(KEY_DEL);
   Bypass();
   break;
 case 0x20D35AA5:// CAPS/NUL  
   UsbKeyboard.sendKeyStroke(MOD_CONTROL_LEFT);
   Bypass();
   break;
 case 0x20D3FA05:// VIDEO  
   UsbKeyboard.sendKeyStroke(KEY_SSTOP);
   Bypass();
   break;
 case 0x20D37887:// MUSIC
   UsbKeyboard.sendKeyStroke(KEY_SSTOP);
   Bypass();
   break;
 case 0x20D33AC5:// PHOTO  
   UsbKeyboard.sendKeyStroke(KEY_SSTOP);
   Bypass();
   break;
 case 0x20D3B847:// ALL
   UsbKeyboard.sendKeyStroke(KEY_SSTOP);
   Bypass();
   break;
 case 0x20D3E21D:// RETURN
   UsbKeyboard.sendKeyStroke(KEY_BACKSPACE);
   Bypass();
   break;
 case 0x20D3A05F:// SOURCE
   UsbKeyboard.sendKeyStroke(KEY_J);
   Bypass();
   break;
 case 0x20D3C23D:// LEWO
   UsbKeyboard.sendKeyStroke(KEY_LEFT);
   Bypass();
   break;
 case 0x20D3807F:// PRAWO
   UsbKeyboard.sendKeyStroke(KEY_RIGHT);
   Bypass();
   break;
 case 0x20D3609F:// GÓRA
   UsbKeyboard.sendKeyStroke(KEY_UP);
   Bypass();
   break;
 case 0x20D350AF:// DÓŁ
   UsbKeyboard.sendKeyStroke(KEY_DOWN);
   Bypass();
   break;
 case 0x20D3D22D:// INFO
   UsbKeyboard.sendKeyStroke(KEY_I);
   Bypass();
   break;
 case 0x20D332CD:// STOP  
   UsbKeyboard.sendKeyStroke(KEY_SSTOP);
   Bypass();
   break;
 case 0x20D3728D :// PAGE UP(VOL+)
   UsbKeyboard.sendKeyStroke(KEY_PAGEUP);
   Bypass();
   break;
 case 0x20D34AB5 :// PAGE DOWN(VOL-)
   UsbKeyboard.sendKeyStroke(KEY_PAGEDOWN);
   Bypass();
   break;
 case 0x20D30AF5:// PLAY
      UsbKeyboard.sendKeyStroke(KEY_PLAY);
      Bypass();
   break;
 case 0x20D32AD5:// PAUSE      
      UsbKeyboard.sendKeyStroke(KEY_PAUSE);
      Bypass();
   break;
 case 0x20D38A75:// MUTE
      UsbKeyboard.sendKeyStroke(MOD_CONTROL_LEFT);
      UsbKeyboard.sendKeyStroke(KEY_T);
      Bypass();
      break;
 case 0x20D3708F:// REV      
      UsbKeyboard.sendKeyStroke(KEY_R);
      Bypass();      
   break;
 case 0x20D3B04F:// FWD      
      UsbKeyboard.sendKeyStroke(KEY_F);
      Bypass();    
   break;
 case 0x20D3CA35:// MENU
   UsbKeyboard.sendKeyStroke(KEY_S);
   Bypass();
   break;
 case 0x20D348B7:// PREV      
      UsbKeyboard.sendKeyStroke(KEY_REVERSE);
      Bypass();
   break;
 case 0x20D38877:// NEXT      
      UsbKeyboard.sendKeyStroke(KEY_FORWARD);
      Bypass();
   break;
 case 0x20D3F20D:// TITLE
   UsbKeyboard.sendKeyStroke(KEY_N);
   Bypass();
   break;
 case 0x20D3EA15:// REPEAT
   UsbKeyboard.sendKeyStroke(KEY_E);
   Bypass();
   break;
 case 0x20D3A857:// SLOW
   UsbKeyboard.sendKeyStroke(KEY_ESC);
   Bypass();
   break;
 case 0x20D36897:// ANGLE
   UsbKeyboard.sendKeyStroke(KEY_BACKSLASH);
   Bypass();
   break;
 case 0x20D358A7:// AUDIO
   UsbKeyboard.sendKeyStroke(KEY_SSTOP);
   Bypass();
   break;
 case 0x20D31AE5:// SUBTITLE
   UsbKeyboard.sendKeyStroke(KEY_T);
   Bypass();
   break;
 case 0x20D39867:// ZOOM
   UsbKeyboard.sendKeyStroke(KEY_Z);
   Bypass();
   break;
 case 0x20D340BF:// ENTER
   UsbKeyboard.sendKeyStroke(KEY_ENTER);
   Bypass();
   break;
 case 0x20D3906F:// HOME(A-B)
   UsbKeyboard.sendKeyStroke(KEY_HOME);
   Bypass();
   break;
 case 0x20D312ED:// FILE MODE
   UsbKeyboard.sendKeyStroke(KEY_C);
   Bypass();
   break;
 case 0x20D3DA25:// TIME SEEK
   UsbKeyboard.sendKeyStroke(KEY_SSTOP);
   Bypass();
   break;
 default:
   Serial.print("  ZA DŁUGO WCIŚNIĘTY PRZYCISK PILOTA  ");
   Serial.println(results.value, HEX);
}
   delayMs(100);
}
//--------------------------------------------------------------------------------------------------------------
void Bypass(){
#if BYPASS_TIMER_ISR  
 delayMs(200);
#else
 delay(130);
#endif
}

Uwaga! biblioteka USBKeyboard działa na arduino ide do 1.0.6

Arduino IDE 1.0.6

[Obrazek: virtual-usb-keyboard-schematic.jpg]


Załączone pliki
.zip   UsbKeyboard.zip (Rozmiar: 113.65 KB / Pobrań: 0)
.zip   IRremote.zip (Rozmiar: 69.76 KB / Pobrań: 0)
 
Odpowiedź
#2
Po namyśle postanowiłem rozłożyć program na dwie atmegi 8 połączone ze sobą po rs232.

Wysłane z mojego LG-H955 6.0.1
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości