/
octet.c
288 lines (263 loc) · 7.85 KB
/
octet.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
#include <msp430F1611.h>
/*------]]]]-------------------------------------------
MSP430G2553
-----------------
3.3 V -->|Vcc Gnd |<-- Ground
| |
Unused -->|P2.0 P2.7|--> Unused
| |
Rx -->|P2.1 P2.6|--> Unused
| |
Tx <--|P2.2 TST |--> Open
| |
BLANK <--|P2.3 RST |<-- Pulled high
| |
GSLK <--|P2.4 P2.7|--> SIN
| |
SCLK <--|P2.5 P2.6|--> XLAT
| |
sin_595 <--|P2.0 P2.5|<-- Button6
| |
sclk_595 <--|P2.1 P2.4|<-- Button5
| |
latch_595 <--|P2.2 P2.3|<-- Button4
-----------------
-------------------------------------------------*/
#define SIN BIT7
#define GSCLK BIT4
#define XLAT BIT6
#define BLANK BIT3
#define SCLK BIT5
#define TX BIT2
#define SIN595 BIT0
#define SCLK595 BIT1
#define LTCH595 BIT2
#define N_col 16
#define N_row 8
#define N_layer 8
#define N_level_bits 2 //0,25%,50%,100%
#define arr_collsize N_col*N_level_bits/8
//flag defines
#define COL_written 0x01
#define MAT_written 0x02
#define RX_occured 0x04
unsigned char strobe=0;
char stat_read=0;
char rx_x=0,rx_y=0;
char button_stat=0x00;//button status variable reset on reading 'K'
/*
void conv_ascii(int val,char *asc_val)//function to convert in to a set of ascii char to be read by >> in Cpp program(max val=1024)
{
int i=0;
for(i=0;val>=1000;i++)
val-=1000;
asc_val[0]=(char)(i+48);
for(i=0;val>=100;i++)
val-=100;
asc_val[1]=(char)(i+48);
for(i=0;val>=10;i++)
val-=10;
asc_val[2]=(char)(i+48);
for(i=0;val>=1;i++)
val-=1;
asc_val[3]=(char)(i+48);
}
void serial_println_8(char val)
{
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?
UCA0TXBUF = val;
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?
UCA0TXBUF = '\r';
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?
UCA0TXBUF = '\n';
}
*/
#define CLOCK_PERIOD 4 //time period for a PWM pulse
int PWMCount = 0; // Counter for GSCLK pulse
char rx_temp;
unsigned char disp_arr[N_layer][2][N_row];
unsigned char flag=0;
void ConfigureTimer(void);
void InitializeClocks(void);
void SendData(char col_no);
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
char i=0,j=0,rx_i=0,rx_j=0,layer_no,row_no=0;
rx_temp=0;
flag=0;
for(j=0;j<N_layer;++j)
for(i=0;i<arr_collsize;++i)
{disp_arr[j][i][0]=0xFF;
disp_arr[j][i][1]=0xAA;
disp_arr[j][i][2]=0x55;
disp_arr[j][i][3]=0x00;
disp_arr[j][i][4]=0xFF;
disp_arr[j][i][5]=0xAA;
disp_arr[j][i][6]=0x55;
disp_arr[j][i][7]=0x00;
}
P1DIR=0xFF;
P1OUT=0xFF;
//TLC initialization
P2DIR = 0;
P2DIR |= (SIN + SCLK + XLAT + BLANK + GSCLK);
P2OUT = (SIN + SCLK + XLAT + BLANK + GSCLK);
P2OUT=0;
//Shift 595 initialization
P2DIR |= (SIN595 + SCLK595 + LTCH595);
P2OUT = 0;
//UART
P3DIR= 0X40;
P3SEL |= 0xC0; // P3.6,7 = USART1 TXD/RXD
ME2 |= UTXE1 + URXE1; // Enable USART1 TXD/RXD
UCTL1 |= CHAR; // 8-bit character
UTCTL1 |= SSEL0; // UCLK = smCLK
UBR01 = 0x03; // 32k/9600 - 3.41
UBR11 = 0x00; //
UMCTL1 = 0x4A; // Modulation
UCTL1 &= ~SWRST; // Initialize USART state machine
IE2 |= URXIE1; // Enable USART1 RX interrupt
//SendData(0); // Clear all output
InitializeClocks(); // Setup clock
ConfigureTimer(); // Setup Timer to generate GSCLK
// IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt
_bis_SR_register(GIE);
while (1)
{//for(i=0;i<wave_delay;++i)
P1OUT=~(1<<layer_no);
for(layer_no=0;layer_no<N_layer;layer_no++)
{
SendData(layer_no); // Send current Step data to TLC5940
_bis_SR_register(LPM0_bits + GIE); // Enter LPM0, enable interrupts
P1OUT=~(1<<layer_no);
}
//PUT MODS HERE
/*
if(strobe=='D')
{
rx_x=4;
rx_y=32;
serial_println_8('Z');
strobe=0;}
if(strobe=='S')
{
rx_x=0;
rx_y=0;
serial_println_8('K');
strobe=0;
}
}
*/
// _delay_cycles(100000);
/*
for(j=0;j<N_layer;++j)
for(i=0;i<arr_collsize;++i)
{rx_temp=disp_arr[j][i][0];
disp_arr[j][i][0]=disp_arr[j][i][1];
disp_arr[j][i][1]=disp_arr[j][i][2];
disp_arr[j][i][2]=disp_arr[j][i][3];
disp_arr[j][i][3]=disp_arr[j][i][4];
disp_arr[j][i][4]=disp_arr[j][i][5];
disp_arr[j][i][5]=disp_arr[j][i][6];
disp_arr[j][i][6]=disp_arr[j][i][7];
disp_arr[j][i][7]=rx_temp;
}*/
}
}
void SendData(char layer)
{
char i=0,temp,col_no=0;
P2OUT &= ~(SCLK + XLAT + BLANK);
for(col_no=0;col_no<8;++col_no)
for (i = 0; i < N_row; i++)
{ // Send data for each channel, CH15 first
temp=((disp_arr[layer][col_no>>2][i])<<((col_no&0x03)<<1));
P2OUT&=~(SIN);
P2OUT|=SCLK; //11
P2OUT&=~(SCLK);
P2OUT|=SCLK; //10
P2OUT&=~(SCLK);
P2OUT|=SCLK; //9
P2OUT&=~(SCLK);
P2OUT|=SCLK; //8
P2OUT&=~(SCLK);
P2OUT|=SCLK; //7
P2OUT&=~(SCLK);
P2OUT|=SCLK; //6
P2OUT&=~(SCLK);
P2OUT|=SCLK; //5
P2OUT&=~(SCLK);
P2OUT|=SCLK; //4
P2OUT&=~(SCLK);//8th bit onwards
P2OUT|=SCLK; //3
P2OUT&=~(SCLK); // Send duty bits, 12-bit, MSB first
P2OUT|=SCLK; //2
P2OUT&=~(SCLK);
P2OUT|=SIN&temp;
P2OUT|=SCLK; //1
P2OUT&=~(SCLK);
// P2OUT|=SIN; //test high
P2OUT&=~(SIN);
P2OUT|=SIN&(temp<<1);
// P2OUT|=SIN; //test high
P2OUT|=SCLK; //0
P2OUT&=~(SCLK);
}
flag|=COL_written;
}
void InitializeClocks(void)
{
;//BCSCTL1|= RSEL0+RSEL1+RSEL2;
//DCOCTL|= DCO0+DCO1+DCO2;
}
void ConfigureTimer(void)
{
TACTL = TASSEL_2 | MC_0 | TACLR; // TACLK = SMCLK, Up mode, reset count
TACCR0 = 80; // Timer Frequency
// TACCTL0 = CCIE; // Trigger Interrupt whenever Timer reach TACCR0
TACTL = TASSEL_2 | MC_1+TAIE; // TACLK = SMCLK, Up mode
}
#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A1(void)
{
// Pulse GSCLK
P2OUT |= GSCLK;
P2OUT &= ~GSCLK;
// pulse BLANK to restart PWM cycle when GSCLK pulse reach max count
if (++PWMCount >= CLOCK_PERIOD)
{
if(flag&COL_written)
{P2OUT |= BLANK;
P2OUT |= XLAT;
P2OUT &= ~(XLAT);
P2OUT &= ~(BLANK);
P2OUT |= SCLK;
P2OUT &= ~SCLK;
flag&=~(COL_written);
_bic_SR_register_on_exit(LPM0_bits);}
else
{P2OUT |= BLANK;
P2OUT &= ~(BLANK);}
PWMCount = 0;
}
TA0CTL &= ~TAIFG;
}
/*
void send_uart(char command)
{
while (!(IFG2 & UTXIFG1)); // USART1 TX buffer ready?
TXBUF1 = command; // command to TXBUF0
}
void recieve()
{ send_uart('0');
stat_read=0;
_BIS_SR(CPUOFF + GIE); // Enter LPM3 w/ interrupt
}
*/
#pragma vector=USART1RX_VECTOR
__interrupt void usart1_rx (void)
{ flag=0;
stat_read=RXBUF1;
__bic_SR_register_on_exit(CPUOFF);
}