View difference between Paste ID: su7f0iV1 and NQ2V5gBw
SHOW: | | - or go back to the newest paste.
1
// PIC18F4520 Configuration Bit Settings
2
#pragma config OSC = XT // Oscillator Selection bits (XT oscillator)
3
#pragma config LVP = OFF // Single-Supply ICSP Enable
4
#pragma config WDT = OFF // Watchdog Timer Enable bit
5
#include <xc.h>
6
#include <stdlib.h>
7
#define _XTAL_FREQ 4000000
8
 
9
 
10
/*
11
 KEY A = 440.00Hz
12
 T2CON = 0b00000111;
13
 PR2 = 140 With prescale of 16*
14
 CCPR1L = 0b01000110;
15
 CCP1CON = 0b00101111;
16
 
17
 KEY B = 493.88Hz
18
 T2CON = 0b00000111;
19
 PR2 = 125 with prescale of 16
20
 CCPR1L = 0b00111111;
21
 CCPR1CON = 0b00001111;
22
  
23
 KEY G = 392.00Hz
24
 T2CON = 0b00000111;
25
 PR2 = 158 with prescale of 16
26
 CCPR1L = 0b01001111;
27
 CCP1CON = 0b00101111;
28
 
29
 KEY E = 329.63Hz
30
 T2CON = 0b00000111;
31
 PR2 = 188 with prescale of 16
32
 CCPR1L = 0b01011110;
33
 CCP1CON = 0b00101111;
34
 
35
 
36
 KEY F sharp = 369.99Hz
37
 T2CON = 0b00000111;
38
 PR2 = 167
39
 CCPR1L = 0b01010100;
40
 CCP1CON = 0b00101111;
41
 
42
 Key E5 = 659.25Hz
43
 T2CON = 0b00000111;
44
 PR2 = 94
45
 CCPR1L = 0b00101111;
46
 CCP1CON = 0b00101111;
47
 
48
 Key D5 = 587.33Hz
49
 T2CON = 0b00000111;
50
 PR2 = 105
51
 CCPR1L = 0b00110101;
52
 CCP1CON = 0b00001111;
53
 
54
 Key B5 = 987.77Hz
55
 T2CON = 0b00000111;
56
 PR2 = 62
57
 CCPR1L = 0b00011111;
58
 CCP1CON = 0b00101111;
59
 
60
 Key A5 = 880Hz
61
 T2CON = 0b00000111;
62
 PR2 = 69;
63
 CCPR1L = 0b00100011;
64
 CCP1CON = 0b00001111;
65
 
66
 Key F#5 = 739.99Hz
67
 T2CON = 0b00000111;
68
 PR2 = 83;
69
 CCPR1L = 0b00101010;
70
 CCP1CON = 0b00001111;
71
 
72
 Key E5 = 659.25Hz
73
 T2CON = 0b00000111;
74
 PR2 = 93;
75
 CCPR1L = 0b00101111;
76
 CCP1CON = 0b00001111;
77
 
78
 Key G5 = 789.99Hz
79
 T2CON = 0b00000111;
80
 PR2 = 78;
81
 CCPR1L = 0b00100111;
82
 CCP1CON = 0b00101111;
83
 
84
 Key F5 =  698.46Hz
85
 T2CON = 0b00000111;
86
 PR2 = 88;
87
 CCPR1L = 0b00101100;
88
 CCP1CON = 0b00101111;
89
 
90
 
91
 */
92
 
93
void interrupt highISR(void);
94
void delay (unsigned int len);
95
96
unsigned char pr2 [27] = {140, 125, 140, 158, 188, 167, 158, 140, 94, 105, 125, 62, 69, 78, 83, 93,
97
                            69, 78, 83, 62, 69, 78, 83, 93, 83, 93, 78};
