Fórum témák

» Több friss téma
Fórum » PIC kezdőknek
 
Témaindító: Placi84, idő: Okt 3, 2005
Témakörök:
- A PIC ÖSSZES Vdd és Vss (AVdd és AVss) (tápfeszültség) lábát be kell kötni!
- A táplábak mellé a lehető legközelebb 100nF-os KERÁMIA kondenzátorokat kell elhelyezni.
- Az MCLR lábat, 10kohm-mal fel kell húzni a Vdd tápfeszültségre.
- Külső kvarc használatakor 4MHz-ig XT, a fölött pedig HS konfigurációt kell beállítani.
- Stabilizált tápegységet kell használni, a kapcsoló üzemű "telefon töltő" adapterek okozhatnak hibákat.
- Programozáshoz, használj lehetőleg PICKIT2 vagy 3 programozót. Kerülendő a JDM (soros porti) programozó.
- A PIC adatlapja (PDF), tartalmazza a lábak kiosztását és a PIC minden paraméterét. Az adatlap ingyen letölthető!
- Egyes PIC típusoknál az RA4 nyitott nyelőelektródás (Csak lefelé húz L szintre, H szintet nem ad ki!)
- Ha a PGM lábat digitális ki-/bemenetnek használod, az alacsony feszültségű programozási lehetőséget le kell tiltani.
Lapozás: OK   1179 / 1203
(#) Bakman válasza Broy hozzászólására (») Jún 22, 2022 /
 
Timer1, ha nem használod, elvileg nem szólhat bele. A T1CON regiszter értéke Reset után 0x00. Ha használod, akkor bit 7-6 ne legyen 0b10, valamint bit 3 ne legyen 0b1.

Az RA5 elvileg nem lehet analóg bemenet, így azt a bitet át sem lehet állítani. Már csak az RA5-re vonatkozó regiszter marad, ami Reset után egyébként is 0b1:

TRISAbits.TRISA5=1;

Ha nem valamilyen hipertitkor projekt, töltsd fel a kódot, több szem többet lát.
(#) Hp41C válasza Naresh Jain hozzászólására (») Jún 22, 2022 /
 
The corrected main.c

main.c
    
(#) Naresh Jain válasza Hp41C hozzászólására (») Jún 23, 2022 /
 
sir, I tried to make hex but not success,screen shot attached,please solve the issue ;
A hozzászólás módosítva: Jún 23, 2022
(#) Hp41C válasza Naresh Jain hozzászólására (») Jún 23, 2022 /
 
Hi,
Expression syntax error in remote_commans.h line 16:
What is missing from the declaration of typedef enum _IR_COMMAND?
.. Oh yes, the commas from CH100 and CH200 lines.
(#) Naresh Jain válasza Hp41C hozzászólására (») Jún 23, 2022 /
 
Ok, please upload the modified main.c
(#) Elektro.on válasza Broy hozzászólására (») Jún 23, 2022 /
 
Igazából illik tiltani mindent amit nem használsz.
Én a PIC -et MikroPaskalból használom, de csatolok egy linket ami magyarul szépen elmagyaráz sok mindent.

A rend kedvéért kiemelném hogy az alább linkelt ciket illetve sorozatot sok más egyéb itt megosztott anyaggal együtt Icserny fórumtársunk tollából származik.

PICula project
A hozzászólás módosítva: Jún 23, 2022
(#) Naresh Jain válasza Hp41C hozzászólására (») Jún 23, 2022 /
 
Yes sir, I inserted the comma's in remote commands now, I successfully compiled the codes and generated hex, but not test it yet on hardware,
THANK YOU HP41C SIR,
(#) Naresh Jain válasza Hp41C hozzászólására (») Jún 23, 2022 /
 
Dear friend, hardware testing is time taking and little hard job, please let me know can we attached two toggle swiches on vacant port (free port), switch1 is for on and switch2 is for off triac2 , if it is possible then i can test in proteus simulation software,
Again Thank you
A hozzászólás módosítva: Jún 23, 2022
(#) Broy válasza Elektro.on hozzászólására (») Jún 23, 2022 /
 
Köszi, ez jó link. Elvileg mindent törlök, de lehet, hogy valami kimaradt. PASCAL-on, BASIC-en gondolkodtam, de mivel ARM-ot C-ben programozok, gondoltam egyszerűbb lenne itt is a C (lehet, hogy nem).
(#) Broy válasza Bakman hozzászólására (») Jún 23, 2022 /
 
A ne legyen 0b10, az azt jelenti, hogy 0b01? Csak digitális bementeket, kimeneteket használnék.
Nem titkos, csatoltam, a nem fontos algoritmikus részeket kitöröltem, hogy ne legyen túl hosszú.
(#) Bakman válasza Broy hozzászólására (») Jún 24, 2022 /
 
  1. T1CONbits.T1OSCEN = 1;
helyett
  1. T1CONbits.T1OSCEN = 0;
A Timer 1 a belső oszcillátorról jár de a kódban engedélyezve van a saját oszcillátora, ez magasabb prioritású, mint a láb IO funkciója.
(#) Elektro.on válasza Broy hozzászólására (») Jún 24, 2022 /
 
A programnyelv kiválasztásában a legfőbb szempont az legyen, hogy te mit ismersz jobban.
C nyelven nagyságrendekkel több infó és példa program van mint bármi más nyelven.
A Pascalt én azért használom mert amúgy régen ezt ismertem meg PC oldalról aztán jött a delphi.

De ESP32 -őt már Arduinó környezetben C ben. (C,C++ vel mostanában ismerkedem.)
(#) Naresh Jain válasza Hp41C hozzászólására (») Jún 24, 2022 /
 
Dear friend, hardware testing is time taking and little hard job and remote in proteus is not functioning perfectly, please let me know if we attached two toggle swiches on free port as shown in attached screen shot,port RC0 SW1 is for ON and port RC2 SW2 is for OFF for triac2, then what ia modification in codes in main.c, if it is possible then i can test in proteus simulation software,
PLEASE MODIFY THE CODES:
  1. /********************************************************************************
  2. *                   Fan Controller                                              *
  3. *                                                                               *
  4. *   This program is free software: you can redistribute it and/or modify        *
  5. *   it under the terms of the GNU General Public License as published by        *
  6. *   the Free Software Foundation, either version 3 of the License, or           *
  7. *   (at your option) any later version.                                         *
  8. *                                                                               *
  9. *   This program is distributed in the hope that it will be useful,             *
  10. *   but WITHOUT ANY WARRANTY; without even the implied warranty of              *
  11. *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               *
  12. *   GNU General Public License for more details.                                *
  13. *                                                                               *
  14. *   You should have received a copy of the GNU General Public License           *
  15. *   along with this program.  If not, see <https://www.gnu.org/licenses/>.      *
  16. *                                                                               *
  17. *       Date            : Friday, 21 January 2011                               *
  18. *       Author          : C.V.Niras/VU3CNS                                      *
  19. *       Copyright       : (C) 2010 C. V. Niras                                  *
  20. *       Email           : cvniras@gmail.com                                     *
  21. *       Processor       : 12F675                                                *
  22. *       First Release   : 23/01/2011                                            *
  23. *       Ver             : 0.7                                                   *
  24. *   Change History:                                                             *
  25. *       Rev     Date        Description                                         *
  26. *       0.5     06/03/2011  First stable release                                *
  27. *       0.6     08/03/2011  Bug fixed - Can't swich on by CH+, when turned      *
  28. *                           off by set speed to 0                               *
  29. *       0.7     14/06/2011  Trigger off delayed for full speed (low firing      *
  30. *                           angle) to reach the TRIAC latch current             *
  31. *                                                                               *
  32. *********************************************************************************/
  33. #include <pic.h>
  34. #include "type_def.h"
  35. #include "remote_commands.h"
  36.  
  37. #if defined _12F675
  38. __CONFIG(WDTDIS & MCLRDIS & INTIO & BORDIS & UNPROTECT & PWRTEN);
  39.  
  40. #define IsIRDataBitHigh()   GPIO3 == 0  // Inverted logic
  41. #define SW_UP           _GPIO,0         // Up switch
  42. #define SW_DN           _GPIO,2         // Down switch
  43. #define LEDOn()         GPIO1 = 1       // LED
  44. #define LEDOff()        GPIO1 = 0
  45. #define TriacOn()       GPIO5 = 0       // Triac
  46. #define TriacOff()      GPIObits.GPIO5 = 1
  47. #define TRIAC           GPIO5           // Triac pin
  48. #endif  
  49.  
  50. #if defined _16F676
  51. __CONFIG(WDTDIS & MCLRDIS & INTOSCIO & BORDIS & UNPROTECT & PWRTEN);
  52.  
  53. #define GPIO PORTA
  54. #define TRISIO TRISA
  55. #define GPIF RAIF
  56. #define GPIE RAIE
  57.  
  58. #define IsIRDataBitHigh()   PORTAbits.RA3 == 0  // Inverted logic
  59. #define SW_UP           _PORTA,0         // Up switch
  60. #define SW_DN           _PORTA,2         // Down switch
  61. #define LEDOn()         PORTAbits.RA1 = 1       // LED
  62. #define LEDOff()        PORTAbits.RA1 = 0
  63. #define TriacOn()       PORTAbits.RA5 = 0       // Triac
  64. #define TriacOff()      PORTAbits.RA5 = 1
  65. #define TRIAC           PORTAbits.RA5           // Triac pin
  66.  
  67. // v Added to handle triac2
  68. #define Triac2On()      PORTCbits.RC5 = 0       // Triac2
  69. #define Triac2Off()     PORTCbits.RC5 = 1
  70. #define TRIAC2          PORTCbits.RC5          
  71. // ^ Added to handle triac2
  72.  
  73. #endif  
  74.  
  75.  
  76. __EEPROM_DATA(5, 1, 1, 255, 255, 255, 255, 255);
  77.  
  78. __IDLOC7('0','.','7','B');
  79.  
  80. #define TIMER_ENABLE                    // Enable timer
  81. // -- Chip Configurations --
  82. #define _XTAL_FREQ      4000000
  83. #define ZC_PIN_MASK     0x10            // Pin used for zero cross detection
  84. #define IR_PIN_MASK     0x08            // IR sensor output
  85. #define TIME_COUNT      6866            // Number of Timer1 overflows in an hour
  86. #define ANY_KEY         Key & 0x80
  87. #define UP_KEY          Key & 0x01
  88. #define DN_KEY          Key & 0x02
  89.  
  90. // Timer 1 is the time base, 1 bit time = 8us; the NEC physical bit time is 560us = 70 Timer 1
  91. // The following time are set with a +/- 20% tolerance
  92.  
  93. #define IR_MARK_MIN_TIME    787
  94. #define IR_SPACE_MIN_TIME   219
  95. #define MIN_IR_BIT_TIME     56
  96. #define MAX_IR_BIT_TIME     84
  97.  
  98. // -- End of Chip Configurations --
  99.  
  100. #define IRRx            Flag.b0         // New IR bit received
  101. #define IRNewHit        Flag.b1         // A new IR command received
  102. #define Error           Flag.b2         // General error flag
  103. #define IRCmdRepeat     Flag.b3         // A IR repeat command received
  104. #define StartFan        Flag.b4         // Indicate to start the fan
  105. #define EEPromWrite     Flag.b5         // Indicate to write to EEPROM
  106. #define UnknownCmd      Flag.b6         // Unused IR command
  107.  
  108. #define EETimeUpdate    Flag1.b0        // Indicate to update time in eeprom
  109. #define IR05Seconds     Flag1.b1        // A 0.5 seconds of IR inactivity, used to clear IR command repeate flag
  110. #define ClearLED        Flag1.b2        // Need to turn off LED
  111.  
  112. #define FanOn           Status.b0       // Fan Running
  113. #define TimerRunning    Status.b1       // Timer Running
  114.  
  115. #define AddZeroToIRData()   IRData._dword >>= 1                                 // Add a 0 bit to IR data
  116. #define AddOneToIRData()    IRData._dword >>= 1; IRData._dword |= 0x80000000    // Add a 1 bit to IR data
  117.  
  118. // NEC IR protocol states
  119. typedef enum _NEC_STATES
  120. {
  121.     IR_IDLE,
  122.     IR_MARK,
  123.     IR_SPACE,
  124.     IR_HIGH,
  125.     IR_LOW,
  126.     IR_REPEAT
  127. } NEC_STATES;
  128.  
  129. // V A R I A B L E S
  130. //const unsigned char STable[10] = {0, 157, 165, 173, 181, 188, 195, 205, 216, 252};
  131. // Modified to latch low power (load) fans  low firing angle (on full speed)
  132. const unsigned char STable[10] = {0, 157, 165, 173, 181, 188, 195, 205, 216, 234};
  133. near volatile BYTE Flag, Flag1, Status;
  134. near NEC_STATES IRState;
  135. unsigned char IRDataCount, PhaseAngle, Speed, Time, Count;
  136. volatile near unsigned char EECounter, Ticks, Key, KeyCount;
  137. volatile unsigned int IRTime, TimeCounter;
  138. DWORD IRData;
  139.  
  140. // F U N C T I O N   P R O T O T Y P E S
  141. void IRHandler(void);
  142. void NECDecoder(void);
  143. void InitIR(void);
  144. void SetSpeed(void);
  145. void OffTimer(void);
  146. void OnTimer(void);
  147. void SetTimer(void);
  148. void GetEEVariables(void);
  149. void SetEEVariables(void);
  150. void KeyDelay(void);
  151. void interrupt isr(void);
  152. void Delay2s(void);
  153.  
  154. // M A I N
  155. void main(void)
  156. {
  157.     #asm
  158.         call    0x3ff
  159.                 bsf             STATUS, 5
  160.                 movwf   OSCCAL & 0x7f
  161.                 bcf             STATUS, 5
  162.     #endasm
  163.     GPIO    = 0;                                        // Clear PORT
  164.  
  165. // v Added to handle triac2
  166.     PORTC   = 0;
  167. // ^ Added to handle triac2
  168.  
  169.     TriacOff();                                         // Triac off
  170.     TRISIO  = ZC_PIN_MASK | IR_PIN_MASK | 0x05;         // IR, Zero cross and swiches
  171.  
  172. // v Added to handle triac2
  173.     TRISC   = 0;
  174. // ^ Added to handle triac2
  175.  
  176.     WPU     = 0x05;                                     // Weak pull up enabled for wwitches
  177.     IOC     = ZC_PIN_MASK | IR_PIN_MASK;                // Interrupt on change is enabled for GPIO2, GPIO4
  178.     ANSEL   = 0x00;                                     // All are digital i/o
  179.     CMCON   = 0x07;                                     // Comparators off
  180.     INTCON  = 0x68;                                     // Enable PEIE, Timer0, Port change interrupts
  181.     OPTION_REG  = 0x05;                                     // INT falling edge, Prescaler 1:64
  182.     T1CON   = 0x31;                                     // Prescaler 1:8, internal clk, TMR1ON
  183.     LEDOn();
  184.     Flag._byte = 0;                                     // Initialise flags and variables
  185.     Flag1._byte = 0;
  186.     InitIR();
  187.     GetEEVariables();                                   // Read variables  eeprom
  188.     IRState = IR_IDLE;                                  // Init IR state
  189.     if(FanOn)
  190.         StartFan = 1;
  191.     FanOn = 0;                                          // This created a fresh start
  192. #ifdef  TIMER_ENABLE
  193.     if(TimerRunning)                                    // If already started, set the time again
  194.         SetTimer();
  195. #endif
  196.     GIE = 1;                                            // Enable interrupts
  197.     SetSpeed();                                         // Set the speed
  198.     LEDOff();                                           // Turn off LED
  199.     Count = Time << 1;                                  // Count = Time * 2, i.e turn on/off
  200.     Ticks = 0;
  201.     do
  202.     {
  203.         NECDecoder();                                   // Decode NEC formatted IR data
  204.         if(IRNewHit)                                    // Is any new data?
  205.         {
  206.             IRNewHit = 0;                               // Y. Clear flag
  207.             IRHandler();                                // Do the command
  208.         }
  209.         if(IRCmdRepeat)                                 // As long as the repeat command present
  210.         {                                               // do not turn of LED
  211.             IRCmdRepeat = 0;
  212.             Ticks = 0;                                  // for the same clear Ticks
  213.         }
  214.         if(EEPromWrite)
  215.         {
  216.             EEPromWrite = 0;                            // Clear eeprom update flag
  217.             SetEEVariables();                           // Write variables if necessory
  218.         }
  219.         if(ClearLED)
  220.         {
  221.             if(Ticks & 0x20)                            // If remote command received, turn off LED after only
  222.             {                                           // few ms (~320ms)
  223.                 ClearLED = 0;
  224.                 LEDOff();
  225.             }
  226.         }
  227. #ifdef  TIMER_ENABLE
  228.         else if(TimerRunning && (Ticks & 0x40))         // If timer is running and a short time expired (640ms)
  229.         {                                               // used to blink LED to show the time remaining
  230.             if(Count == 0xF7)                           // Reload counter to show the time, after a certain time gap
  231.             {
  232.                 Count = Time << 1;                      // Count = Time * 2, i.e turn on/off
  233.                 LEDOff();                               // Ensure LED is off
  234.             }
  235.             if(!(--Count & 0x80))                       // Blinks the LED till counter become -ve
  236.             {
  237.                 if(Count & 0x01) {                      // On odd numbers in counter LED on
  238.                     LEDOn();
  239.                 }
  240.                 if(!(Count & 0x01)) {                   // For even numbers LED off
  241.                     LEDOff();
  242.                 }
  243.             }
  244.             Ticks = 0;                                  // Reset ticks
  245.         }//if(TimerRunning && (Ticks & 0x40))
  246. #endif
  247.  
  248.         if(KeyCount >= 4)                               // Has key pressed for a short time?
  249.         {
  250.             if(UP_KEY)                                  // Y. Check for Up key press
  251.             {
  252.                 StartFan = 1;                           // Y. Up key pressed, inc the speed
  253.                 Speed++;
  254.             }
  255.             if(DN_KEY)                                  // Check for a down key press
  256.             {
  257.                 StartFan = 1;                           // Y. Down key pressed, decrement the speed
  258.                 Speed--;
  259.             }
  260.             if(StartFan)                                // If any key pressed, do the action
  261.             {
  262.                 SetSpeed();
  263.                 KeyDelay();                             // Give a delay beore the next check
  264.             }
  265.         }
  266.     }while(1);
  267. }// main
  268.  
  269. // F U N C T I O N S
  270. /**
  271. The function is used to decode IR commands and make changes required
  272. */
  273. void IRHandler(void)
  274. {
  275.     if(!(IRData.byte0 ^ IRData.byte1) == 0)             // Address and its compliment match
  276.      {
  277.          if(IRData.byte0 == 0)                          // Address  is zero
  278.          {
  279.              if(!(IRData.byte2 ^ IRData.byte3) == 0)    // Command and its compliment match
  280.              {
  281.                 UnknownCmd = 0;
  282.                 switch(IRData.byte2)
  283.                 {
  284.                     case VOL_PLUS:
  285.                     StartFan = 1;
  286.                     Speed++;
  287.                     break;
  288.                     case VOL_MINUS:
  289.                     StartFan = 1;
  290.                     Speed--;
  291.                     break;
  292.                     case DIGIT0:
  293.                     Speed = 0;
  294.                     OffTimer();
  295.                     break;
  296.                     case DIGIT1:
  297.                     StartFan = 1;
  298.                     Speed = 1;
  299.                     break;
  300.                     case DIGIT2:
  301.                     StartFan = 1;
  302.                     Speed = 2;
  303.                     break;
  304.                     case DIGIT3:
  305.                     StartFan = 1;
  306.                     Speed = 3;
  307.                     break;
  308.                     case DIGIT4:
  309.                     StartFan = 1;
  310.                     Speed = 4;
  311.                     break;
  312.                     case DIGIT5:
  313.                     StartFan = 1;
  314.                     Speed = 5;
  315.                     break;
  316.                     case DIGIT6:
  317.                     StartFan = 1;
  318.                     Speed = 6;
  319.                     break;
  320.                     case DIGIT7:
  321.                     StartFan = 1;
  322.                     Speed = 7;
  323.                     break;
  324.                     case DIGIT8:
  325.                     StartFan = 1;
  326.                     Speed = 8;
  327.                     break;
  328.                     case DIGIT9:
  329.                     StartFan = 1;
  330.                     Speed = 9;
  331.                     break;
  332.  
  333.                     case CH_MINUS:
  334.                     FanOn = 0;
  335.                     OffTimer();
  336.                     break;
  337.  
  338.                     case CH_PLUS:
  339.                     if(Speed == 0) Speed++;
  340.                     StartFan = 1;
  341.                     break;
  342.  
  343.                     case PREV:
  344.                     if(FanOn)   Time--;
  345.                     SetTimer();
  346.                     break;
  347.  
  348.                     case NEXT:
  349.                     if(FanOn)   Time++;
  350.                     SetTimer();
  351.                     break;
  352.  
  353.                     case EQ:
  354.                     OffTimer();
  355.                     break;
  356.  
  357.                     case PLAY:
  358.                     OnTimer();
  359.                     break;
  360.  
  361. // v Added to handle triac2
  362.                                     case CH100:
  363.                     Triac2On();
  364.                     break;
  365.      
  366.                     case CH200:
  367.                     Triac2Off();
  368.                     break;
  369. // ^ Added to handle triac2
  370.  
  371.                     default:
  372.                     UnknownCmd = 1;
  373.                     break;
  374.                 }
  375.                 if(!UnknownCmd){
  376.                     LEDOn();                // A new command received
  377.                     ClearLED = 1;           // Clear LED after a little time
  378.                     Ticks = 0;              // Reset timer ticks
  379.                     SetSpeed();
  380.                 }
  381.              }// if((IRData.byte0 ^ IRData.byte1) == 0)
  382.          }// if(IRData.byte3 == 0)
  383.      }//if((IRData.byte3 ^ IRData.byte2) == 0)
  384. }
  385. /**
  386. Off the timer, without changing previous set time
  387. */
  388. void OffTimer(void)
  389. {
  390.     TimerRunning = 0;                                   // Turn off timer
  391.     Time = eeprom_read(1);                              // Read the eeprom, value
  392.     EETimeUpdate = 1;                                   // Update time in the eeprom
  393.     EECounter = 0;                                      // Clear the eeprom counter to update eeprom
  394. }
  395. /**
  396. On timer, start with the previous set time, if the timer is not running
  397. */
  398. void OnTimer(void)
  399. {
  400.     if(FanOn == 1)                                      // Only start Timer when fan on
  401.     {
  402.         if(!TimerRunning)                               // Nothing to do if already started
  403.         {
  404.             TimerRunning = 1;                           // Start the timer
  405.             Time = eeprom_read(1);                      // Get time  eeprom
  406.             if(Time == 0)                               // If zero, switch on timer with a non zero value, i.e one hour
  407.                 Time++;
  408.             TimeCounter = TIME_COUNT;                   // Reload the counter
  409.             EETimeUpdate = 1;                           // Update time in the eeprom
  410.             EECounter = 0;                              // Clear the eeprom counter to update eeprom
  411.         }
  412.     }
  413. }
  414. /**
  415. Set the counters for the timer. When the counter reached zero, the fan will be turned off
  416. If the timer not running, it reload time value with the last saved value  the eeprom,
  417. otherwise adjust counters as required, and clear eeprom counter to update time value in the
  418. eeprom, for the same it set a EETimeUpdate flag
  419. */
  420. void SetTimer(void)
  421. {
  422.     if(Time & 0x80)                                     // A neg, so clear it
  423.         Time = 0;
  424.     if(Time > 8)
  425.         Time = 8;                                       // Max 8 hours
  426.     if(FanOn == 0)                                      // Nothing to do if fan is not running
  427.         return;
  428.     if(!TimerRunning && (Time != 0)) {                  // If decrementing, and time reached zero, on further
  429.         Time = eeprom_read(1);                          // decrements never start the timer, only start on
  430.         TimerRunning = 1;                               // increments, i.e when time not zero.
  431.         if(Time == 0)                                   // If zero, start with a non zero value
  432.             Time++;                                     // i.e. set to one
  433.     }
  434.     if(Time == 0)                                       // Stop timer, if time is zero
  435.         TimerRunning = 0;
  436.     TimeCounter = TIME_COUNT;                           //
  437.     EETimeUpdate = 1;                                   // Update time in the eeprom
  438.     EECounter = 0;                                      // Clear the eeprom counter to update eeprom
  439. }
  440. /**
  441. Set the speed and update phase angle for a given speed. If start fan flag is set, and fan not running
  442. it starts fan will full speed for a second, then changes to ed speed.
  443. */
  444. void SetSpeed(void)
  445. {
  446.     if(Speed & 0x80)                                    // A neg, keep it as zero
  447.         Speed = 0;
  448.     if(Speed >= 10)                                     // Reach the max.
  449.         Speed = 9;
  450.     if(Speed == 0){
  451.         StartFan = 0;                                   // For a zero speed, switch off
  452.         FanOn = 0;
  453.     }
  454.     if(StartFan){                                       // If required, try to start the fan
  455.         if(!FanOn){                                     // Already running?
  456.             FanOn = 1;                                  // No. Switch on fan
  457.             PhaseAngle = STable[9];                     // If just swiched on run it on full speed
  458.             Delay2s();                                  // for a short time
  459.         }
  460.         StartFan = 0;                                   // Clear the flag
  461.     }
  462.     if(FanOn == 0) OffTimer();
  463.     PhaseAngle = STable[Speed];                         // Set the phase angle for the speed
  464.     EECounter = 0;                                      // Update EEPROM
  465. }
  466. /**
  467. Decode the IR data received in NEC format
  468. */
  469. void NECDecoder(void)
  470. {
  471.     static unsigned int IRBitTime, PrevIRTimer;
  472.     #if 0
  473.     static unsigned char Port;
  474.     if((Port ^ GPIO) & IR_PIN_MASK)                     // IR line changed
  475.     {
  476.         *((unsigned char*)&IRTime) = TMR1L;             // Copy the current Timer 1 value (LSB)
  477.         *((unsigned char*)&IRTime + 1) = TMR1H;         // -- do -- (MSB)
  478.         Port = GPIO;
  479.         IRBitTime = IRTime - PrevIRTimer;
  480.         PrevIRTimer = IRTime;
  481.         if(IRBitTime & 0x0800)
  482.             IRState = IR_IDLE;               // Idle for more than 16 ms
  483.         IRRx = 0;
  484.     #else
  485.     if(IRRx)
  486.     {
  487.         IRBitTime = IRTime - PrevIRTimer;
  488.         PrevIRTimer = IRTime;
  489.         if(IRBitTime & 0x0800)
  490.             IRState = IR_IDLE;              // Idle for more than 16 ms
  491.         IRRx = 0;
  492.     #endif
  493.         Error = 0;
  494.         switch(IRState)
  495.         {
  496.             case IR_IDLE:
  497.             if(IsIRDataBitHigh())           // If it is a one, IR starting
  498.                 IRState++;                  // Now is IR_MARK
  499.             IRDataCount = 0;
  500.             IRData._dword = 0;
  501.             break;
  502.  
  503.             case IR_MARK:                   // Now IR Mark just over
  504.             if(IRBitTime < IR_MARK_MIN_TIME)
  505.             {
  506.                 Error = 1;                  // Less than specified mark time
  507.             }
  508.             IRState++;
  509.             break;
  510.  
  511.             case IR_SPACE:                  // Now IR space just over
  512.             if(IRBitTime < IR_SPACE_MIN_TIME)
  513.             {
  514.                 Error = 1;                  // Less than specified space time
  515.             }
  516.             if(IRBitTime < IR_SPACE_MIN_TIME * 2)
  517.             {
  518.                 IRState = IR_REPEAT;        // If it is less than 4.5 ms, it may be a repeat command
  519.                 break;
  520.             }
  521.             IRState++;                      // Space is 4.5 ms, now IR high
  522.             break;
  523.  
  524.             case IR_HIGH:                   // IR high just over, check it
  525.             if(((unsigned char) IRBitTime < MIN_IR_BIT_TIME) || ((unsigned char) IRBitTime > MAX_IR_BIT_TIME))
  526.             {
  527.                 Error = 1;                  // Too short or too long pulse
  528.             }
  529.             IRState++;
  530.             break;
  531.  
  532.             case IR_LOW:                    // IR low just over, check it
  533.             if(((unsigned char) IRBitTime < MIN_IR_BIT_TIME) || ((unsigned char) IRBitTime > MAX_IR_BIT_TIME * 3))
  534.             {
  535.                 Error = 1;                  // Too short or too long pulse
  536.             }
  537.             if((unsigned char) IRBitTime >= MIN_IR_BIT_TIME * 3)
  538.             {
  539.                 AddOneToIRData();           // Longer low time, add a one
  540.             }
  541.             else
  542.             {
  543.                 AddZeroToIRData();          // Short low time add a zero
  544.             }
  545.             IRDataCount++;                  // Increment the counter
  546.             IRState--;                      // Now is IR High
  547.             break;
  548.  
  549.             case IR_REPEAT:                 // In repeat, the 560us IR burst just over, check it now
  550.             if(((unsigned char) IRBitTime < MIN_IR_BIT_TIME) || ((unsigned char) IRBitTime > MAX_IR_BIT_TIME))
  551.             {
  552.                 IRCmdRepeat = 0;
  553.                 Error = 1;
  554.             }
  555.             IRCmdRepeat = 1;
  556.             IRState = IR_IDLE;
  557.             break;
  558.  
  559.         }// switch(IRState)
  560.         if(Error)
  561.         {
  562.             InitIR();
  563.         }
  564.         if(IRDataCount == 32)
  565.         {
  566.             IRNewHit = 1;
  567.             IRState = IR_IDLE;
  568.             IRDataCount = 0;
  569.             //IROff = 0;
  570.         }
  571.         IR05Seconds = 0;
  572.     }// if(IRRx)
  573. }
  574. /**
  575. Initialise IR states
  576. */
  577. void InitIR( void ) // initial IR engine
  578. {
  579.     IRState = IR_IDLE;
  580.     IRNewHit = 0;
  581.     IRCmdRepeat = 0;
  582.     IRDataCount = 0;
  583. }
  584. /**
  585. Read variables  eeprom
  586. */
  587. void GetEEVariables(void)
  588. {
  589.     Speed = eeprom_read(0);
  590.     Time = eeprom_read(1);
  591.     Status._byte = eeprom_read(2);
  592. }
  593. /**
  594. Write to eeprom, the variables
  595. */
  596. void SetEEVariables(void)
  597. {
  598.     // Compare with the eeprom variables and update if necessory
  599.     if(Speed != eeprom_read(0))
  600.         eeprom_write(0, Speed);
  601.     if(EETimeUpdate)                                    // Time may change while running, so only update
  602.     {                                                   // if user make changes
  603.         if(Time != eeprom_read(1))
  604.             eeprom_write(1, Time);
  605.         EETimeUpdate = 0;
  606.     }
  607.     if(Status._byte != eeprom_read(2))
  608.         eeprom_write(2, Status._byte);
  609. }
  610. /**
  611. Create a 2 seconds delay, used to start the fan
  612. */
  613. void Delay2s(void)
  614. {
  615.     unsigned char Count;
  616.     Count = 200;                                        // Make a 200 x 10 ms delay
  617.     while(--Count != 0)
  618.         __delay_ms(10);
  619. }
  620. /**
  621. Delay after a key press. This function retuns after a specified time or when no key pressed down
  622. */
  623. void KeyDelay(void)
  624. {
  625.     unsigned char ms;
  626.     ms = 250;                                           // 500 ms delay
  627.     do
  628.     {
  629.         if(!ANY_KEY)                                    // If key released, return
  630.             break;
  631.         __delay_ms(2);
  632.     }while(--ms != 0);
  633. }
  634.  
  635. void interrupt isr(void)
  636. {
  637.     static unsigned char PortStatus, PortChanges;
  638.     if(GPIF)
  639.     {
  640.         PortChanges = PortStatus;                       // Copy the previous value
  641.         PortStatus = GPIO;                              // Update PortStatus
  642.         GPIF = 0;                                       // Clear interrrupt
  643.         PortChanges ^= PortStatus;                      // Find the differences
  644.         if(PortChanges & ZC_PIN_MASK)                   // Zero cross
  645.         {
  646.             TMR0 = PhaseAngle;                          // Phase angle is controlled via TMR0, on interrupt it trigger
  647.             if(FanOn && (PhaseAngle >= STable[9])){     // For full speed hold trigger  now, and TMR0 interrupt (delayed
  648.                 TriacOn();                              // to reach TRIAC holding current) clear the trigger
  649.             }
  650.             Ticks++;                                    // Ticks @ 10 ms
  651.             {
  652.             #asm
  653.             INCFSZ      _KeyCount,W                     // Inc Key Count, but not beyond 255
  654.             MOVWF       _KeyCount
  655.             CLRW                                        // Clear W
  656.             BTFSS       SW_UP                           // Up Key pressed?
  657.             MOVLW       0x81                            // Y. Load W with 0x81
  658.             BTFSS       SW_DN                           // Down Key pressed?
  659.             MOVLW       0x82                            // Y. Load W with 0x82
  660.             MOVWF       _Key                            // Save W to Key
  661.             BTFSS       _Key,7                          // Has any key pressed?
  662.             CLRF        _KeyCount                       // N. Clear the counter
  663.             #endasm
  664.             }
  665.         }//if(PortChanges & ZC_PIN_MASK)
  666.         if(PortChanges & IR_PIN_MASK)                   // IR line changed
  667.         {
  668.             *((unsigned char*)&IRTime) = TMR1L;         // Copy the current Timer 1 value (LSB)
  669.             *((unsigned char*)&IRTime + 1) = TMR1H;     // -- do -- (MSB)
  670.             IRRx = 1;
  671.         }
  672.     }
  673.     if(T0IF)                                            // Interrupt depends on phase angle (TMR0 is set by phase angle)
  674.     {
  675.         if(FanOn){
  676.             TriacOn();                                  // Triac triggered
  677.         }
  678.         T0IF = 0;                                       // Clear flag
  679.         NOP();
  680.         NOP();
  681.         NOP();
  682.         NOP();
  683.         TriacOff();                                     // Triac off, beacuse already triggered
  684.     }//if(T0IF)
  685.  
  686.     if(TMR1IF)                                          // @ 524ms; This interrupt is not set, but polled
  687.     {                                                   // with other interrupts
  688.         TMR1IF = 0;
  689. #ifdef  TIMER_ENABLE
  690.         if(TimerRunning && (--TimeCounter == 0))        // If timer running, decrement counter
  691.         {
  692.             TimeCounter = TIME_COUNT;                   // Reload counter
  693.             if(--Time == 0)                             // The time expired, switch off fan and counter
  694.             {
  695.                 OffTimer();                             // Switch off timer
  696.                 FanOn = 0;
  697.             }
  698.         }
  699. #endif
  700.         {
  701.         #asm
  702.         INCFSZ  _EECounter,W                            // Inc eeprom timer, but not beyond 255
  703.         MOVWF   _EECounter
  704.         #endasm
  705.         }
  706.         if(EECounter == 8)                              // After 4 seconds since clearing the counter
  707.             EEPromWrite = 1;                            // set eeprom write flag
  708.         if(IR05Seconds)                                 // After 0.5 seconds of inactivity
  709.             IRCmdRepeat = 0;                            // clear the repeat command
  710.         IR05Seconds = 1;
  711.     }//if(TMR1IF)
  712. }

Again Thank you
A hozzászólás módosítva: Jún 24, 2022
(#) Broy válasza Bakman hozzászólására (») Jún 27, 2022 /
 
Köszönöm szépen. Tökéletesen működik. Remélem, a többi bemenettel nem lesz probléma.
(#) DJozso hozzászólása Júl 7, 2022 /
 
Sziasztok! Szeretném megkérdezni, kedves fórumtársaim, mennyire bonyolult megoldani a következőt:
Adott egy saját készítésű riasztó, melynek lelke egy 18F kontroller. Eddig, riasztás esetén egy GSM átjelző bemenetét aktíválta, ami SMS-t küldött/Rámcsörgött. Ezt szeretném kiváltani egy email küldő rendszerre, ami saját otthoni wifiről/Lanról "beszél" a telómmal, esetleg valami egyszerű kis androidos appal. Így nem kell mindig kártyát töltögetnem.... Szerintetek merre induljak el? Egyáltalán lehetséges ez otthoni képességek közt? Régebben vettem már olyan panelt, amin van egy ethernet csati a másik oldalán pedig egy tüskesor, táp csatival Rx Tx lábbal. Valami ilyesmivel lehetne megoldani?
(#) pipi válasza DJozso hozzászólására (») Júl 7, 2022 / 1
 
Lehet PIC-el is, de esp32 vagy esp8266-al egyszerűbb... Arduinó alatt programozhatod, Pushbullet könyvtárat javaslok, az én riogatóm is ezen keresztül küld push üzenetet a telómra. ha jól emlékszem havi 500 üzenetig ingyenes.
A hozzászólás módosítva: Júl 7, 2022

ppp.png
    
(#) DJozso válasza pipi hozzászólására (») Júl 8, 2022 /
 
Köszönöm a választ, utána nézek.
(#) gyurma888 hozzászólása Júl 20, 2022 /
 
Sziasztok!
Tudnátok abban segíteni, hogy merre találom a PicKit 3 által támogatott PIC eszközöket? Most éppen speciálisan ezt a mikrokontrollert szeretném programozni:
PIC18F25K80
Egy oldalt már találtam, ott ezt a típust nem találtam, viszont esetleg MPLAB alól nem lehet valami software update-t telepíteni a PicKit-re hogy támogassa ezt a kontrollert?
(Egyébként azt a sima asztali alkalmazást használom, ami a PicKit 2-re hajaz.)
Köszönöm előre is!
(#) gyurma888 válasza gyurma888 hozzászólására (») Júl 21, 2022 /
 
Update:
MPLAB IPE-vel működik...
További szép napot!
(#) JosKa hozzászólása Júl 25, 2022 /
 
Sziasztok Uraim!

Részben offtopic, mivel nem kezdő kérdést teszek fel - remélem maradhat.

Adott per pillanat 10,000+db PIC24 (QFN-24, 4x4mm) melyet szeretnék egy adott HEX-szel feltölteni (a HEX az összes vezérlő esetében bitre pontosan ugyanaz). Hogyan tudnám ezt hatékonyan megtenni? Az eddig bevett módszer miszerint a kolléga nekiül és egyesével felprogramozza rosszul skálázódik, valami jobb kell.

Célgépek léteznek ilyen célra? Bújtam a netet, de nem találtam. Valaki ismer közületek olyan céget aki ilyet gyárt/forgalmaz?
Esetleg valaki a tisztelt olvasók közül foglalkozik ilyesmivel? (Ha számlaképesen vállalná valaki az is érdekelne.)

ICSP nem opció. Arról is van tudomásom, hogy a gyártó vállalja a felprogramozást - ez viszont a jelenlegi chip szituációban (szinte) kivitelezhetetlen.
(#) pipi válasza JosKa hozzászólására (») Júl 25, 2022 /
 
kérdés mekkora a nyák, pl montírozva van-e.... Csináltunk tűágyat, 10 móricka panelecske montírozva, 10 db pickit3 nyomógombok párhuzamosítva (optó), egy gomnyomásra a 10 panel besül, illetve van még plusz hw/sw, ami le is teszteli funkcionálisan a paneleket Ezt találtam ki "házilagos" kivitelezésre....
(#) JosKa válasza pipi hozzászólására (») Júl 26, 2022 /
 
Valami hasonlót csinálnék ha ICSP (In-Circuit Serial Programming) opció lenne, sajnos nem az.
(#) nedudgi válasza JosKa hozzászólására (») Júl 26, 2022 /
 
A panelek be vannak már ültetve?
(#) bbb válasza JosKa hozzászólására (») Júl 26, 2022 /
 
Pedig ekkora darabszám esetén ha még nincs megvéve az alkatrész, akkor a gyártótól eleve felprogramozva rendelt PIC járható út lehetne... Legalább egy kérdést feléjük megeresztve kiderülne mennyire "kivitelezhetetlen".
A pipi féle megoldás biztosan járható út, csak valami tartót is ki kell találni hozzá, amibe "belepottyanhat" a mikrovezérlő. A "programmer-to-go" funkcióval egyszer kell előkészíteni a programozókat, s ahogy írta, gombnyomásra írja a mikrovezérlőt (én pickit2-vel próbáltam ezt a funkciót és már azon is jól ment).
(#) JosKa válasza bbb hozzászólására (») Júl 26, 2022 /
 
ICSP nem opció - a termék méretei nem teszik lehetővé, hogy extra programozó pin-eket tegyünk rá és tüskével csatlakozzunk beültetés után.

A gyártó által történő felprogramozásnak 2019 végén jártam utána komolyabban - akkor az volt a menet, hogy elküldöd a file-t és kb fél év (!) múlva küldenek egy kis drabszámú mintát mely ellenőrzése és jóváhagyása után még legalább fél év mire megkapod az alkatrészeket. Van több futó rendelésünk a gyártól direktben, hónapokat tolódik a várható szállítási dátum egyik napról a másikra - ezt megfűszerezni elő-programozzással valószínüleg lehetséges, de az idő nagy ellenség.

Ahogy az első posztban is írtam: ICSP és gyártó által történő elő-programozás nem opció. Utóbbit tervezem elővenni amint a chip-hiány elmúlik/csökken.
(#) pipi válasza JosKa hozzászólására (») Júl 26, 2022 /
 
Ha ezt a kettőt kizártad, sok lehetőséged nincs, magad uram, ha gyártód nincs...
Akkor gyárts az IC-hez egy "foglalat" szerű cuccot, belepottyintod az IC-t, leszorítod, és programozhatod. Illetve nyilván nem egy, hanem több példányhoz.
Persze robotot is lehet fejleszteni, ami kiveszi a tálcából, berakja a programozóba, felprogizza, visszateszi a tálcába....
---
Azért elég nehezen tudom elképzelni, hogy nincs 3 pici forrpöttynek hely a nyákon bárhol, még ha nem is egymás mellett (a +2db táp valahol ugyis megvan)
A hozzászólás módosítva: Júl 26, 2022
(#) icserny válasza JosKa hozzászólására (») Júl 26, 2022 /
 
Van programozó adapter: QFN24 to DIP24 Programmer Adapter
(#) JosKa válasza pipi hozzászólására (») Júl 26, 2022 /
 
Idézet:
„Azért elég nehezen tudom elképzelni, hogy nincs 3 pici forrpöttynek hely a nyákon bárhol...”

Már pedig nincs hely. A maga nemében teljesen egyedi amiről szó van, a legkisebb konkurens termék is kb négyszer akkora mint a miént. Látatlanban én sem tudnám elhinni, de tényleg így van. Nagyon szívesen megmutatnám konkrétumokkal a terméket, ez viszont nem áll módomban.

Idézet:
„Ha ezt a kettőt kizártad, sok lehetőséged nincs, magad uram, ha gyártód nincs...”

Eddig is így csináltuk - kézzel, egyesével. Időközben egy kedves fórumtárs egy üzenetben felhívta a figyelmemet egy cégre akiknek többek közt pontosan ez a profilja, az egyeztetések ez irányba már meg is indultak - előreláthatólag cca 10cent/darab áron meg tudják csinálni a feladatot gépesítve, automatizálva.
(#) Bakman válasza JosKa hozzászólására (») Júl 26, 2022 /
 
Melyik az a cég? Hátha másnak is jól jön (ha már egyszer fórum).
(#) kissi válasza Bakman hozzászólására (») Júl 26, 2022 /
 
Szia!

Ezt javasoltam: Bővebben: Link
Következő: »»   1179 / 1203
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem