Created
December 9, 2014 12:30
-
-
Save VEINHORN/17349b9dfd5de3d92030 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Ìåñòî èíäèêàöèè - Ëåâûé âåðõíèé óãîë | |
Îðèåíòàöèß (ïîâîðîò) òåêñòà - 180 ãðàäóñîâ | |
Çåðêàëüíîå îòðàæåíèå - âåðòèêàëüíî, òîëüêî ñèìâîëû | |
Îñü èçìåðåíèé àêñåëåðîìåòðà - Z | |
*/ | |
#include "msp430f5529.h" | |
#define BUTTON 7 //PORT1 | |
#define ACCEL_PWR 6 //PORT3 | |
#define ACCEL_CS 5 //PORT3 | |
#define ACCEL_SOMI 4 //PORT3 | |
#define ACCEL_SIMO 3 //PORT3 | |
#define ACCEL_SCK 7 //PORT2 | |
#define ACCEL_INT 5 //PORT2 | |
#define REVID 0x01 // ASIC version | |
#define CTRL 0x02 // Control register | |
#define DOUTX 0x06 // X channel data register | |
#define DOUTY 0x07 // Y channel data register | |
#define DOUTZ 0x08 // Z channel data register | |
#define G_RANGE_2 0x80 // 8g range | |
#define I2C_DIS 0x10 // I2C denied | |
#define MEASURE_MODE_400 0x04 // Move detecting, 10Hz | |
#define LCD_SIMO 1 //PORT4 | |
#define LCD_SCLK 3 //PORT4 | |
#define LCD_CS 4 //PORT7 | |
#define LCD_RST 7 //PORT5 | |
#define LCD_CD 6 //PORT5 | |
#define LCD_BL 6 //PORT7 | |
#define SET_SCROLL_LINE 0x40 // Start scrolling line (0...63) Ñ without scrolling (after reset = 0) | |
#define SET_SEG_REVERSE 0xA1 // Mirror mode for column addressing | |
#define SET_SEG_NORMAL 0xA0 // Normal mode for column addressing | |
#define SET_COM_REVERSE 0xC8 // Mirror mode for line addressing | |
#define SET_COM_NORMAL 0xC0 // Normal mode for line addressing | |
#define SET_POWER_CONTROL 0x2F // Powering up amplifier, repeater and controller (after reset = 0) | |
#define SET_DISPLAY_ENABLE 0xAF // Display On | |
#define ZERO_PAGE_ADDRESS 0xB0 // 1011 | |
#define ZERO_LSB_COLUMN_ADDR 0x00 | |
#define ZERO_MSB_COLUMN_ADDR 0x10 | |
#define NUMBER_OF_PAGES 8 | |
#define NUMBER_OF_COLUMNS 102 | |
void dogs102SPI(unsigned char data); | |
char cma3000SPI(unsigned char address, unsigned char data, unsigned char rw); | |
void initLCD(); | |
void clearLCD(); | |
void printDefaultString(); | |
unsigned char reverseFlag = 0; | |
unsigned char digits[] = | |
{ | |
126,129,129,126, //0 | |
4, 2, 255, 0, //1 | |
194, 161, 145, 142, //2 | |
66, 137, 137, 118, //3 | |
48, 44, 34, 255, //4 | |
76, 139, 137, 113, //5 | |
126, 145, 137, 114, //6 | |
1, 225, 29, 3, //7 | |
118, 137, 137, 118, //8 | |
78, 145, 137, 126, //9 | |
}; | |
unsigned char defaultString[] = | |
{ | |
129, 102, 24, 24, 102, 129, 0, 0, //X | |
195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 0, 0, //= | |
126,129,129,126, //0 | |
192,192, //. | |
126,129,129,126, //0 | |
126,129,129,126, //0 | |
126,129,129,126, //0 | |
0,0, //space | |
158,161,146,127 //g | |
}; | |
unsigned char digitPosition[] = {20, 26, 30, 34}; | |
#define DIGIT_LEN 4 | |
#define STRING_LEN sizeof(defaultString) | |
int accelerationBitLevel[] = {18, 36, 71, 143, 286, 571, 1142}; | |
int main( void ) | |
{ | |
WDTCTL = WDTPW + WDTHOLD; | |
P1OUT |= (1 << BUTTON); // Enable pull up resistor for button | |
P1REN |= (1 << BUTTON); | |
P1IES |= (1 << BUTTON); // Interrupt generate with high to low transition | |
P1IE |= (1 << BUTTON); | |
P2IE |= (1 << ACCEL_INT); // Interrupts enabled | |
P3DIR |= (1 << ACCEL_CS); // Choosing device | |
P3OUT |= (1 << ACCEL_CS); | |
P3DIR |= (1 << ACCEL_PWR); // Voltage | |
P3OUT |= (1 << ACCEL_PWR); | |
P3SEL |= (1 << ACCEL_SOMI); // Line data reception by SPI interface | |
P3SEL |= (1 << ACCEL_SIMO); // Line data transmitting by SPI interface | |
P2SEL |= (1 << ACCEL_SCK); // Synch-signal | |
P7DIR |= (1 << LCD_CS) | (1 << LCD_BL); // Choosing device and enable the backlight | |
P5DIR |= (1 << LCD_RST) | (1 << LCD_CD); // Reset and Data mode (0 - command) | |
P7OUT |= (1 << LCD_CS) | (1 << LCD_BL); // Power on (Step #1 for LCD Powering Up) | |
P4SEL |= (1 << LCD_SIMO) | (1 << LCD_SCLK); // SIMO data and Synch-signal | |
// RST = 0 (by default) (Step #2 for LCD Powering Up) | |
// Reset display | |
__delay_cycles(1100); // Wait at least 1 ms (Step #3 for LCD Powering Up) | |
P5OUT |= (1 << LCD_RST); // Set RST to 1 (Step #4 for LCD Powering Up) | |
__delay_cycles(5500); // Wait at least 5 ms (Step #5 for LCD Powering Up) | |
// SPI settings for accelerometer | |
UCA0CTL1 |= UCSWRST; // Enable possibility to changes for first channel of USCI_A // ??????? | |
UCA0CTL0 |= UCSYNC | UCMST | UCMSB | UCCKPH; // Synch mode, Master, MSB, change on second differential and capture on first | |
UCA0CTL1 |= UCSWRST | UCSSEL__SMCLK; // Choose source - SMCLK | |
UCA0BR0 = 0x30; // Master transmit speed | |
UCA0BR1 = 0; // Slave transmit speed | |
UCA0CTL1 &= ~UCSWRST; // Disable possibility to change | |
// SPI settings for LCD | |
UCB1CTL1 |= UCSWRST; // Same algorithm for USCI_B | |
UCB1CTL0 |= UCSYNC | UCMST | UCMSB | UCCKPH; // For LCD only those features can be set | |
UCB1CTL1 |= UCSWRST | UCSSEL__SMCLK; | |
UCB1BR0 = 0x30; | |
UCB1BR1 = 0; | |
UCB1CTL1 &= ~UCSWRST; | |
__delay_cycles(132000); // Wait at least 120 ms (Step #6 for LCD Powering Up) | |
// Display settings | |
initLCD(); | |
clearLCD(); | |
// Accelerometer settings | |
cma3000SPI(REVID,0,0); | |
__delay_cycles(25); // Delay between SPI cycles (~22ms) | |
cma3000SPI(CTRL, G_RANGE_2 | I2C_DIS | MEASURE_MODE_400, 1); // 8G range, I2C denied, Move detecting (10Hz) | |
__delay_cycles(25); // Delay between SPI cycles (~22ms) | |
printDefaultString(); | |
_EINT(); | |
while(1); | |
return 0; | |
} | |
void dogs102SPI(unsigned char data) | |
{ | |
while(!(UCB1IFG & UCTXIFG)); // Wait until TXBUF is ready to receive data | |
P7OUT &= ~(1 << LCD_CS); // Choosing devise disable | |
UCB1TXBUF = data; // Send data to BUF | |
while(UCB1STAT & UCBUSY); // Wait until USCI_A0 SPI interface is no longer busy | |
P7OUT |= (1 << LCD_CS); // Choose devise | |
} | |
// NOTE: UCT - ïåðåäàò÷èê | |
// UCR - ïðèÞìíèê | |
// êñåëåðîìåòð âñåãäà ðàáîòàåò â âåäîìîì ðåæèìå | |
char cma3000SPI(unsigned char address, unsigned char data, unsigned char rw) | |
{ | |
address = address << 2; | |
if(rw == 1) // If write | |
address |= 2; // Control register | |
char receiveData; | |
P3OUT &= ~(1 << ACCEL_CS); // Disable choosing device | |
receiveData = UCA0RXBUF; // Read data | |
while(!(UCA0IFG & UCTXIFG)); // Wait until TXIFG == TXBUF is ready for new data | |
UCA0TXBUF = address; // Start SPI transmit | |
while(!(UCA0IFG & UCRXIFG)); // Wait until RXIFG == RXBUF have new data | |
receiveData = UCA0RXBUF; | |
while(!(UCA0IFG & UCTXIFG)); // Wait until TXIFG == TXBUF is ready for new data | |
UCA0TXBUF = data; // Start SPI transmit | |
while(!(UCA0IFG & UCRXIFG)); // Wait until RXIFG == RXBUF have new data | |
receiveData = UCA0RXBUF; | |
while(UCA0STAT & UCBUSY); // Wait until USCI_A0 SPI interface is no longer busy | |
P3OUT |= (1 << ACCEL_CS); // Choose device | |
return receiveData; | |
} | |
void initLCD() | |
{ | |
P5OUT &= ~(1 << LCD_CD); // Command mode | |
dogs102SPI(SET_POWER_CONTROL); // Powering up amplifier, repeater and controller | |
dogs102SPI(SET_DISPLAY_ENABLE); // Display On | |
dogs102SPI(SET_SCROLL_LINE); // Without scrolling | |
dogs102SPI(SET_SEG_REVERSE); // Mirror mode for column addressing | |
dogs102SPI(SET_COM_NORMAL); // Normal mode for line addressing | |
P5OUT |= (1 << LCD_CD); // Return data mode | |
} | |
void clearLCD() | |
{ | |
unsigned char i = 0; | |
unsigned char j = 0; | |
for(i = 0; i < NUMBER_OF_PAGES; i++) | |
{ | |
P5OUT &= ~(1 << LCD_CD); // Command mode | |
dogs102SPI(ZERO_PAGE_ADDRESS + i); | |
dogs102SPI(ZERO_LSB_COLUMN_ADDR); | |
dogs102SPI(ZERO_MSB_COLUMN_ADDR); | |
P5OUT |= (1 << LCD_CD); // Return data mode | |
for(j = 0; j < NUMBER_OF_COLUMNS; j++) | |
dogs102SPI(0); | |
} | |
} | |
void printDefaultString() | |
{ | |
unsigned char i =0; | |
P5OUT &= ~(1 << LCD_CD); // Command mode | |
dogs102SPI(ZERO_PAGE_ADDRESS); // Last page | |
char temp = 0; // Set start position~ | |
// char temp = NUMBER_OF_COLUMNS - STRING_LEN; // Set start position~ | |
dogs102SPI(ZERO_LSB_COLUMN_ADDR + (temp & 0x0F)); // Set start column for MSB~ | |
dogs102SPI(ZERO_MSB_COLUMN_ADDR + (temp >> 4)); // Set start column for LSB | |
P5OUT |= (1 << LCD_CD); // Return data mode | |
if(reverseFlag == 1) | |
for(i = STRING_LEN; i > 0; i--) // Print string | |
dogs102SPI(defaultString[i]); | |
else | |
for(i = 0; i < STRING_LEN; i++) // Print string | |
dogs102SPI(defaultString[i]); | |
} | |
#pragma vector = PORT2_VECTOR | |
__interrupt void PORT2_ISR(void) | |
{ | |
P2IE &= ~(1 << ACCEL_INT); // Interrupts disabled | |
int dx = 0; | |
int temp2; | |
char temp; | |
temp = cma3000SPI(DOUTZ,0,0); | |
__delay_cycles(25); // Delay between SPI cycles (~22ms) | |
unsigned char i = 0; | |
for(i = 0; i < 7; i++) // 7 significant digits in binary number | |
{ | |
if((temp >> i) & 1) | |
dx += accelerationBitLevel[i]; | |
} | |
i = 0; | |
for(i = 0; i < 4; i++) // 4 significant digits in decimal number | |
{ | |
unsigned char j = 0; | |
temp2 = dx / 10; | |
temp2 = dx - temp2 * 10; | |
for(j = 0; j < DIGIT_LEN; j++) | |
defaultString[digitPosition[3 - i] + j] = digits[DIGIT_LEN * temp2 + j]; | |
dx /= 10; | |
} | |
printDefaultString(); | |
P2IE |= (1 << ACCEL_INT); | |
__delay_cycles(500000); | |
//P2IFG &= ~(1 << ACCEL_INT); | |
} | |
#pragma vector=PORT1_VECTOR | |
__interrupt void Port_1(void) | |
{ | |
P1IE &= ~(1 << BUTTON); // Disable interrupt from button | |
__delay_cycles(50000); | |
if(!(P1IN & (1 << BUTTON))) | |
{ | |
P5OUT &= ~(1 << LCD_CD); | |
if(reverseFlag == 0) | |
{ | |
//dogs102SPI(SET_SEG_REVERSE); | |
//dogs102SPI(SET_COM_REVERSE); | |
//dogs102SPI(SET_SCROLL_LINE + 56); | |
reverseFlag = 1; | |
} | |
else | |
{ | |
//dogs102SPI(SET_SEG_NORMAL); | |
//dogs102SPI(SET_COM_NORMAL); | |
//dogs102SPI(SET_SCROLL_LINE); | |
reverseFlag = 0; | |
} | |
P5OUT |= (1 << LCD_CD); | |
} | |
P1IE = (1 << BUTTON); | |
P1IFG &= ~(1 << BUTTON); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment