Helpful ReplyHot!DH11 with PIC18F4550

Page: < 123 > Showing page 2 of 3
Author
eagle1
Super Member
  • Total Posts : 341
  • Reward points : 0
  • Joined: 2014/11/02 03:04:06
  • Location: Saudi Arabia
  • Status: offline
Re: DH11 with PIC18F4550 2018/08/19 09:59:47 (permalink)
0
1and0
In your video, I don't see the variable i being declared in your function, so it must be a global variable. If so, what is its type?
 
Anyway, try unrolling the for() loop and see what timings you get. Also, is there any interrupt enabled?

Yes it's global "static int8_t i;"
There're no interrupts enabled.
 
I tried this morning again with the timers applying internal oscillators at 4MHz and 8MHz, testing a blinking LED there's a difference in the timing which means the speed is changed. But, the speed of the timer doesn't change.
 
I thought I could get a faster clock for the timer.
 
But eventually I measured the bits with Arduino uno board and developed the code for DH11 without parity errors, but couldn't do it with the PIC18F4550.
 

qɥb
 
Which AVR?
That would make it awkward to toggle an LED if you can't test the current value.

My Arduino uno Atmega328p, the code is AVR-GCC.
 
Yes, if I want to test the state of the pin in output, then I can't because it has dedicated peripheral for inputs:
For example, it has DDRB like TRISB in PIC, PORTB as LATB & PORTB and also it has PINB only for inputs.
#21
Mysil
Super Member
  • Total Posts : 3204
  • Reward points : 0
  • Joined: 2012/07/01 04:19:50
  • Location: Norway
  • Status: offline
Re: DH11 with PIC18F4550 2018/08/19 11:31:48 (permalink)
+1 (1)
Hi,
I think there may be some misunderstanding:
Quote: 'it has DDRB like TRISB in PIC, PORTB as LATB & PORTB and also it has PINB only for inputs.'
Then why can't you read PINB  register to verify the state of a pin that is configured as output?
 
Writing to the PINB register address, is also possible, but doing that have a different effect than
writing to PORTB register in a PIC microcontroller.
 
    Mysil
#22
1and0
Access is Denied
  • Total Posts : 8740
  • Reward points : 0
  • Joined: 2007/05/06 12:03:20
  • Location: Harry's Gray Matter
  • Status: offline
Re: DH11 with PIC18F4550 2018/08/19 12:21:27 (permalink)
0
eagle1
Yes it's global "static int8_t i;"

Having the letter i as a global variable for loop counter is a bad idea. The variable names i,j,k...n are generally used as integers for loop counters and they usually have local scope.
 

I tried this morning again with the timers applying internal oscillators at 4MHz and 8MHz, testing a blinking LED there's a difference in the timing which means the speed is changed. But, the speed of the timer doesn't change.

Little confused here. :(
 
 
post edited by 1and0 - 2018/08/19 12:22:32
#23
eagle1
Super Member
  • Total Posts : 341
  • Reward points : 0
  • Joined: 2014/11/02 03:04:06
  • Location: Saudi Arabia
  • Status: offline
Re: DH11 with PIC18F4550 2018/08/19 12:33:39 (permalink)
0
1and0
Having the letter i as a global variable for loop counter is a bad idea. The variable names i,j,k...n are generally used as integers for loop counters and they usually have local scope.

OK, got that ;)
 
Little confused here. :(

 I mean I was hoping to get faster timer input clock so I get better resolution.
 
The Arduino is running at 16MHz so the instruction cycle is 62.5ns, with prescaler 1:8 so timer input is 500ns. I just have to multiply every timer result with x2 and get 1us resolution.
 
I had no problems reading the DH11 bits timings with this speed :)
 
#24
eagle1
Super Member
  • Total Posts : 341
  • Reward points : 0
  • Joined: 2014/11/02 03:04:06
  • Location: Saudi Arabia
  • Status: offline
Re: DH11 with PIC18F4550 2018/08/19 12:33:39 (permalink)
0
1and0
Having the letter i as a global variable for loop counter is a bad idea. The variable names i,j,k...n are generally used as integers for loop counters and they usually have local scope.

OK, got that ;)
 
