Presentation is loading. Please wait.

Presentation is loading. Please wait.

C Examples 1. Download Links MPLAB IDE dsPIC30F4011/4012 Data Sheet dsPIC30F Family Reference Manual MikroC MikroC Manual MikroC Quick Reference.

Similar presentations


Presentation on theme: "C Examples 1. Download Links MPLAB IDE dsPIC30F4011/4012 Data Sheet dsPIC30F Family Reference Manual MikroC MikroC Manual MikroC Quick Reference."— Presentation transcript:

1 C Examples 1

2 Download Links MPLAB IDE dsPIC30F4011/4012 Data Sheet dsPIC30F Family Reference Manual MikroC MikroC Manual MikroC Quick Reference

3 This step necessary if you are using an RS-232 programmer.

4

5

6 This is necessary for the program to run after successfully programming

7

8

9 LED ON main () { TRISB=0b11111101; while(1) { PORTB.F1=1; }

10 Rapid40iXL I am using LED 1 connected to RB1 and SW4 connected to MCLR

11 Blinking LED - 1 main () { ADPCFG = 0xFFFF; //Analog input pin in Digital mode, // port read input enabled, TRISB=0b11111101; PORTB.F1=1; while(1) { Delay_ms(1000); PORTB.F1=PORTB.F1^1; }

12 Blinking LED - 2 main () { ADPCFG = 0xFFFF; TRISB=0b11111101; PORTB=PORTB|0b00000010; while(1) { Delay_ms(1000); PORTB=PORTB^0x02; }

13

14 Logical VS Bitwise

15 Timer 1 16-bit Timer Mode: In the 16-bit Timer mode, the timer increments on every instruction cycle up to a match value, preloaded into the Period register, PR1, then resets to 0 and continues to count. When the CPU goes into the Idle mode, the timer will stop incrementing unless the TSIDL (T1CON ) bit 0. If TSIDL 1, the timer module logic will resume the incrementing sequence upon termination of the CPU Idle mode. 16-bit Synchronous Counter Mode: In the 16-bit Synchronous Counter mode, the timer increments on the rising edge of the applied external clock signal, which is synchronized with the internal phase clocks. The timer counts up to a match value preloaded in PR1, then resets to 0 and continues. When the CPU goes into the Idle mode, the timer will stop incrementing unless the respective TSIDL bit o. If TSIDL 1, the timer module logic will resume the incrementing sequence upon termination of the CPU Idle mode.

16

17 Blinking LED - 3 main () { T2CON=0x8030; // Enable Timer 2 Prescaler=256 IEC0=0x0040; // Enable Interrupt for Timer 2 PR2=0xF424; ADPCFG = 0xFFFF; TRISB=0b11111101; PORTB=PORTB|0b00000010; while(1) { } void interrupt_T2() org 0x000020 { PORTB=PORTB^0x02; IFS0=0x0000; }

18

19

20

21

22 Blinking LED - 4 main () { T2CON=0b1000000000001000; // Enable Timer 2/3 IEC0=0x0080; // Enable Interrupt for Timer 3 PR2=0x6800; PR3=0x0989; ADPCFG = 0xFFFF; TRISB=0b11111101; PORTB=0x00; while(1) { } void interrupt_T2() org 0x000022 { PORTB=PORTB^0x02; IFS0=0x0000; }

23 Switch + LED (SWITCH1) main () { ADPCFG = 0xFFFF; TRISB=0b11111101; TRISE=0b000001; PORTB=0x00; // THE CODE DOES NOT USE PORT B PORTE=0x1F; while(1) { if((PORTE&0b000001)==0) {PORTE.F1=PORTE.F1^1;} } Now I am using LED 4 connected to RB1 and SW1 connected to RE0

24 Key DEBOUNCING

25 Key DEBOUNCING – 1 (SWITCH2) main () { int i; const int Twentyms = 29,091; ADPCFG = 0xFFFF; TRISB=0b11111101; TRISE=0b000001; PORTB=0x00; PORTE=0x1F; while(1) { i = 0; // Wait 20 ms for Button Up while (i < Twentyms) { if (0 == PORTE.F0) // Button Down/Start over { i = 0; } else // Button Up/Increment Count { i = i + 1; } // i = 0; // Wait 20 ms for Button Down while (i < Twentyms) if (1 == PORTE.F0) // Button Up/Start over i = 0; else // Button Down/Increment Count i = i + 1; PORTE.F1=PORTE.F1^1; // Toggle LED to Turn ON/OFF LED } Adapted from 123 PIC Experiments for the EVIL GENIOUS by MYKE PREDKO

26 Key DEBOUNCING - 1 ;SWITCH2.c,13 :: while (i < Twentyms) $0120$L_main_2: $0120$470060ADDW14, #0, W0 $0122$780110MOV[W0], W2 $0124$210721MOV#4210, W1 $0126$510001SUBW2, W1, W0 $0128$3D000DBRA GEL_main_3, L_main_3 ;SWITCH2.c,15 :: if (0 == PORTE.F0) // Button Down/Start over $012A$8016D0MOVPORTE, W0 $012C$6000E1ANDW0, #1, W1 $012E$108060SUBRW1, #0, W0 $0130$3A0004BRA NZL_main_4, L_main_4 ;SWITCH2.c,17 :: i = 0; $0132$200000MOV#0, W0 $0134$780F00MOVW0, [W14] ;SWITCH2.c,18 :: } $0136$040140GOTOL_main_5 $013A$L_main_4: ;SWITCH2.c,21 :: i = i + 1; $013A$200011MOV#1, W1 $013C$470060ADDW14, #0, W0 $013E$408810ADDW1, [W0], [W0] ;SWITCH2.c,22 :: } // $0140$L_main_5: ;SWITCH2.c,23 :: } // $0140$040120GOTOL_main_2

27 Key DEBOUNCING – 2 (SWITCH3) int function_key(void) { int i,m; const int Twentyms = 29091; m=1; // SWITCH UP INDICATOR if (1 == PORTE.F0) {return(m);} while(1) { i = 0; // Wait 20 ms for Button Up while (i < Twentyms) { if (0 == PORTE.F0) // Button Down/Start over { i = 0; } else // Button Up/Increment Count { i = i + 1; } // m=0; // SWITCH DOWN INDICATOR return(m); }

28 Key DEBOUNCING - 2 main () { int s=1; ADPCFG = 0xFFFF; TRISB=0b11111101; PORTB=0x00; TRISE=0b000001; PORTE=0x1F; while(1) { s=function_key(); if (s==0) PORTE.F1=PORTE.F1^1; S=1; }

29 Key DEBOUNCING – 3 (SWITCH4) main () { int s=1; ADPCFG = 0xFFFF; TRISB=0b11111101; PORTB=0x00; TRISE=0b000001; PORTE=0x1F; while(1) { Delay_ms(5000); PORTB=~PORTB; s=function_key(); if (s==0) PORTE.F1=PORTE.F1^1; S=1; }

30 Key DEBOUNCING – 4 (SWITCH5 main () { int s=1; T2CON=0x8030; // Enable Timer 2 Prescaler=256 IEC0=0x0040; // Enable Interrupt for Timer 2 PR2=0xFFFF; ADPCFG = 0xFFFF; TRISB=0b11111101; PORTB=0x00; TRISE=0b000001; PORTE=0x1F; while(1) { s=function_key(); if (s==0) PORTE.F1=PORTE.F1^1; S=1; } void interrupt_T2() org 0x000020 { PORTB=PORTB^0x02; IFS0=0x0000; }

31 UART1 U1MODE = 0x8400;

32 UART1 unsigned rx1; unsigned char uc1; void main() { Uart1_Init(19200); U1MODE = 0x8400; delay_ms(200); TRISE=0b000001; PORTE=0x1F; Uart1_Write_Char('a'); while(1) { if (Uart1_Data_Ready()) { rx1 = Uart1_Read_Char(); Uart1_Write_Char(++rx1); PORTE=~PORTE; } }//~!

33

34

35 UART2 unsigned rx1; unsigned adcRes; unsigned char uc1; void main() { PORTB = 0x0000; TRISB = 0xFFFF; Uart1_Init(19200); U1MODE = 0x8400; delay_ms(200); TRISE=0b000001; PORTE=0x1F; Uart1_Write_Char('a'); while(1) { adcRes = Adc_Read(3); adcRes = adcRes/4; Uart1_Write_Char(adcRes); PORTE=~PORTE; delay_ms(1000); } }//~!

36 PWM1 U1STA = 0x8400;

37 PWM1

38 int m,p; signed char n; main () { IEC0=0x0200; // Enable Interrupt for UART 1 Rx U1MODE = 0x8400; U1STA = 0x8400; U1BRG = 51; // BRG=((16000000/19200)/16)-1 Delay_ms(100); TRISB=0b11111101; PORTB.F1=0; m=Pwm_Mc_Init(40000,1,0xFF,0x00); Pwm_MC_Set_Duty(m,2); Pwm_MC_Set_Duty(m,1); Pwm_Mc_Start(); while(1) { Delay_ms(1000); PORTB.F1=0; }

39 m=Pwm_Mc_Init(40000,1,0xFF,0x00);

40 PWM1 void interrupt_UART1() org 0x000026 { PORTB.F1=1; n=U1RXREG&0x07; switch (n) { case 1: p=-2; goto FLAG; case 2: p=-1; goto FLAG; case 3: p=1; goto FLAG; case 4: p=2; goto FLAG; default : goto END; FLAG: p=m+(m*p)/2; Pwm_MC_Set_Duty(p,1); Pwm_MC_Set_Duty(p,2); END: IFS0=0x0000; }

41 PWM2 int m,p; signed char n; main () { IEC0=0x8200; // Enable Interrupt for UART 1 Rx U1MODE = 0x8400; U1STA = 0x8400; U1BRG = 51; // BRG=((16000000/19200)/16)-1 CNEN1=0x0020; Delay_ms(100); ADPCFG = 0xFFFF; TRISB=0b11111101; PORTB.F1=0; m=Pwm_Mc_Init(40000,1,0xFF,0x00); Pwm_MC_Set_Duty(m,2); Pwm_MC_Set_Duty(m,1); Pwm_Mc_Start(); while(1) { Delay_ms(1000); PORTB.F1=0; }

42 PWM2

43 void interrupt_UART1() org 0x000026 { PORTB.F1=1; n=U1RXREG&0x07; switch (n) { case 1: p=-2; goto FLAG; case 2: p=-1; goto FLAG; case 3: p=1; goto FLAG; case 4: p=2; goto FLAG; default : goto END; FLAG: p=m+(m*p)/2; Pwm_MC_Set_Duty(p,1); Pwm_MC_Set_Duty(p,2); END: IFS0=IFS0&0b1111110111111111; } void interrupt_CN() org 0x000032 { Pwm_MC_Set_Duty(0,1); Pwm_MC_Set_Duty(0,2); IFS0=IFS0&0b011111111111; }

44 Low Frequency PWM The Indicated project settings, together with the code bellow were able to produce a 50 Hz PWM signal. int m; main () { ADPCFG = 0xFFFF; TRISE=0b11110010; TRISF=0b11111110; PORTE.F3=1; PORTB.F0=1; m=Pwm_Mc_Init(50,1,0xFF,0x00); Pwm_MC_Set_Duty(m,1); Pwm_MC_Set_Duty(m,2); Pwm_Mc_Start(); while(1) { PORTF.F0=1; }


Download ppt "C Examples 1. Download Links MPLAB IDE dsPIC30F4011/4012 Data Sheet dsPIC30F Family Reference Manual MikroC MikroC Manual MikroC Quick Reference."

Similar presentations


Ads by Google