Sterrenhemel

Maakt niet veel uit, de Saleae ziet er wat mooier uit...

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Ik heb hem geinstalleerd..
Maar nu dus uitzoeken hoe de string te vangen. Het is geen SPi of I2C protocol of zoiets.
Je kan kiezen uit een heleboel...

Man is still the most extraordinary computer of all. JF Kennedy

Je kunt toch gewoon een signaal 'opnemen' en het later bekijken? (ontleden kan het programma het niet omdat het een onbekend iets is)

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Op 12 november 2020 13:10:32 schreef Arco:
Je kunt toch gewoon een signaal 'opnemen' en het later bekijken? (ontleden kan het programma het niet omdat het een onbekend iets is)

Het zit hem in het 'gewoon'.. :/

De analyzer werkt, ik krijg de interrupt keurig te zien op kanaal 1, maar ik kan die string van de IR-sensor niet vangen. Op de scoop zie ik in een flits wel een pulstreintje voorbijkomen als ik de AB indruk.

Maar hoe ik nu aan het programma (Salae Logic 1.28) vertel dat hij deze pulstrein moet opnemen, zie ik niet...

Man is still the most extraordinary computer of all. JF Kennedy

Op het moment heb ik USBee Suite Pro geinstalleerd: https://www.usbee.com/usbeesuitesw.zip
Saleae moet ik weer eens installeren, maar daar moet ik eens goed voor gaan zitten een keertje...

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Op het moment heb ik USBee Suite Pro geinstalleerd: https://www.usbee.com/usbeesuitesw.zip

Heb ik duis ook maar even gedaan. Maar ik zie alleen maar 7 fel gekleurde kanalen, maar geen signaal op het scherm. het enige dat lukt is "demo mode",
maar dat is maar een voorbeeld...

Man is still the most extraordinary computer of all. JF Kennedy

De Salae logic werkt wel, maar alleen als je de AB knop ingedrukt houdt.
Maar dan krijg je geen pulstrein (wel het eerste blok van 9ms, de rest is hoog).

USBEE Suite: krijg ik niks op de kanalen te zien.

Zoeken levert op dat Pulseview ook wel wordt gebruikt bij Logic analyzers.

Helaas, na installatie verschijnen allerlei "Python-dll-errors".
Paar keer geïnstalleerd, hetzelfde resultaat.

Zucht ....
:'(

Man is still the most extraordinary computer of all. JF Kennedy

Als je het eerste blok wel ziet, werkt de LA dus goed. (er komt dan waarschijnlijk niets uit de ontvanger?)
Welke van de 2 programma's werkt, hangt van de usb VID/PID (Vendor ID / Product ID) af die er in de LA zit. (programma controleert dat)

[Bericht gewijzigd door Arco op 12 november 2020 21:31:59 (39%)]

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Kleine update: Ik heb Pulseview nu aan de praat (kwestie van andere driver voor de unit).

En ik krijg de pulsen nog te zien ook.. :)

Kanaal 3 is de interrupt, Kanaal 1 is de IR Sensor...

[Bericht gewijzigd door Bavelt op 12 november 2020 21:44:12 (16%)]

Man is still the most extraordinary computer of all. JF Kennedy

Nu uitvergroot na de start van 9ms...

Man is still the most extraordinary computer of all. JF Kennedy

De 'lange' pulsen lijken me veel langer als de verwachte 1125 uS... (eerder iets van 1700uS zo te zien)

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Zo te zien komen er inderdaad 32 pulsen.
De start (9ms) en 1e blok erna (4,5ms) lijken ook goed.

Zie jij wellicht iets wat afwijkt van de IR-specs, Arco?

[Bericht gewijzigd door Bavelt op 12 november 2020 21:57:44 (36%)]

Man is still the most extraordinary computer of all. JF Kennedy

De 'lange' pulsen lijken me veel langer als de verwachte 1125 uS... (eerder iets van 1700uS zo te zien)

Die moeten toch 1687,5 us zijn? (2250 - 562,5)

Man is still the most extraordinary computer of all. JF Kennedy

Ik dacht dat dat 1125uS moest zijn. Bij 1687 moet de MAXLO een stuk omhoog (tot 18 of 19)

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Ik zat me net iets te bedenken; ik kan natuurlijk de string altijd emuleren door vanuit een andere pic dit signaal uit te zenden (met een knop of doorlopend).

Dan zou ik daarmee toch ook kunnen testen...

Of kan ik ook iets slimmers doen met de logic analyzer in bv de interrupt routine om te kijken wat er gebeurt?
(ik heb weinig ervaring met de logic analyzers..)

Man is still the most extraordinary computer of all. JF Kennedy

