Advertisement
Guest User

Untitled

a guest
Dec 11th, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.56 KB | None | 0 0
  1. #include <xc.h>                                     //PIC hardware mapping
  2. #include<pic16f1829.h>
  3. #define _XTAL_FREQ 500000                            //Used by the XC8 delay_ms(x) macro
  4. //totale stap cycle van 256 stappen duurt 8 seconde elke stap duurt dus 32 miliseconde elke instrucite duurt  0,008 mili seconde 32/0,008 = 4000 stappen nodig maar de timer heeft maar 255 stappen dus gebruik maken van post of pre scalar.dus een scalar van 1:16.
  5. #define vertraging32 60500 //= 32000 (milisec) / 16 (want prescalar = 1:2 en 65536 (2^16) - 2000 = 63536)
  6.  
  7. //config bits that are part-specific for the PIC16F1829
  8. #pragma config FOSC=INTOSC, WDTE=OFF, PWRTE=OFF, MCLRE=OFF, CP=OFF, CPD=OFF, BOREN=ON, CLKOUTEN=OFF, IESO=ON, FCMEN=ON
  9. #pragma config WRT=OFF, PLLEN=OFF, STVREN=OFF,BORV = LO, LVP=OFF
  10.  
  11. const unsigned short PWM_Lookup[] = {
  12.     0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6,
  13.     6,
  14.     7,
  15.     8,
  16.     9,
  17.     9,
  18.     10,
  19.     11,
  20.     12,
  21.     13,
  22.     14,
  23.     15,
  24.     16,
  25.     17,
  26.     18,
  27.     19,
  28.     20,
  29.     21,
  30.     22,
  31.     23,
  32.     25,
  33.     26,
  34.     27,
  35.     29,
  36.     30,
  37.     31,
  38.     33,
  39.     34,
  40.     36,
  41.     37,
  42.     39,
  43.     40,
  44.     42,
  45.     44,
  46.     45,
  47.     47,
  48.     49,
  49.     51,
  50.     52,
  51.     54,
  52.     56,
  53.     58,
  54.     60,
  55.     62,
  56.     64,
  57.     66,
  58.     68,
  59.     70,
  60.     72,
  61.     74,
  62.     77,
  63.     79,
  64.     81,
  65.     83,
  66.     86,
  67.     88,
  68.     90,
  69.     93,
  70.     95,
  71.     98,
  72.     100,
  73.     103,
  74.     105,
  75.     108,
  76.     111,
  77.     113,
  78.     116,
  79.     119,
  80.     121,
  81.     124,
  82.     127,
  83.     130,
  84.     133,
  85.     136,
  86.     139,
  87.     141,
  88.     144,
  89.     148,
  90.     151,
  91.     154,
  92.     157,
  93.     160,
  94.     163,
  95.     166,
  96.     170,
  97.     173,
  98.     176,
  99.     180,
  100.     183,
  101.     186,
  102.     190,
  103.     193,
  104.     197,
  105.     200,
  106.     204,
  107.     208,
  108.     211,
  109.     215,
  110.     219,
  111.     222,
  112.     226,
  113.     230,
  114.     234,
  115.     238,
  116.     241,
  117.     245,
  118.     249,
  119.     253,
  120.     257,
  121.     261,
  122.     265,
  123.     269,
  124.     274,
  125.     278,
  126.     282,
  127.     286,
  128.     290,
  129.     295,
  130.     299,
  131.     303,
  132.     308,
  133.     312,
  134.     317,
  135.     321,
  136.     326,
  137.     330,
  138.     335,
  139.     339,
  140.     344,
  141.     349,
  142.     353,
  143.     358,
  144.     363,
  145.     368,
  146.     373,
  147.     377,
  148.     382,
  149.     387,
  150.     392,
  151.     397,
  152.     402,
  153.     407,
  154.     412,
  155.     417,
  156.     423,
  157.     428,
  158.     433,
  159.     438,
  160.     444,
  161.     449,
  162.     454,
  163.     460,
  164.     465,
  165.     470,
  166.     476,
  167.     481,
  168.     487,
  169.     492,
  170.     498,
  171.     504,
  172.     509,
  173.     515,
  174.     521,
  175.     526,
  176.     532,
  177.     538,
  178.     544,
  179.     550,
  180.     556,
  181.     561,
  182.     567,
  183.     573,
  184.     579,
  185.     586,
  186.     592,
  187.     598,
  188.     604,
  189.     610,
  190.     616,
  191.     623,
  192.     629,
  193.     635,
  194.     641,
  195.     648,
  196.     654,
  197.     661,
  198.     667,
  199.     674,
  200.     680,
  201.     687,
  202.     693,
  203.     700,
  204.     707,
  205.     713,
  206.     720,
  207.     727,
  208.     734,
  209.     740,
  210.     747,
  211.     754,
  212.     761,
  213.     768,
  214.     775,
  215.     782,
  216.     789,
  217.     796,
  218.     803,
  219.     810,
  220.     817,
  221.     825,
  222.     832,
  223.     839,
  224.     846,
  225.     854,
  226.     861,
  227.     868,
  228.     876,
  229.     883,
  230.     891,
  231.     898,
  232.     906,
  233.     913,
  234.     921,
  235.     928,
  236.     936,
  237.     944,
  238.     952,
  239.     959,
  240.     967,
  241.     975,
  242.     983,
  243.     991,
  244.     999,
  245.     1007,
  246.     1014,
  247.     1023,
  248. };
  249.  
  250. typedef enum {
  251.     dim,
  252.     fel,
  253.     noppes
  254. } knop;
  255.  
  256. unsigned int index = 0;
  257. volatile knop vroeger = dim;
  258. volatile knop nu = noppes;
  259.  
  260. void init(void) {
  261.     //setup clock
  262.     OSCCON = 0b00111000; //500KHz clock speed
  263.     //set up leds
  264.     TRISC = 0; //all LED pins are outputs
  265.     LATC = 0;
  266.     //set up button
  267.     TRISAbits.TRISA2 = 1; //switch as input
  268.     ANSELAbits.ANSA2 = 0; //digital switch
  269.  
  270.     //setup the PWM
  271.     CCP2CON = 0b00001100; //PWM mode single output
  272.     PR2 = 255; //Frequency at 486Hz. Anything over ~60Hz will get rid of any flicker
  273.     //PWM Period = [PR2 + 1]*4*Tosc*T2CKPS = [255 + 1] * 4 * (1 / 500KHz) * 1
  274.     CCPTMRSbits.C2TSEL = 0b00; //select timer2 as PWM source
  275.     T2CONbits.T2CKPS = 0b00; //1:1 prescaler
  276.     T2CONbits.TMR2ON = 1; //start the PWM
  277.  
  278.     //setup TIMER1 as the delay
  279.     T1CON = 0x10; // Fosc/4, prescaler 1:2, tmr1 of
  280.     T1CONbits.TMR1ON = 1;
  281.     //1:256 prescaler for a delay of: (insruction-cycle * 256-counts)*prescaler = ((8uS * 256)*256) =~ 524mS
  282.  
  283.     TMR1IE = 1;
  284.     PIE1bits.TMR1IE = 1; //enable the TMR4 rollover interrupt
  285.     PIR1bits.TMR1IF = 0;
  286.     //setup interrupt on change for the switch
  287.     INTCONbits.IOCIE = 1; //enable interrupt on change global
  288.     IOCANbits.IOCAN2 = 1; //when SW1 is pressed, enter the ISR
  289.     IOCAPbits.IOCAP2 = 1;
  290.     IOCAFbits.IOCAF2 = 1;
  291.    
  292.    
  293.  
  294.     PEIE = 1;
  295.     GIE = 1; //enable global interupt
  296. }
  297.  
  298. void __interrupt() ISR() {
  299.     if (PORTAbits.RA2 == 0 && IOCAFbits.IOCAF2 == 1) {
  300.         IOCAFbits.IOCAF2 = 0; //flag = clear
  301.         if (vroeger == dim) {
  302.             vroeger = fel;
  303.             nu = fel;
  304.         } else {
  305.             vroeger = dim;
  306.             nu = dim;
  307.         }
  308.     } else if (PORTAbits.RA2 == 1 && IOCAFbits.IOCAF2 == 1) {
  309.         IOCAFbits.IOCAF2 = 0;
  310.         nu = noppes;
  311.     }
  312.  
  313.     if (PIR1bits.TMR1IF == 1) {
  314.         PIR1bits.TMR1IF = 0;
  315.         TMR1 += vertraging32;
  316.  
  317.         switch (nu) {
  318.             case noppes:
  319.                 break;
  320.  
  321.             case dim:
  322.                 if (index > 0) {
  323.                     index--;
  324.                 }
  325.                 break;
  326.  
  327.             case fel:
  328.                 if (index < 255) {
  329.                     index++;
  330.                 }
  331.                 break;
  332.         }
  333.     }
  334.  
  335.     CCPR2L = ((PWM_Lookup[index] >> 2) & 0xFF);
  336.     CCP2CONbits.DC2B = ((PWM_Lookup[index] >> 8) & 0x03);
  337. }
  338.  
  339. void main() {
  340.     init();
  341.  
  342.     while (1) {
  343.  
  344.     }
  345.  
  346.  
  347. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement