C Examples 1

44
C Examples 1

description

C Examples 1. Download Links. MPLAB IDE dsPIC30F4011/4012 Data Sheet dsPIC30F Family Reference Manual MikroC MikroC Manual MikroC Quick Reference. This step necessary if you are using an RS-232 programmer. This step necessary if you are using an RS-232 programmer. - PowerPoint PPT Presentation

Transcript of C Examples 1

Page 1: C Examples 1

C Examples 1

Page 2: C Examples 1

Download Links

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

Page 3: C Examples 1

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

Page 4: C Examples 1
Page 5: C Examples 1
Page 6: C Examples 1

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

the program to run after successfully programming

Page 7: C Examples 1
Page 8: C Examples 1
Page 9: C Examples 1

LED ON

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

Page 10: C Examples 1

Rapid40iXL

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

Page 11: C Examples 1

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; } }

Page 12: C Examples 1

Blinking LED - 2

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

Page 13: C Examples 1
Page 14: C Examples 1

Logical VS Bitwise

Page 15: C Examples 1

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<13>) 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.

Page 16: C Examples 1
Page 17: C Examples 1

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; }

62500256

000,000,16

500,624240

f

xF

Page 18: C Examples 1
Page 19: C Examples 1
Page 20: C Examples 1
Page 21: C Examples 1
Page 22: C Examples 1

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; }

Page 23: C Examples 1

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

Page 24: C Examples 1

Key DEBOUNCING

Page 25: C Examples 1

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

Page 26: C Examples 1

Key DEBOUNCING - 1

;SWITCH2.c,13 :: while (i < Twentyms) $0120 $ L_main_2: $0120 $470060 ADD W14, #0, W0 $0122 $780110 MOV [W0], W2 $0124 $210721 MOV #4210, W1 $0126 $510001 SUB W2, W1, W0 $0128 $3D000D BRA GE L_main_3, L_main_3 ;SWITCH2.c,15 :: if (0 == PORTE.F0) // Button Down/Start over $012A $8016D0 MOV PORTE, W0 $012C $6000E1 AND W0, #1, W1 $012E $108060 SUBR W1, #0, W0 $0130 $3A0004 BRA NZ L_main_4, L_main_4 ;SWITCH2.c,17 :: i = 0; $0132 $200000 MOV #0, W0 $0134 $780F00 MOV W0, [W14] ;SWITCH2.c,18 :: } $0136 $040140 GOTO L_main_5 $013A $ L_main_4: ;SWITCH2.c,21 :: i = i + 1; $013A $200011 MOV #1, W1 $013C $470060 ADD W14, #0, W0 $013E $408810 ADD W1, [W0], [W0] ;SWITCH2.c,22 :: } // $0140 $ L_main_5: ;SWITCH2.c,23 :: } // $0140 $040120 GOTO L_main_2

091,29T(ms)

20msN

0.0006875f

1T(ms)

4551,454,545.11

000,000,16

f

Page 27: C Examples 1

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); }

Page 28: C Examples 1

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; } }

Page 29: C Examples 1

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; } }

Page 30: C Examples 1

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; }

Page 31: C Examples 1

UART1

U1MODE = 0x8400;

Page 32: C Examples 1

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; } } }//~!

Page 33: C Examples 1
Page 34: C Examples 1
Page 35: C Examples 1

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); } }//~!

Page 36: C Examples 1

PWM1

U1STA = 0x8400;

Page 37: C Examples 1

PWM1

Page 38: C Examples 1

PWM1

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; } }

Page 39: C Examples 1

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

Page 40: C Examples 1

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; } }

Page 41: C Examples 1

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; } }

Page 42: C Examples 1

PWM2

Page 43: C Examples 1

PWM2

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; }

Page 44: C Examples 1

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; } }