MAXLO al geprobeerd met hogere waarde? (met 14 gaat het zeker niet werken)

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Op 12 november 2020 22:10:57 schreef Arco:
MAXLO al geprobeerd met hogere waarde? (met 14 gaat het zeker niet werken)

Ja, geen effect... ;(

Er komt geen enkele puls voor die 'voldoet' (zelfs als ik if cnt = 1 maak)..

Man is still the most extraordinary computer of all. JF Kennedy

Nog even naar gekeken, er zit ergens iets vreemds in de code, ik zal nieuwe posten als ik eruit ben...
Even snel aangepast, werkt dit beter?...

pic basic code:


'======================================================================================
Program Test

Const MINHI    = 4           'Min value pulse high
      MAXHI    = 8           'Max value pulse high
      MINLO    = 4           'Min value pulse low
      MEDLO    = 8           'Max value for '1' in pulse low
      MAXLO    = 19          'Max value pulse low
      TIMEOUT  = 30          'Max count value

Dim HiCnt        As Byte
    LoCnt        As Byte
    Cnt          As Byte
    IRCode       As String[32]
    Flags        As Byte
      fPrev      As sBit At Flags.0
      fIRFound   As sBit At Flags.1

Dim IRIn         As sBit At PORTB.0

'========================================================================================
Sub procedure Interrupt() iv 0x0004 ics ICS_AUTO
'========================================================================================
  IF TMR2IF_bit Then                                                'Timer interrupt?
    If fIRFound = 0 Then
      If IrIn Then                                                   'Input high?
        If fPrev = 0 Then                                            'Low to high?
          If (HiCnt = TIMEOUT) And (LoCnt = TIMEOUT) Then            'If timeouts, then
            Cnt = 0                                                  'start of new code
            HiCnt = 0                                                '
            LoCnt = 0                                                '
          End If                                                     '
          If (HiCnt > MINHI) And                                     'Pulse within specs?
             (HiCnt < MAXHI) And                                     '
             (LoCnt > MINLO) And                                     '
             (LoCnt < MAXLO) Then                                    '
            If (LoCnt < MEDLO) Then                                  'Yes, add it to
              IRCode[Cnt] = "0"                                      'string
            Else                                                     '
              IRCode[Cnt] = "1"                                      '
            End If                                                   '
            LoCnt = 0                                                '
            HiCnt = 0                                                '
            Inc(Cnt)                                                 '
            If Cnt = 32 then fIRFound = 1 End If                     '32 pulses found
          End If                                                     '
          If HiCnt < TIMEOUT Then Inc(HiCnt) End If                  '
        End If                                                       '
        fPrev = IrIn                                                 'Save new state
        If HiCnt < TIMEOUT Then Inc(HiCnt) End If                    '
      Else                                                           '
        If LoCnt < TIMEOUT Then Inc(LoCnt) End If                  '
      End If                                                         '
    End If
    TMR2IF_bit = 0
  End If
End Sub
Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Nee, hij komt nog steeds niet in een geldige puls.

(IRCode wordt dus nooit gevuld).

Man is still the most extraordinary computer of all. JF Kennedy

Lastig als je iets moet maken wat je niet kunt testen...
De gemarkeerde regel moet in ieder geval weg...

pic basic code:


       HiCnt = 0                                                     ' 
            Inc(Cnt)                                                 '
            If Cnt = 32 then fIRFound = 1 End If                     '32 pulses found
          End If                                                     '
>>>>>>    If HiCnt < TIMEOUT Then Inc(HiCnt) End If <<<<<<           '
        End If                                                       '
        fPrev = IrIn                                                 'Save new state
        If HiCnt < TIMEOUT Then Inc(HiCnt) End If                    '
      Else                                                           '
        If LoCnt < TIMEOUT Then Inc(LoCnt) End If                    '
      End If                                         
Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Nou, ik heb nog lang lopen puzzelen... Er zit gewoon iets raars in het het programma.
Bedtijd nu..Morgen weer verder. :O

Man is still the most extraordinary computer of all. JF Kennedy

Als je niet kunt testen is het lastig. (met testen is het waarschijnlijk zo opgelost). Laatste poging:

pic basic code:


'======================================================================================
Program Test  'NEC IR Protocol receiver

Const MINHI    = 3           'Min value pulse high
      MAXHI    = 8           'Max value pulse high
      MINLO    = 3           'Min value pulse low
      MEDLO    = 8           'Max value for '1' in pulse low
      MAXLO    = 19          'Max value pulse low
      TIMEOUT  = 30          'Max count value

Dim HiCnt        As Byte
    LoCnt        As Byte
    Cnt          As Byte
    IRCode       As String[32]
    Flags        As Byte
      fPrev      As sBit At Flags.0
      fIRFound   As sBit At Flags.1

Dim IRIn         As sBit At PORTB.0

'========================================================================================
Sub procedure Interrupt() iv 0x0004 ics ICS_AUTO
'========================================================================================
  IF TMR2IF_bit Then                                                'Timer interrupt?
    If fIRFound = 0 Then
      If IrIn Then                                                   'Input high?
        If fPrev = 0 Then                                            'Low to high?
          If (HiCnt = TIMEOUT) And (LoCnt = TIMEOUT) Then            'If timeouts, then
            Cnt = 0                                                  'start of new code
            HiCnt = 0                                                '
            LoCnt = 0                                                '
          End If                                                     '
          If (HiCnt > MINHI) And                                     'Pulse within specs?
             (HiCnt < MAXHI) And                                     '
             (LoCnt > MINLO) And                                     '
             (LoCnt < MAXLO) Then                                    '
            If (LoCnt < MEDLO) Then                                  'Yes, add it to
              IRCode[Cnt] = "0"                                      'string
            Else                                                     '
              IRCode[Cnt] = "1"                                      '
            End If                                                   '
            LoCnt = 0                                                '
            HiCnt = 0                                                '
            Inc(Cnt)                                                 '
            If Cnt = 32 then fIRFound = 1 End If                     '32 pulses found
          End If                                                     '
        End If                                                       '
        If HiCnt < TIMEOUT Then Inc(HiCnt) End If                    '
      Else                                                           '
          If LoCnt < TIMEOUT Then Inc(LoCnt) End If                  '
      End If                                                         '
      fPrev = IrIn                                                   'Save new state
    End If
    TMR2IF_bit = 0
  End If
End Sub
Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Ik heb een klein recht-toe-recht aan programmaatje gemaakt om een toets van de IR te simuleren. Ik krijg dan exact dezelfde puls als van de IR-sensor.
Als ik deze puls op de Arduino aansluit, is het resultaat exact hetzelde als van de remote. Dus dat werkt.
Ook op de Amalyzer is te zien dat beide signalen gelljk zijn.

Hiermee is het MB programma ook te testen. Daar zit dus nog iets fout, want die geeft geen resultaat.

IR-Simulatie:

pic basic code:

Program PWM_1572

Dim i1 As Byte

Sub Procedure Send_Puls()
LATA.2 = 0
Delay_ms(9)

LATA.2 = 1
Delay_ms(4)
Delay_us(500)

For i1 = 1 to 8
  LATA.2 = 0
  Delay_us(562)
  LATA.2 = 1
  Delay_Us(562)
Next i1

 For i1 = 1 to 9
  LATA.2 = 0
  Delay_us(562)
  LATA.2 = 1
  Delay_Us(1687)
Next i1

For i1 = 1 to 1
  LATA.2 = 0
  Delay_us(562)
  LATA.2 = 1
  Delay_Us(562)
Next i1

For i1 = 1 to 1
  LATA.2 = 0
  Delay_us(562)
  LATA.2 = 1
  Delay_Us(1687)
Next i1

For i1 = 1 to 3
  LATA.2 = 0
  Delay_us(562)
  LATA.2 = 1
  Delay_Us(562)
Next i1

 For i1 = 1 to 1
  LATA.2 = 0
  Delay_us(562)
  LATA.2 = 1
  Delay_Us(1687)
Next i1

 For i1 = 1 to 2
  LATA.2 = 0
  Delay_us(562)
  LATA.2 = 1
  Delay_Us(562)
Next i1

 For i1 = 1 to 1
  LATA.2 = 0
  Delay_us(562)
  LATA.2 = 1
  Delay_Us(1687)
Next i1

For i1 = 1 to 1
  LATA.2 = 0
  Delay_us(562)
  LATA.2 = 1
  Delay_Us(562)
Next i1

 For i1 = 1 to 3
  LATA.2 = 0
  Delay_us(562)
  LATA.2 = 1
  Delay_Us(1687)
Next i1

 For i1 = 1 to 1
  LATA.2 = 0
  Delay_us(562)
  LATA.2 = 1
  Delay_Us(562)
Next i1

  For i1 = 1 to 1
  LATA.2 = 0
  Delay_us(562)
  LATA.2 = 1
  Delay_Us(1687)
Next i1

LATA.2 = 0
Delay_us(562)

LATA.2 = 1
End Sub

Main:

  TRISA     = %11111011
  ANSELA    = 0
  OSCCON    = %11110000
  OSCTUNE   = 0
LATA.2 = 1

While True
 Delay_Ms(20)
If PORTA.4 = 0 then
   Send_Puls()
End If
Wend

End.
Man is still the most extraordinary computer of all. JF Kennedy

Voor de volledigheid:

Dit is arduino programaatje die het resultaat toont:

c code:

char text[5];
boolean nec_ok = 0;
byte  i, nec_state = 0, command, inv_command;
unsigned int address;
unsigned long nec_code;
 
void setup() {
 
  // set up the LCD's number of columns and rows
  Serial.begin(9600);  
  Serial.print("Start Ontvangst");
  Serial.println("Address:0x0000");
  Serial.println("Com:0x00 In:0x00");
  
  // Timer1 module configuration
  TCCR1A = 0;
  TCCR1B = 0;                                    // Disable Timer1 module
  TCNT1  = 0;                                    // Set Timer1 preload value to 0 (reset)
  TIMSK1 = 1;                                    // enable Timer1 overflow interrupt
  attachInterrupt(0, remote_read, CHANGE);       // Enable external interrupt (INT0)
}
 
void remote_read() {
unsigned int timer_value;
  if(nec_state != 0){
    timer_value = TCNT1;                         // Store Timer1 value
    TCNT1 = 0;                                   // Reset Timer1
  }
  switch(nec_state){
   case 0 :                                      // Start receiving IR data (we're at the beginning of 9ms pulse)
    TCNT1  = 0;                                  // Reset Timer1
    TCCR1B = 2;                                  // Enable Timer1 module with 1/8 prescaler ( 2 ticks every 1 us)
    nec_state = 1;                               // Next state: end of 9ms pulse (start of 4.5ms space)
    i = 0;
    return;
   case 1 :                                      // End of 9ms pulse
    if((timer_value > 19000) || (timer_value < 17000)){         // Invalid interval ==> stop decoding and reset
      nec_state = 0;                             // Reset decoding process
      TCCR1B = 0;                                // Disable Timer1 module
    }
    else
      nec_state = 2;                             // Next state: end of 4.5ms space (start of 562µs pulse)
    return;
   case 2 :                                      // End of 4.5ms space
    if((timer_value > 10000) || (timer_value < 8000)){
      nec_state = 0;                             // Reset decoding process
      TCCR1B = 0;                                // Disable Timer1 module
    }
    else
      nec_state = 3;                             // Next state: end of 562µs pulse (start of 562µs or 1687µs space)
    return;
   case 3 :                                      // End of 562µs pulse
    if((timer_value > 1400) || (timer_value < 800)){           // Invalid interval ==> stop decoding and reset
      TCCR1B = 0;                                // Disable Timer1 module
      nec_state = 0;                             // Reset decoding process
    }
    else
      nec_state = 4;                             // Next state: end of 562µs or 1687µs space
    return;
   case 4 :                                      // End of 562µs or 1687µs space
    if((timer_value > 3600) || (timer_value < 800)){           // Time interval invalid ==> stop decoding
      TCCR1B = 0;                                // Disable Timer1 module
      nec_state = 0;                             // Reset decoding process
      return;
    }
    if( timer_value > 2000)                      // If space width > 1ms (short space)
      bitSet(nec_code, (31 - i));                // Write 1 to bit (31 - i)
    else                                         // If space width < 1ms (long space)
      bitClear(nec_code, (31 - i));              // Write 0 to bit (31 - i)
    i++;
    if(i > 31){                                  // If all bits are received
      nec_ok = 1;                                // Decoding process OK
      detachInterrupt(0);                        // Disable external interrupt (INT0)
      return;
    }
    nec_state = 3;                               // Next state: end of 562µs pulse (start of 562µs or 1687µs space)
  }
}
 
ISR(TIMER1_OVF_vect) {                           // Timer1 interrupt service routine (ISR)
  nec_state = 0;                                 // Reset decoding process
  TCCR1B = 0;                                    // Disable Timer1 module
}
 
void loop() {
  if(nec_ok){                                    // If the mcu receives NEC message with successful
    nec_ok = 0;                                  // Reset decoding process
    nec_state = 0;
    TCCR1B = 0;                                  // Disable Timer1 module
    address = nec_code >> 16;
    command = nec_code >> 8;
    inv_command = nec_code;
    
    sprintf(text, "%04X", address);
    Serial.println(text);                             // Display address in hex format
    sprintf(text, "%02X", command);
    Serial.println(text);                             // Display command in hex format
    sprintf(text, "%02X", inv_command);
    Serial.println(text);                             // Display inverted command in hex format
    attachInterrupt(0, remote_read, CHANGE);     // Enable external interrupt (INT0)
  }
}
Man is still the most extraordinary computer of all. JF Kennedy

Had je de laatste verandering nog geprobeerd?
Anders wordt het testen met een led wat wel en niet werkt in de interrupt...

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com