main.c


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
}