1 | #define FCY 40000000
|
2 |
|
3 | // Includes
|
4 |
|
5 | #include <p24HJ128GP306.h>
|
6 | #include <libpic30.h>
|
7 | #include <spi.h>
|
8 | #include <timer.h>
|
9 |
|
10 |
|
11 |
|
12 | // Configuration
|
13 |
|
14 | _FBS(RBS_NO_BOOT_RAM & BSS_NO_BOOT_CODE & BWRP_WRPROTECT_OFF); // Boot Segment
|
15 | _FSS(RSS_NO_SEC_RAM & SSS_NO_SEC_CODE & SWRP_WRPROTECT_OFF); // Secure Segment
|
16 | _FGS(GSS_OFF & GCP_OFF & GWRP_OFF); // Code/Write Protect
|
17 | _FOSCSEL(FNOSC_PRIPLL & IESO_OFF); // Oscillator
|
18 | _FOSC(FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMD_XT); // Clock
|
19 | _FWDT(FWDTEN_OFF & WINDIS_OFF); // Watchdog
|
20 | _FPOR(FPWRT_PWR1); // Power-on Reset Value
|
21 | //_FICD(BKBUG_OFF & COE_OFF & JTAGEN_OFF & ICS_PGD1); // Register FICD (with debugger)
|
22 | _FICD(BKBUG_OFF & COE_ON & JTAGEN_OFF & ICS_NONE); // Register FICD (without debugger)
|
23 |
|
24 |
|
25 | unsigned char SPIsegment[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};
|
26 | unsigned int config1, config2, config3;
|
27 | unsigned int x, min, sec, hun;
|
28 |
|
29 |
|
30 | void __attribute__((__interrupt__)) _T1Interrupt(void) {
|
31 | hun++;
|
32 | if (hun > 99) {
|
33 | hun = 0;
|
34 | sec++;
|
35 | }
|
36 | if (sec > 59) {
|
37 | sec = 0;
|
38 | min++;
|
39 | }
|
40 | if (min > 99) {
|
41 | min = 0;
|
42 | }
|
43 | SPI1BUF = SPIsegment[min/10];
|
44 | while(SPI1STATbits.SPITBF);
|
45 | SPI1BUF = SPIsegment[min%10] | 0x80;
|
46 | while(SPI1STATbits.SPITBF);
|
47 | SPI1BUF = SPIsegment[sec/10];
|
48 | while(SPI1STATbits.SPITBF);
|
49 | SPI1BUF = SPIsegment[sec%10] | 0x80;
|
50 | while(SPI1STATbits.SPITBF);
|
51 | SPI1BUF = SPIsegment[hun/10];
|
52 | while(SPI1STATbits.SPITBF);
|
53 | SPI1BUF = SPIsegment[hun%10];
|
54 | while(SPI1STATbits.SPITBF);
|
55 | __delay32(200);
|
56 | LATFbits.LATF2 = 1;
|
57 | __delay32(10);
|
58 | LATFbits.LATF2 = 0;
|
59 | IFS0bits.T1IF = 0; /* Clear Timer interrupt flag */
|
60 | }
|
61 |
|
62 | // Main Function
|
63 | int main (void) {
|
64 |
|
65 | CLKDIV = 0x0400; // sets Fosc to 80MHz
|
66 | PLLFBD = 38; // resp. Fcy = 40MIPS
|
67 |
|
68 | TRISB = 0x0000; // 1 = Input 0 = Ouput
|
69 | TRISF = 0x0000;
|
70 | LATB = 0xFFFF;
|
71 |
|
72 | // configure SPI1
|
73 | config1 = ENABLE_SCK_PIN &
|
74 | ENABLE_SDO_PIN &
|
75 | SPI_MODE16_OFF &
|
76 | SPI_SMP_OFF &
|
77 | SPI_CKE_ON &
|
78 | SLAVE_ENABLE_OFF &
|
79 | CLK_POL_ACTIVE_HIGH &
|
80 | MASTER_ENABLE_ON &
|
81 | SEC_PRESCAL_8_1 &
|
82 | PRI_PRESCAL_1_1;
|
83 | config2 = FRAME_ENABLE_OFF &
|
84 | FRAME_SYNC_OUTPUT &
|
85 | FRAME_POL_ACTIVE_LOW &
|
86 | FRAME_SYNC_EDGE_COINCIDE;
|
87 | config3 = SPI_ENABLE &
|
88 | SPI_IDLE_CON &
|
89 | SPI_RX_OVFLOW_CLR;
|
90 | OpenSPI1(config1, config2, config3);
|
91 |
|
92 | // Configure Timer1
|
93 | OpenTimer1(T1_ON & T1_IDLE_CON & T1_GATE_OFF & T1_PS_1_64 & T1_SYNC_EXT_OFF & T1_SOURCE_INT, 6250);
|
94 | ConfigIntTimer1(T1_INT_PRIOR_1 & T1_INT_ON); // -> IFS0bits.T1IF
|
95 |
|
96 |
|
97 | min = 0;
|
98 | sec = 0;
|
99 | hun = 0;
|
100 | x = 0;
|
101 |
|
102 |
|
103 | while(1) {
|
104 | LATB = 0x0001<<(hun/25);
|
105 | __delay32(1000);
|
106 | // __delay32(10000000); // 250ms
|
107 | // __delay_ms(250); //does not work see ASM-listing
|
108 |
|
109 | }
|
110 | }
|