98
unsigned char dutyCycleCCPR1L [27] = {0b01000110, 0b00111111, 0b01000110, 0b01001111, 0b01011110, 0b01010100,
99
                                      0b01001111, 0b01000110, 0b00101111, 0b00110101, 0b00111111, 0b00011111,
100
                                      0b00100011, 0b00100111, 0b00101010, 0b00101111, 0b00100011, 0b00100111,
101
                                      0b00101010, 0b00011111, 0b00100011, 0b00100111, 0b00101010, 0b00101111,
102
                                      0b00101010, 0b00101111, 0b00100111};
103
104
unsigned char dutyCycleCCP1CON[27] = {0b00101111, 0b00001111, 0b00101111, 0b00101111, 0b00101111, 0b00101111, 0b00101111,
105
                                      0b00101111, 0b00101111, 0b00001111, 0b00001111, 0b00101111, 0b00001111, 0b00101111,
106
                                      0b00001111, 0b00001111, 0b00001111, 0b00101111, 0b00001111, 0b00101111, 0b00001111,
107
                                      0b00101111, 0b00001111, 0b00001111, 0b00001111, 0b00001111, 0b00101111};
108
109
unsigned int delayTimings[27] = {300, 300, 500, 700, 1000, 1000, 1000, 1000, 1000, 1000, 1400/*32PRESCALE*/, 250, 250, 300, 250, 700,
110
                                  250, 250, 700, 500, 300, 300, 700, 500, 500, 500, 1000};
111
112
unsigned char tmr0HByte[27] = {0xB6, 0xB6, 0x85, 0x55, 0x0B,0x0B,0x0B,0x0B,0x0B,0x0B, 0x55/*32PRESCALE*/,
113
                               0xC2,0xC2,0xB6, 0xC2,0x55,0xC2,0xC2,0x55,0x85,0xB6,0xB6,0x55,0x85,0x85,0x85,
114
                                0x0B};
115
unsigned char tmr0LByte[27] = {0xC2, 0xC2, 0xEE, 0x1A, 0xDC,0xDC,0xDC,0xDC,0xDC,0xDC, 0x1A/*32PRESCALE*/,
116
                               0xF7,0xF7, 0xC2,0xF7,0x1A,0xF7,0xF7,0x1A,0xEE,0xC2,0xC2,0x1A,0xEE,0xEE,0xEE,
117
                               0xDC};
118
119
unsigned char tmr0CON[27] = {0b10000011,0b10000011,0b10000011,0b10000011,0b10000011,0b10000011,0b10000011,0b10000011,0b10000011,0b10000011,0b10000100,
120
                             0b10000011,0b10000011,0b10000011,0b10000011,0b10000011,0b10000011,0b10000011,0b10000011,0b10000011,0b10000011,0b10000011,
121
                             0b10000011,0b10000011,0b10000011,0b10000011,0b10000011};
122
123
unsigned int i = 0;
124
unsigned int x = 0;
125
 
126
void main ()
127
{
128
ADCON1 = 0x0F;  
129
INTCONbits.GIEH = 0; // disables all interrupts
130
RCONbits.IPEN = 1; // IPEN
131
INTCON2bits.TMR0IP = 1; // high priority
132
TMR0H = 0x00;
133
TMR0L = 0x00;
134
TRISC = 0b11111011; // Configure RC2 (CCP1) as output
135
136
    TMR0H = tmr0HByte[i];
137
    TMR0L = tmr0LByte[i];
138
    T0CON = tmr0CON[i];
139
    INTCONbits.TMR0IF = 0;
140
    INTCONbits.TMR0IE = 1;
141
    INTCONbits.GIEH = 1;
142-
    i++;
142+
    while(x<27); // Do nothing, until all tones played
143
144
}
145
146
void interrupt highISR(void){
147
    if(INTCONbits.TMR0IF)
148
    {
149
        T2CON = 0b00000111;   //But
150
        PR2 = pr2[x]; 
151
        CCPR1L = dutyCycleCCPR1L[x]; // in array
152
        CCP1CON =  dutyCycleCCP1CON[x];
153
        INTCONbits.TMR0IF = 0;
154
        x++;
155
    }
156
}