Little confused here. :(

 I mean I was hoping to get faster timer input clock so I get better resolution.
 
The Arduino is running at 16MHz so the instruction cycle is 62.5ns, with prescaler 1:8 so timer input is 500ns. I just have to multiply every timer result with x2 and get 1us resolution.
 
I had no problems reading the DH11 bits timings with this speed :)
 
#25
eagle1
Super Member
  • Total Posts : 341
  • Reward points : 0
  • Joined: 2014/11/02 03:04:06
  • Location: Saudi Arabia
  • Status: offline
Re: DH11 with PIC18F4550 2018/08/19 12:39:27 (permalink)
0
Mysil
Then why can't you read PINB  register to verify the state of a pin that is configured as output?

I can't! it didn't work for me. I have to configure the pin as input to read PINB because this SFR is dedicated for inputs apparently. 
 
Writing to the PINB register address, is also possible, but doing that have a different effect than
writing to PORTB register in a PIC microcontroller.

Of course, I actually took PINB out of the matching of AVR with PIC, my intention is:
TRISB in PIC like DDRB in AVR
PORTB/LATB in PIC like PORT in AVR
 
But PIC doesn't have dedicated SFR for only inputs like AVR. Of course I don't know about the general architecture aspects for AVR and PIC, it's just my simple experience with PIC18F4550 and the Atmega328p.
#26
1and0
Access is Denied
  • Total Posts : 8740
  • Reward points : 0
  • Joined: 2007/05/06 12:03:20
  • Location: Harry's Gray Matter
  • Status: offline
Re: DH11 with PIC18F4550 2018/08/19 12:52:00 (permalink)
+1 (1)
eagle1
I can't! it didn't work for me. I have to configure the pin as input to read PINB because this SFR is dedicated for inputs apparently. 
...
the Atmega328p.

According to the "Reading the Pin Value" section of the Atmega328p datasheet, it states "Independent of the setting of Data Direction bit DDxn, the port pin can be read through the PINxn Register bit."  So I agree with Mysil.
#27
1and0
Access is Denied
  • Total Posts : 8740
  • Reward points : 0
  • Joined: 2007/05/06 12:03:20
  • Location: Harry's Gray Matter
  • Status: offline
Re: DH11 with PIC18F4550 2018/08/19 12:59:51 (permalink) ☄ Helpfulby eagle1 2018/08/19 20:55:24
+2 (2)
eagle1
I mean I was hoping to get faster timer input clock so I get better resolution.

Something weird is going on. Have you tried unrolling the for() loop as I've suggested, i.e. 
// ...
TMR2 = 0;
while(PORTDbits.RD1); // sensor response 80us high
TMR2_val[2] = TMR2;
 
while(!PORTDbits.RD1);
TMR2 = 0;
while(PORTDbits.RD1); // 1st bit
TMR2_val[3] = TMR2;
 
while(!PORTDbits.RD1);
TMR2 = 0;
while(PORTDbits.RD1); // 2nd bit
TMR2_val[4] = TMR2;
 
