Maakt niet veel uit, de Saleae ziet er wat mooier uit...
Dit topic is gesloten
Special Member
Maakt niet veel uit, de Saleae ziet er wat mooier uit...
Golden Member
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...
Special Member
Je kunt toch gewoon een signaal 'opnemen' en het later bekijken? (ontleden kan het programma het niet omdat het een onbekend iets is)
Golden Member
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...
Special Member
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...
Golden Member
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...
Golden Member
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 ....
Special Member
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 donderdag 12 november 2020 21:31:59 (39%)
Golden Member
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 donderdag 12 november 2020 21:44:12 (16%)
Special Member
De 'lange' pulsen lijken me veel langer als de verwachte 1125 uS... (eerder iets van 1700uS zo te zien)
Golden Member
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 donderdag 12 november 2020 21:57:44 (36%)
Special Member
Ik dacht dat dat 1125uS moest zijn. Bij 1687 moet de MAXLO een stuk omhoog (tot 18 of 19)
Golden Member
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..)
Special Member
MAXLO al geprobeerd met hogere waarde? (met 14 gaat het zeker niet werken)
Golden Member
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)..
Special Member
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
Golden Member
Nee, hij komt nog steeds niet in een geldige puls.
(IRCode wordt dus nooit gevuld).
Special Member
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
Golden Member
Nou, ik heb nog lang lopen puzzelen... Er zit gewoon iets raars in het het programma.
Bedtijd nu..Morgen weer verder.
Special Member
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
Golden Member
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.
Golden Member
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)
}
}
Special Member
Had je de laatste verandering nog geprobeerd?
Anders wordt het testen met een led wat wel en niet werkt in de interrupt...
Dit topic is gesloten