Jump to content

drumanart

EstablishedMember
  • Content Count

    48
  • Joined

  • Last visited

Everything posted by drumanart

  1. Thanks a lot. Yesterday night a changed my code and I use now the ISR void intererupt(void) to reset the tmr0io timer overflow flag. The code works now much better then my first version. But still, as I use only the TMR0 to handle both servos my code is a little dirty. (I wrote it before I red your reply). I understood the ISR related hardware interrupt. Now if you mention to write the PWM with a counter (TimerOn/TimerOff) where does the ISR get the interrupt flag from. Thanks Martin My code is now: #pragma CLOCK_FREQ 4000000 // CLK 4Mhz. #define PW_0 latb.0 // PW 0 ON/OFF (violet). #define PW_1 latb.1 // PW 0 ON/OFF (yellow). void interrupt(void){ tmr0if = 0x00; // clear INTCON overflow bit tonoff = ~tonoff; // TimerOn/TimerOff. } // // void main(void) { osccon = 01100000b; // OSCCON int Osc, 4 Mhz. while (!iofs); // DEBUG without iofs OSCCON stable bit. init(); // Port settings etc. char header = 0x00; // 1st.header 0xFF, 2nd channel fro ROBOREALM. char data, ch = 0; short pw_data = 128; // Servo middle position. while(1){ _asm clrwdt; // the watchdog. if (rcif) { header = rcreg; // 1st reads header. } if (header == 0xFF){ pw_data = RX_DATA(); header = 0x00; // clear register. } data = pw_data; ch = pw_data>>8; if (tonoff && help){ t0con = 11000010b; // precaler 1/8, 8bit enable. tmr0l = data/2; // range 0 to 127. 2ms = 0x7F(min), 1ms = 0x00 (max); 0x40 middle. help = false; switch (ch){ case 0: PW_0 = 1; // out Hi (SERVO horizontal). break; case 1: PW_1 = 1; // out Hi (SERVO horizontal). } } else { if ((!tonoff) && (!help)){ t0con = 11000110b; // precaler 1/128, 8bit enable. tmr0l = 0x70; // (DEBUG before 70) data for servo turn. PW_0 = 0; // out Lo (SERVO horizontal). PW_1 = 0; help = true; } } } } // //
  2. Thanks for the helpfull tips. I' ll do what you recommend this weekend and I let you know of the (hopefully) succseful results. Only one thing: you refer to numerically controlled Osc., that I use the TMR0 timer to toggle between the TimeON/TimeOff cycles as I do in my PWM function? And I understood that it is better to move my PWM function to the main function, right? In case if there is a timer overflow (hardware interrupt) and if I have a function called void interrupt(void) the program jumps automatically to that (ISR) routine without even declaring the function? Kind regards Martin
  3. Thanks for the fast reply. The PIC is a 18F4420 and the servos are FUTABA 3003. I use the PORTB to toggle RB0 and RB1 to generate the duty cycle and the corresponding value to be applied to the servo motor. To adjust the servos I send a simple 3 byte protocol from the PC to the PIC's USART: 1st: 0xFF (header) 2nd: channel (to juice the servo) 2rd :data So the main function tests the rcif flag and when a 255 is received the RX_DATA function gets the other two bytes, the address and data byte. For test reasons I send the data back to the PC: serial_printf(header) and serial_printf(pw_data). Then the program calls the PWM function: // MAIN void main(void) { osccon = 01100000b; // OSCCON int Osc, 4 Mhz. while (!iofs); // DEBUG without iofs OSCCON stable bit. init(); // Port settings etc. . char header = 0x00, aux; // 1st.header 0xFF, 2nd channel from ROBOREALM short pw_data = 128; // Servo middle position. while(1){ _asm clrwdt; // the watchdog. if (rcif) { // 1st reads header. header = rcreg; serial_printf(header); } if (header == 0xFF){ pw_data = RX_DATA(); // get the second and third byte from rxreg. serial_printf(pw_data); } if (!cren){ // avoids conflicts PWM(pw_data); // call the PWM function } header = 0x00; // clear register. } } // // // PWM function #define PW_0 latb.0 // PW 0 ON/OFF (violet). #define PW_1 latb.1 // PW 1 ON/OFF (yellow). char flag = 0x00, aux = 0x00; void PWM(short data_ch){ char data = data_ch; char ch = data_ch>>8; // evaluates the channel number. if test_bit (!flag,0){ // toggle between duty cyycle and data cycle. switch (ch){ case 0: PW_0 = 1; // out Hi (SERVO horizontal). break; case 1: PW_1 = 1; } tmr0l = data/2; // range 0 to 127. 2ms = 0x7F(min), 1ms = 0x00 (max); 0x40 middle. t0con = 11000010b; // precaler 1/8, 8bit enable. tmr0if = 0x00; // clear INTCON overflow bit. while (!tmr0if); set_bit (flag,0); // switch between duty and PWM time. PW_0 = 0; // out Lo (SERVO horizontal). PW_1 = 0; tmr0l = 0x70; // duty cycle. t0con = 11000110b; // precaler 1/128, 8bit enable. tmr0if = 0x00; // clear INTCON overflow bit. } if (tmr0if){ clear_bit (flag,0); // switch between duty and PWM time. tmr0if = 0x00; // clear TMR0 overflow bit. } } // // So as you see there is still not a ISR routine involved. Do I have to call the ISR routine inside the PWM function, so if a header byte (0xFF) is received that the program picks up the other two bytes? Thanks Martin
  4. Hello. I have 2 servo motors (standard 50Hz, 1000us to 2000us) attached to PORTB, RB0 to RB1 and I use the USART of the PIC to receive data from a PC using a IC FT232 level shifter. My problem is the interrupt handling. I create the duty cycle and the value for the servos with TIMER0 and all works nice as long as I only send one byte from the PC to the PIC and then wait until the servo got to the desired angle. As soon as I try to handle the servos with a continuous data stream (from a slider) I get conflicts with the RX module and the PWM generated on PORTB. Do I have to use novo RTOS to have the ability to create TASKs or is there another way? I use MPLAB and a licensed SouceBoost V6.95. Thanks for help Martin
  5. Hello. In my heades file I decleare a variable: //Header test.h: #define TEST #ifndef TEST volatile bit spi_cs @ PORTC . 2; bit spi_cs_tris @ TRISC . 2; #endif // TEST // // Than on the main program I try to use the variable: main test.c spi_cs_tris = 0; // Portc,2 as output. spi_cs = 1; // Portc, 2 Hi. For some reason the variable "spi_cs" gives an error (variable not found) in compiling the main code. What is wrong? Thanks Martin
  6. Hello. I use SourceBoost with MPLAB IDE. For some reason the configuration word declared in the code want have the desired effect. The command WDTPS_4_2H should set the prescaler for the watchdog timer to 1:4 but for some reason it keeps staying on 1::3200 (the max value possible). What is my failure? #include <system.h> #include <icd2.h> #ifdef _PIC18 #pragma DATA _CONFIG1H, _OSC_INTIO67_1H // IntOSC, Port RA6,RA7 I/O. #pragma DATA _CONFIG2H, _WDT_ON_2H, _WDTPS_4_2H // WDTON, prescaler 1/4. #pragma DATA _CONFIG3H, _MCLRE_OFF_3H #endif _PIC18 #pragma CLOCK_FREQ 4000000 // CLK 4Mhz.
  7. Isn't there an option to tell PIKLAB where to lock for the SourcBoost files. PIKLAB locks in the .wine/drive_c/windows/system32 folder for the compiler files. SourceBoost has it's own folder in .wine/drive_c/Program Files/SourceBoost. I even managed that a licenced SourceBoost version runs with MPLAB IDE on the same computer. In copying all include files etc. to the system32 folder of windows is quite unusual, or not? Thanks Martin
  8. Thanks, I copied the pp.exe to the files where the compiler exe is. Now the compiler can't find the include system.h The error I get: 16F690_Relais_SW.c http://www.sourceboost.com Copyright© 2004-2009 Pavel Baranov Z:\home\drumanart\PIKLAB\M_PROJECTS\16F690_Relais_SW.c(14): Unable to open include file: system.h 1 errors detected Error: preprocessing error failure *** Exited with status: 1 *** Thanks for your help Martin
  9. I have a registered SourceBoost version running under PIKLAB. For some reason the compiler can't start the preprocessor. I suppose it has something to do with the settings of the Path. (Toochain) The Compile Log shows: wine boostc.pic16.exe -t PIC16F690 -i -I/home/drumanart/PIKLAB/M_PROJECTS/ 16F690_Relais_SW.c BoostC Optimizing C Compiler Version 6.95 (for PIC16 architecture) Licensed to Martin Hug under Single user Full License for 1 node(s) Limitations: PIC12,PIC16 max code size:Unlimited, max RAM banks:Unlimited, Non commercial use only 16F690_Relais_SW.c http://www.sourceboost.com Copyright© 2004-2009 Pavel Baranov Copyright© 2004-2009 David Hobday Warning: can't start preprocessor 16F690_Relais_SW.c:14: error: failure failure *** Exited with status: 1 *** Hopefully somebody has an idea. Thanks Martin
  10. Thanks a lot for your help and the useful link. I'll try the old fashioned way. Marrtin
  11. Hello, I'm trying to use a PWM output (CCP1, RC2, Pin 17) from a 18F4420 to connect a servor motor (Futaba S3003). The servo works with 20ms (50Hz). The Pic runs wit an external OSC of 4Mhz. Using the formula: PWM Period = [(PR2) + 1] * 4 * TOSC * (TMR2 Prescale Value) This is: [(78) + 1] * 4 * 4.10-6 * (16) = 20ms = 50Hz. PR2 in my case is 78. The configuration: RC2 as output void PWM() { t2con = 00000111b; // Timer2 =On, Prescaler 1/16. ccp1con=00001100b; // PWM mode pr2 = 78; // duty periode (50Hz = 78). ccpr1l = 0x1F; } But if I connect an oscilloscope I get 800Hz (1,25ms) What is wrong? Thanks for help Martin
  12. Hello folks. The expression "while ((!tmr0if) || (rcif == 0));" never is true, why? The idea is that, if no data is received from USART the timer overflow flag TMR0IF is set (INTCON,2) and the program continuous. The extraxt of the code is: volatile bit tmr0if@INTCON.2; // Timer0 overflow. volatile bit tmr0on@T0CON.7; // Timer0 enable bit. t0con = 00010011b; // disable timer, 16 bit, Prescaler 1/16. tmr0on = 1; // enable (starts) timer0. while ((!tmr0if) || (rcif == 0)); // for 8Mhz the delay is aprox. 0.5s. set_bit (portc,3); // LED on. tmr0on = 0; // (stops) timer0.
  13. Martin, Shouldn't while (Go_Done == 0); be [/code] or while (Go_Done != 0); For 20MHz Oscillator try using a Tad of 16Tosc and Tacq of 4Tad This gives an automatic 3.2uS aquisition time and 9.6uS conversion time Regards davidb Uff, yes that was wrong, now it works. I use Source Boost with MPLAB IDE and if I'd like to send the data using the rs232_driver.h function. I get a lot of errors when I try to #include <rs232_driver.h.> . I use a 18F4420 Is this a path problem? Thanks Martin
  14. Hello everybody. Can anybody tell me why the program works only if I configure the ADCON2 to Fosc/2. I use a 20Mhz external OSC. So I need (reading the datasheet of the PIC) at least 12 TAD to make the conversion correct. If I change the bits ADCS2-ADCS0 (ADCON2 registor) to something else then Fosc/2 the progrma stops working at all. Thanks for help. Martin void main(void) { init_TX_RX(); volatile bit Go_Done@ADCON0.1; // Note the 18fxx chip puts this in bit 1, for 16Fxx to 2; volatile unsigned char ad_h@ADRESH; volatile unsigned char ad_l@ADRESL; short result; char result_h; char result_l; unsigned long tp; unsigned tp1; unsigned i; rcif = 0; trisa = 00000001b; // RA0 in. trise = 00000111b; // RE0 - RE2, analogue in. trisb = 10100000b; // RB5 Taster in. RB0-RB4 LED's. RB7 PRG_DATA in. trisc = 11000000b; // ??? all out exept RC7 RX; RC0, RC1, RC2 Tr. trisd = 0x00; // 7_digit LED bus. rcreg = 0X00; portc = 0x00; // all LED's OFF. set_bit (portc,4); // PW_LED blue; adcon1 = 00001110b; // RA0 analog, rest digital I/O. adcon2 = 10101000b; // Result is right justified, conversion Ckl TAD 12, // ascquisition t=Fosc/2. while(1) { adcon0 = 00000001b; // A/D turn ON. Go_Done = 1; while (Go_Done == 0); result_h = ad_h; result_l = ad_l; if (result_l >= 07) { while(!trmt); txreg = result_l; while(!trmt); txreg = result_h; set_bit (portc,0); // white_LED on. delay_1(); } else clear_bit (portc,0); // white_LED off. } }
  15. Hello Reynard. Finally I found the bug. Using a scope I have seen that the clock speed was far to high, nearly 10Mhz. I could adjust the osc. with the “osctune” register and finally the display shows the right numbers. You brought me on the right way to find this strange bug. I never thought that setting the clock to 8 MHz with “osccon” could be so far away. Thanks a lot for the help Martin
  16. Thanks for the advice. Is there a possibility to prove, whether the clock is OK?. As far as I see the above code should set the baude rate to 9600 at 8Mhz clock. The same program works fine with a 16F877 but with the 16F690 not. ANSEL and ANSELH are cleared. The baudrate is set: void init_TX_RX() { baudctl = 00000000b; // BRG16 = Lo (8-bit). rcsta = 10000000b; // set SPEN bit,serial port enabled & CREN desactivated. (Activated in read routine). txsta = 00100100b; // TXEN enabled, BRGH = Hi-speed, TX9 8-bit, Async mode. spbrg = 51; // 9600 baud. } Where is the BUG. regards Martin
  17. Thanks for the idear. Sending data from the 16F690 to the hyperterminal shows wrong results. So, there is a configuration problem in my code, but I just can't find the failor. As I mentioned before hand, I can not set the osc. clock with the #pragma CLOCK_FREQ 8000000 command. Interesting is that sending data every 500ms with: while(!trmt); txreg = data; // starts transmition. set_bit (portc,1); // geen_LED on. delay_ms(500); // just wait for ¼ of a secon. sends the data with much faster speed. Do I miss a library file? Martin
  18. Thks for the idear. If I send data from the 16F690 to the hyperterminal I get wrong results. There is a problem with the clock settings, but I can't find the failor. Martin I would suggest connecting the hyperterminal to PIC16F690 to verify if it gets the right value & sends the right value. Regards Raghunathan
  19. Since a couple of days I'm trying to send data from a 18F442 to a 16F690. The result displayed on the 7_segment displays is always the double as it should be. If I send the number 5 I get number 10 and so on. I use source boost with Microchip IDE. Strange is, that the command: "#pragma CLOCK_FREQ 8000000" doesn't make any effect, even if I set "Configuration Bits set in code". I have to select the clock always with OSCCON (osccon = 01110111b;) to get the desired 8 Mhz clock. If I send the data from the 18F442 to a Hyper Terminal the result is correct and if I use the program with a 16F877A the program works fine. For help I would be very pleased. Martin #include <system.h> #ifdef _PIC16F690 #pragma DATA 0x2007, _INTRC_OSC_CLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF #endif #pragma CLOCK_FREQ 8000000 //this sets the clock to 4mhz for the PIC16F690 volatile bit gie@INTCON.GIE; // receive buffer registor. volatile bit peie@INTCON.PEIE; // receive buffer registor volatile bit Go_Done@ADCON0.2; // Note the the 16fxx chip puts this in bit 1. volatile bit trmt@TXSTA.TRMT; // transmit shift registor. volatile bit rcif@PIR1.RCIF; // receive buffer registor. volatile bit rcie@PIE1.RCIE; // receive buffer registor. volatile unsigned char ad_h@ADRESH; volatile unsigned char ad_l@ADRESL; unsigned int result; unsigned int TEST = 1; unsigned int Ch_No; unsigned int Ch_; unsigned RX_capture; char xmit = 0; void init_TX_RX() { baudctl = 00000000b; // BRG16 = Lo (8-bit). rcsta = 10000000b; // set SPEN bit,serial port enabled & CREN desactivated. txsta = 00100100b; // TXEN disabled, BRGH = Lo-speed, TX9 8-bit, Async mode. spbrg = 51; // 9600 baud. } unsigned long Bin_A_BCD(unsigned num_bin) { unsigned desp = 0; unsigned long rest,bcd = 0; while(num_bin != 0) { rest = num_bin % 10; rest <<= desp; desp += 4; bcd |= rest; num_bin /= 10; } return(bcd); } // const unsigned T7SEG[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x98}; // array of 10 numbers. unsigned BCD_A_7Seg(unsigned num_BCD) { if (num_BCD <= 9) return(T7SEG[num_BCD]); else return(0xFF); } // void delay_1(void) { unsigned long rtdo = 0; for (rtdo = 0;rtdo < 256; rtdo++); } /* void interrupt (void) { rcsta.4 = 1; if (rcif == 1) xmit = rcreg; // read data from receive buffer. } */ void main(void) { osccon = 01110111b; // set 8 MHz INTOSC. trisa = 00001000b; // RA3 VPP rest output. RA0 Q2, RA1 Q3, RA2 Q4, RA4 Q1, (RA4 is channel) trisb = 00100000b; // RB5 RX_in, RB7 TX_out. trisc = 00000000b; // 7_digit display bus.. ansel = 00000000b; anselh = 00000000b; wpub = 00000000b; // disable Pull-Up. gie = 1; rcie = 1; peie = 1; init_TX_RX(); unsigned long tp; unsigned tp1; unsigned i; char data=0x64; Ch_No = 0x04; rcsta.4 = 0; while (1) { rcsta.4 = 1; while (rcif == 0) // PIR1 { Ch_No = 0x00; } Ch_No = 0x02; xmit = rcreg; // read data from receive buffer. rcreg = 0; //rcsta.4 = 0; tp = Bin_A_BCD(xmit); // Convierte el número 128 decimal a BCD natural. tp1 = tp & 0xF; // Se extrae el dígito BCD de menor peso (8) para porta = 00000100b; // RA2, Q4 Hi. portc = BCD_A_7Seg(tp1); // Se escribe el número 8 en el puerto B delay_1(); // Retardo que permite la visualización tp1 = tp >> 4; // Se desplaza el contenido de la variable cuatro tp1 = tp1 & 0xF; porta = 00000010b; // RA1, Q3 Hi. portc = BCD_A_7Seg(tp1); delay_1(); tp1 = tp >> 8; // Se desplaza el contenido de la variable cuatro porta = 00000001b; // RA0, Q2 Hi. portc = BCD_A_7Seg(tp1); // Se escribe el número 1 en el puerto B delay_1(); Ch_ = Ch_No; tp = Bin_A_BCD(Ch_); // Convierte el número 128 decimal a BCD natural. tp1 = tp & 0xF; // Se extrae el dígito BCD de menor peso (8) para porta = 00010000b; // RA4, Q4 Hi. portc = BCD_A_7Seg(tp1); // Se escribe el número 8 en el puerto B delay_1(); // Retardo que permite la visualización. } }
  20. Since a couple of days I'm trying to send data from a 18F442 to a 16F690. The result displayed on the 7_segment displays is always the double as it should be. If I send the number 5 I get number 10 and so on. I use source boost with Microchip IDE. Strange is, that the command: "#pragma CLOCK_FREQ 8000000" doesn't make any effect, even if I set "Configuration Bits set in code". I have to select the clock always with OSCCON (osccon = 01110111b;) to get the desired 8 Mhz clock. If I send the data from the 18F442 to a Hyper Terminal the result is correct and if I use the program with a 16F877A the program works fine. For help I would be very pleased. Martin #include <system.h> #ifdef _PIC16F690 #pragma DATA 0x2007, _INTRC_OSC_CLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF #endif #pragma CLOCK_FREQ 8000000 //this sets the clock to 4mhz for the PIC16F690 volatile bit gie@INTCON.GIE; // receive buffer registor. volatile bit peie@INTCON.PEIE; // receive buffer registor volatile bit Go_Done@ADCON0.2; // Note the the 16fxx chip puts this in bit 1. volatile bit trmt@TXSTA.TRMT; // transmit shift registor. volatile bit rcif@PIR1.RCIF; // receive buffer registor. volatile bit rcie@PIE1.RCIE; // receive buffer registor. volatile unsigned char ad_h@ADRESH; volatile unsigned char ad_l@ADRESL; unsigned int result; unsigned int TEST = 1; unsigned int Ch_No; unsigned int Ch_; unsigned RX_capture; char xmit = 0; void init_TX_RX() { baudctl = 00000000b; // BRG16 = Lo (8-bit). rcsta = 10000000b; // set SPEN bit,serial port enabled & CREN desactivated. txsta = 00100100b; // TXEN disabled, BRGH = Lo-speed, TX9 8-bit, Async mode. spbrg = 51; // 9600 baud. } unsigned long Bin_A_BCD(unsigned num_bin) { unsigned desp = 0; unsigned long rest,bcd = 0; while(num_bin != 0) { rest = num_bin % 10; rest <<= desp; desp += 4; bcd |= rest; num_bin /= 10; } return(bcd); } // const unsigned T7SEG[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x98}; // array of 10 numbers. unsigned BCD_A_7Seg(unsigned num_BCD) { if (num_BCD <= 9) return(T7SEG[num_BCD]); else return(0xFF); } // void delay_1(void) { unsigned long rtdo = 0; for (rtdo = 0;rtdo < 256; rtdo++); } /* void interrupt (void) { rcsta.4 = 1; if (rcif == 1) xmit = rcreg; // read data from receive buffer. } */ void main(void) { osccon = 01110111b; // set 8 MHz INTOSC. trisa = 00001000b; // RA3 VPP rest output. RA0 Q2, RA1 Q3, RA2 Q4, RA4 Q1, (RA4 is channel) trisb = 00100000b; // RB5 RX_in, RB7 TX_out. trisc = 00000000b; // 7_digit display bus.. ansel = 00000000b; anselh = 00000000b; wpub = 00000000b; // disable Pull-Up. gie = 1; rcie = 1; peie = 1; init_TX_RX(); unsigned long tp; unsigned tp1; unsigned i; char data=0x64; Ch_No = 0x04; rcsta.4 = 0; while (1) { rcsta.4 = 1; while (rcif == 0) // PIR1 { Ch_No = 0x00; } Ch_No = 0x02; xmit = rcreg; // read data from receive buffer. rcreg = 0; //rcsta.4 = 0; tp = Bin_A_BCD(xmit); // Convierte el número 128 decimal a BCD natural. tp1 = tp & 0xF; // Se extrae el dígito BCD de menor peso (8) para porta = 00000100b; // RA2, Q4 Hi. portc = BCD_A_7Seg(tp1); // Se escribe el número 8 en el puerto B delay_1(); // Retardo que permite la visualización tp1 = tp >> 4; // Se desplaza el contenido de la variable cuatro tp1 = tp1 & 0xF; porta = 00000010b; // RA1, Q3 Hi. portc = BCD_A_7Seg(tp1); delay_1(); tp1 = tp >> 8; // Se desplaza el contenido de la variable cuatro porta = 00000001b; // RA0, Q2 Hi. portc = BCD_A_7Seg(tp1); // Se escribe el número 1 en el puerto B delay_1(); Ch_ = Ch_No; tp = Bin_A_BCD(Ch_); // Convierte el número 128 decimal a BCD natural. tp1 = tp & 0xF; // Se extrae el dígito BCD de menor peso (8) para porta = 00010000b; // RA4, Q4 Hi. portc = BCD_A_7Seg(tp1); // Se escribe el número 8 en el puerto B delay_1(); // Retardo que permite la visualización. } }
  21. After upgrading to MPLAB IDE 8.20 the BoostC integration want work anymore. I suppose there is somehow a problem with the path of the files. Compiling a beforehand working code I get the following message on the DEBUG window: Optimisation level: 1 Error: .obi or .lib file Incompatible version! (file uses V107, linker requires V109 to V110) Error: Failed to process:test.obj Error: .obj or .lib file Incompatible version! (file uses V107, linker requires V109 to V110) Error: Failed to process:libc.pic16.lib Also a Windows pop-up tells: failed to load x.COF file (where x is the file name). Unfortunately I lost my Licence-Key so I can’t just reinstall Source_Boost from scratch. Thks Martin
×
×
  • Create New...