for (i=5;i<43;i++)
{
// ...

#28
eagle1
Super Member
  • Total Posts : 341
  • Reward points : 0
  • Joined: 2014/11/02 03:04:06
  • Location: Saudi Arabia
  • Status: offline
Re: DH11 with PIC18F4550 2018/08/19 20:15:33 (permalink)
0
I wanted to switch my work to my PIC18F46k22 but I'm having problem starting the I2C!
 
The code is working fine with the PIC184550, maybe there's something new in the PIC18F46k22 I didn't configure it in my code.
 
I did the necessary configurations for the I2C, but I don't know what could be the problem. Here's my code:
 

 
#define DISABLE_INT (INTCON=0x00,INTCON2=0x00,INTCON3=0x00)          // disable all interrupts
 
#define AN_DISABLE   (ADCON0=0x00,ADCON1=0x0f,ANSELB=0x00)           // disable ADC settings
 
#define CMP_DISABLE  (CM1CON0=0x00,CM2CON0=0x00,CM2CON1=0x00)  // disable comparators settings
 
//================================================//
 
// The main code:
 
void main(void) {
INTOSC_8MHz;
AN_DISABLE;
DISABLE_INT;
CMP_DISABLE;
i2c_init();
i2c_start();
LCD_Init();
DH11_init();

while(1){
for (i=0;i<5;i++)
blink1();                      // I put this blink as indicator for successful I2C start
 
}
 
//================================================//
 
// The I2C code:
 
void i2c_init(void)
{
    WPUB = 0x00;
    TRISB = 0x06; //Configuring SDA and SCL as input pins
    SSP2CON1 = 0x28; //Configuring as I2C Master mode
    SSP2CON2 = 0x00;
    SSP2ADD = 0x27; //Setting SCL frequency with value in clock_freq
    SSP2STAT = 0x00; //Resetting SSP2STAT register
    PIR3bits.SSP2IF=0; //Resetting MSSP interrupt flag
}

void ck_clr_SSPIF(void) {while(!PIR3bits.SSP2IF);PIR3bits.SSP2IF=0;}
void i2c_idle(void){while ((SSP2CON2 & 0x1F) || (SSP2STAT & 0x04));}
void i2c_start(void){SSP2CON2bits.SEN2=1;ck_clr_SSPIF();}

post edited by eagle1 - 2018/08/19 20:18:40
#29
qɥb
Monolothic Member
  • Total Posts : 3332
  • Reward points : 0
  • Joined: 2017/09/09 05:07:30
  • Location: Jupiter
  • Status: offline
Re: DH11 with PIC18F4550 2018/08/19 20:41:33 (permalink) ☄ Helpfulby eagle1 2018/08/20 10:02:32
+2 (2)
In that PIC, SDA2 and SCL2 are shared with analog functions, so you must write to ANSELB to switch the pins to digital mode.
 

This forum is mis-configured so it only works correctly if you access it via https protocol.
The Microchip website links to it using http protocol. Will they ever catch on?
PicForum "it just works"
#30
eagle1
Super Member
  • Total Posts : 341
  • Reward points : 0
  • Joined: 2014/11/02 03:04:06
  • Location: Saudi Arabia
  • Status: offline
Re: DH11 with PIC18F4550 2018/08/19 20:57:14 (permalink)
0
1and0
Something weird is going on. Have you tried unrolling the for() loop as I've suggested, i.e. 

You're right I unrolled the first two bits and I got 25us time!
 
OK, so the for loop is a problem now!
#31
eagle1
Super Member
  • Total Posts : 341
  • Reward points : 0
  • Joined: 2014/11/02 03:04:06
  • Location: Saudi Arabia
  • Status: offline
Re: DH11 with PIC18F4550 2018/08/19 20:58:30 (permalink)
0
qɥb
In that PIC, SDA2 and SCL2 are shared with analog functions, so you must write to ANSELB to switch the pins to digital mode.

Yes, I did in the 2nd definition, I cleared the ANSELB.
#32
qɥb
Monolothic Member
  • Total Posts : 3332
  • Reward points : 0
  • Joined: 2017/09/09 05:07:30
  • Location: Jupiter
  • Status: offline
Re: DH11 with PIC18F4550 2018/08/19 21:09:42 (permalink)
+1 (1)
Ahh, hidden up in your macro definitions.
I can never see the sense in hiding crucial details. It's just more work for someone trying to make sense of your code to jump around finding what a one-off macro does.

This forum is mis-configured so it only works correctly if you access it via https protocol.
The Microchip website links to it using http protocol. Will they ever catch on?
PicForum "it just works"
#33
1and0
Access is Denied
  • Total Posts : 8740
  • Reward points : 0
  • Joined: 2007/05/06 12:03:20
  • Location: Harry's Gray Matter
  • Status: offline
Re: DH11 with PIC18F4550 2018/08/20 02:36:03 (permalink) ☄ Helpfulby eagle1 2018/08/20 08:25:15
+1 (1)
eagle1
 
You're right I unrolled the first two bits and I got 25us time!
 
OK, so the for loop is a problem now!

Post the diassembly listing of your for() loop
for (i=3;i<43;i++)
{
    while(!PORTDbits.RD1); // wait for 0 leading bit
    TMR2 = 0;
    while(PORTDbits.RD1); // high bit 0 or 1
    TMR2_val[i] = TMR2;
}

I just don't see how storing TMR2 into the array TMR2_val[] can take ~35 us or cycles that you have observed. If it's really that bad, you'll have to read TMR2 first (or compensate the difference) and then store it; and maybe even use pointer instead.
#34
1and0
Access is Denied
  • Total Posts : 8740
  • Reward points : 0
  • Joined: 2007/05/06 12:03:20
  • Location: Harry's Gray Matter
  • Status: offline
Re: DH11 with PIC18F4550 2018/08/20 08:26:05 (permalink) ☄ Helpfulby eagle1 2018/08/20 08:34:13
+1 (1)
A quick fix is to turn off Timer2 after RD1 goes low. But I'd still like to see how "TMR2_val=TMR2" can be so bad that it takes ~35 cycles to execute.
#35
eagle1
Super Member
  • Total Posts : 341
  • Reward points : 0
  • Joined: 2014/11/02 03:04:06
  • Location: Saudi Arabia
  • Status: offline
Re: DH11 with PIC18F4550 2018/08/20 08:29:40 (permalink)
0
1and0
eagle1
 
You're right I unrolled the first two bits and I got 25us time!
 
OK, so the for loop is a problem now!

Post the diassembly listing of your for() loop
for (i=3;i<43;i++)

    while(!PORTDbits.RD1); // wait for 0 leading bit
    TMR2 = 0;
    while(PORTDbits.RD1); // high bit 0 or 1 
    TMR2_val[i] = TMR2; 
}

I just don't see how storing TMR2 into the array TMR2_val[] can take ~35 us or cycles that you have observed. If it's really that bad, you'll have to read TMR2 first (or compensate the difference) and then store it; and maybe even use pointer instead.


LOL maybe what I did isn't very smart, I unrolled all the 43 bits. And it broke just after the first bit :)


uint8_t DH11_read(uint8_t *TMR2_val)
{
  int8_t i;
  TRISDbits.RD1=0;
  LATDbits.LATD1=0;
  __delay_ms(18); // user 18ms low
  LATDbits.LATD1=1;
  TRISDbits.RD1=1;
   
  TMR1 = 0;
  while(PORTDbits.RD1);// leading HIGH pulse
  TMR2_val[0] = TMR1;
  TMR1 = 0;
  while(!PORTDbits.RD1);// sensor response 80us low
  TMR2_val[1] = TMR1;
  TMR1 = 0;
  while(PORTDbits.RD1);// sensor response 80us high
  TMR2_val[2] = TMR1;
  
  while(!PORTDbits.RD1);
  TMR1 = 0;blink2();
  while(PORTDbits.RD1);// 0
  TMR2_val[3] = TMR1;blink2(); // <<------------ here
  while(!PORTDbits.RD1);
  TMR1 = 0;blink2();
  while(PORTDbits.RD1);// 1
  TMR2_val[4] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 2
  TMR2_val[5] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 3
  TMR2_val[6] = TMR1;
... upto 43
}

#36
eagle1
Super Member
  • Total Posts : 341
  • Reward points : 0
  • Joined: 2014/11/02 03:04:06
  • Location: Saudi Arabia
  • Status: offline
Re: DH11 with PIC18F4550 2018/08/20 08:36:23 (permalink)
0
1and0
 
and maybe even use pointer instead.

You're absolutely brilliant! The pointer fixed the issue. Now I have more experience of how important pointers are.
 
uint8_t DH11_read(uint8_t *TMR2_val)
{
  int8_t i;
  TRISDbits.RD1=0;
  LATDbits.LATD1=0;
  __delay_ms(18); // user 18ms low
  LATDbits.LATD1=1;
  TRISDbits.RD1=1;
  
   
  TMR1 = 0;
  while(PORTDbits.RD1);// leading HIGH pulse
  *TMR2_val++ = TMR1;
  TMR1 = 0;
  while(!PORTDbits.RD1);// sensor response 80us low
  *TMR2_val++ = TMR1;
  TMR1 = 0;
  while(PORTDbits.RD1);// sensor response 80us high
  *TMR2_val = TMR1;
  
  for (i=3;i<43;i++)
    {
        while(!PORTDbits.RD1); // wait for 0 leading bit
        TMR1 = 0;
        while(PORTDbits.RD1); // high bit 0 or 1
        *TMR2_val++ = TMR1;
    }

#37
1and0
Access is Denied
  • Total Posts : 8740
  • Reward points : 0
  • Joined: 2007/05/06 12:03:20
  • Location: Harry's Gray Matter
  • Status: offline
Re: DH11 with PIC18F4550 2018/08/20 08:41:11 (permalink)
0
eagle1
 
LOL maybe what I did isn't very smart, I unrolled all the 43 bits. And it broke just after the first bit :)


// ...
  while(!PORTDbits.RD1);
  TMR1 = 0;blink2();
  while(PORTDbits.RD1);// 0
  TMR2_val[3] = TMR1;blink2(); // <<------------ here
  while(!PORTDbits.RD1);
  TMR1 = 0;blink2();
// ...


I'm not surprised!!! How long does it take blink2() to execute??? :(((
#38
1and0
Access is Denied
  • Total Posts : 8740
  • Reward points : 0
  • Joined: 2007/05/06 12:03:20
  • Location: Harry's Gray Matter
  • Status: offline
Re: DH11 with PIC18F4550 2018/08/20 08:44:49 (permalink)
0
eagle1
 
You're absolutely brilliant! The pointer fixed the issue. Now I have more experience of how important pointers are.

Great!
 
Could you please post the disassembly listing I asked for in Post #34?
 
#39
eagle1
Super Member
  • Total Posts : 341
  • Reward points : 0
  • Joined: 2014/11/02 03:04:06
  • Location: Saudi Arabia
  • Status: offline
Re: DH11 with PIC18F4550 2018/08/20 09:58:06 (permalink)
0
You mean this one:
uint8_t DH11_read(uint8_t *TMR2_val)
{
  int8_t i;
  TRISDbits.RD1=0;
  LATDbits.LATD1=0;
  __delay_ms(18); // user 18ms low
  LATDbits.LATD1=1;
  TRISDbits.RD1=1;
   
  TMR1 = 0;
  while(PORTDbits.RD1);// leading HIGH pulse
  TMR2_val[0] = TMR1;
  TMR1 = 0;
  while(!PORTDbits.RD1);// sensor response 80us low
  TMR2_val[1] = TMR1;
  TMR1 = 0;
  while(PORTDbits.RD1);// sensor response 80us high
  TMR2_val[2] = TMR1;
  
  while(!PORTDbits.RD1);
  TMR1 = 0;blink2();
  while(PORTDbits.RD1);// 0
  TMR2_val[3] = TMR1;blink2(); // <<------------ here
  while(!PORTDbits.RD1);
  TMR1 = 0;blink2();
  while(PORTDbits.RD1);// 1
  TMR2_val[4] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 2
  TMR2_val[5] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 3
  TMR2_val[6] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 4
  TMR2_val[7] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 5
  TMR2_val[8] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 6
  TMR2_val[9] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 7
  TMR2_val[10] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 8
  TMR2_val[11] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 9
  TMR2_val[12] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 10
  TMR2_val[13] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 11
  TMR2_val[14] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 12
  TMR2_val[15] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 13
  TMR2_val[16] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 14
  TMR2_val[17] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 15
  TMR2_val[18] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 16
  TMR2_val[19] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 17
  TMR2_val[20] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 18
  TMR2_val[21] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 19
  TMR2_val[22] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 20
  TMR2_val[23] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 21
  TMR2_val[24] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 22
  TMR2_val[25] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 23
  TMR2_val[26] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 24
  TMR2_val[27] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 25
  TMR2_val[28] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 26
  TMR2_val[29] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 27
  TMR2_val[30] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 28
  TMR2_val[31] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 29
  TMR2_val[32] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 30
  TMR2_val[33] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 31
  TMR2_val[34] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 32
  TMR2_val[35] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 33
  TMR2_val[36] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 34
  TMR2_val[37] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 35
  TMR2_val[38] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 36
  TMR2_val[39] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 37
  TMR2_val[40] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 38
  TMR2_val[41] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 39
  TMR2_val[42] = TMR1;
  while(!PORTDbits.RD1);
  TMR1 = 0;
  while(PORTDbits.RD1);// 40
  TMR2_val[43] = TMR1;
}

post edited by eagle1 - 2018/08/20 10:02:05
#40
Page: < 123 > Showing page 2 of 3
Jump to:
© 2019 APG vNext Commercial Version 4.5