* import from old firekernel repository
commit
7e071464a8
@ -0,0 +1,3 @@
|
||||
SubDir TOP board ;
|
||||
|
||||
SubInclude TOP board $(BOARD) ;
|
@ -0,0 +1,10 @@
|
||||
SubDir TOP board eZ430-Chronos ;
|
||||
|
||||
HDRS += $(TOP)/board/$(CPU)/include ;
|
||||
|
||||
Module board : debug_uart.c board_init.c ;
|
||||
UseModule board ;
|
||||
|
||||
SubInclude TOP board $(BOARD) drivers ;
|
||||
SubInclude TOP cpu $(CPU) ;
|
||||
|
@ -0,0 +1,12 @@
|
||||
# ******************************************************************************
|
||||
# Copyright 2010, Freie Universitaet Berlin (FUB). All rights reserved.
|
||||
# ******************************************************************************
|
||||
# $Id$
|
||||
|
||||
BOARD = eZ430-Chronos ;
|
||||
CPU = msp430 ;
|
||||
MCU = cc430x6137 ;
|
||||
|
||||
FLASHER ?= mspdebug ;
|
||||
FLASHFLAGS ?= rf2500 ;
|
||||
|
@ -0,0 +1,2 @@
|
||||
void board_init() {
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
#include <stdio.h>
|
||||
#include "board.h"
|
||||
|
||||
#define UART1_TX TXBUF1
|
||||
#define UART1_WAIT_TXDONE() while( (UTCTL1 & TXEPT) == 0 ) { _NOP(); }
|
||||
|
||||
|
||||
int putchar(int c)
|
||||
{
|
||||
// UART1_TX = c;
|
||||
// UART1_WAIT_TXDONE();
|
||||
//
|
||||
// if (c == 10) {
|
||||
// UART1_TX = 13;
|
||||
// UART1_WAIT_TXDONE();
|
||||
// }
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,5 @@
|
||||
SubDir TOP board eZ430-Chronos drivers ;
|
||||
|
||||
UseModule board_common ;
|
||||
|
||||
Module board_common : display.c display1.c ;
|
@ -0,0 +1,519 @@
|
||||
// *************************************************************************************************
|
||||
//
|
||||
// Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/
|
||||
//
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
//
|
||||
// Redistributions in binary form must reproduce the above copyright
|
||||
// notice, this list of conditions and the following disclaimer in the
|
||||
// documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
//
|
||||
// Neither the name of Texas Instruments Incorporated nor the names of
|
||||
// its contributors may be used to endorse or promote products derived
|
||||
// from this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// *************************************************************************************************
|
||||
// Display functions.
|
||||
// *************************************************************************************************
|
||||
|
||||
|
||||
// *************************************************************************************************
|
||||
// Include section
|
||||
|
||||
// system
|
||||
#include <string.h>
|
||||
|
||||
// driver
|
||||
#include "cc430x613x.h"
|
||||
#include "display.h"
|
||||
|
||||
|
||||
// *************************************************************************************************
|
||||
// Prototypes section
|
||||
void write_lcd_mem(uint8_t * lcdmem, uint8_t bits, uint8_t bitmask, uint8_t state);
|
||||
void clear_line(uint8_t line);
|
||||
void display_symbol(uint8_t symbol, uint8_t mode);
|
||||
void display_char(uint8_t segment, uint8_t chr, uint8_t mode);
|
||||
void display_chars(uint8_t segments, uint8_t * str, uint8_t mode);
|
||||
|
||||
|
||||
// *************************************************************************************************
|
||||
// Defines section
|
||||
|
||||
|
||||
|
||||
// *************************************************************************************************
|
||||
// Global Variable section
|
||||
|
||||
// Display flags
|
||||
volatile s_display_flags display;
|
||||
|
||||
// Global return string for itoa function
|
||||
uint8_t itoa_str[8];
|
||||
|
||||
|
||||
|
||||
// *************************************************************************************************
|
||||
// @fn lcd_init
|
||||
// @brief Erase LCD memory. Init LCD peripheral.
|
||||
// @param none
|
||||
// @return none
|
||||
// *************************************************************************************************
|
||||
void lcd_init(void)
|
||||
{
|
||||
// Clear entire display memory
|
||||
LCDBMEMCTL |= LCDCLRBM + LCDCLRM;
|
||||
|
||||
// LCD_FREQ = ACLK/16/8 = 256Hz
|
||||
// Frame frequency = 256Hz/4 = 64Hz, LCD mux 4, LCD on
|
||||
LCDBCTL0 = (LCDDIV0 + LCDDIV1 + LCDDIV2 + LCDDIV3) | (LCDPRE0 + LCDPRE1) | LCD4MUX | LCDON;
|
||||
|
||||
// LCB_BLK_FREQ = ACLK/8/4096 = 1Hz
|
||||
LCDBBLKCTL = LCDBLKPRE0 | LCDBLKPRE1 | LCDBLKDIV0 | LCDBLKDIV1 | LCDBLKDIV2 | LCDBLKMOD0;
|
||||
|
||||
// I/O to COM outputs
|
||||
P5SEL |= (BIT5 | BIT6 | BIT7);
|
||||
P5DIR |= (BIT5 | BIT6 | BIT7);
|
||||
|
||||
// Activate LCD output
|
||||
LCDBPCTL0 = 0xFFFF; // Select LCD segments S0-S15
|
||||
LCDBPCTL1 = 0x00FF; // Select LCD segments S16-S22
|
||||
|
||||
#ifdef USE_LCD_CHARGE_PUMP
|
||||
// Charge pump voltage generated internally, internal bias (V2-V4) generation
|
||||
LCDBVCTL = LCDCPEN | VLCD_2_72;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
// *************************************************************************************************
|
||||
// @fn clear_display_all
|
||||
// @brief Erase LINE1 and LINE2 segments. Clear also function-specific content.
|
||||
// @param none
|
||||
// @return none
|
||||
// *************************************************************************************************
|
||||
void clear_display_all(void)
|
||||
{
|
||||
// Clear generic content
|
||||
clear_line(LINE1);
|
||||
clear_line(LINE2);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
// *************************************************************************************************
|
||||
// @fn clear_display
|
||||
// @brief Erase LINE1 and LINE2 segments. Keep icons.
|
||||
// @param none
|
||||
// @return none
|
||||
// *************************************************************************************************
|
||||
void clear_display(void)
|
||||
{
|
||||
clear_line(LINE1);
|
||||
clear_line(LINE2);
|
||||
}
|
||||
|
||||
|
||||
// *************************************************************************************************
|
||||
// @fn clear_line
|
||||
// @brief Erase segments of a given line.
|
||||
// @param uint8_t line LINE1, LINE2
|
||||
// @return none
|
||||
// *************************************************************************************************
|
||||
void clear_line(uint8_t line)
|
||||
{
|
||||
display_chars(switch_seg(line, LCD_SEG_L1_3_0, LCD_SEG_L2_5_0), NULL, SEG_OFF);
|
||||
if (line == LINE1)
|
||||
{
|
||||
display_symbol(LCD_SEG_L1_DP1, SEG_OFF);
|
||||
display_symbol(LCD_SEG_L1_DP0, SEG_OFF);
|
||||
display_symbol(LCD_SEG_L1_COL, SEG_OFF);
|
||||
}
|
||||
else // line == LINE2
|
||||
{
|
||||
display_symbol(LCD_SEG_L2_DP, SEG_OFF);
|
||||
display_symbol(LCD_SEG_L2_COL1, SEG_OFF);
|
||||
display_symbol(LCD_SEG_L2_COL0, SEG_OFF);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// *************************************************************************************************
|
||||
// @fn write_segment
|
||||
// @brief Write to one or multiple LCD segments
|
||||
// @param lcdmem Pointer to LCD byte memory
|
||||
// bits Segments to address
|
||||
// bitmask Bitmask for particular display item
|
||||
// mode On, off or blink segments
|
||||
// @return
|
||||
// *************************************************************************************************
|
||||
void write_lcd_mem(uint8_t * lcdmem, uint8_t bits, uint8_t bitmask, uint8_t state)
|
||||
{
|
||||
if (state == SEG_ON)
|
||||
{
|
||||
// Clear segments before writing
|
||||
*lcdmem = (uint8_t)(*lcdmem & ~bitmask);
|
||||
|
||||
// Set visible segments
|
||||
*lcdmem = (uint8_t)(*lcdmem | bits);
|
||||
}
|
||||
else if (state == SEG_OFF)
|
||||
{
|
||||
// Clear segments
|
||||
*lcdmem = (uint8_t)(*lcdmem & ~bitmask);
|
||||
}
|
||||
else if (state == SEG_ON_BLINK_ON)
|
||||
{
|
||||
// Clear visible / blink segments before writing
|
||||
*lcdmem = (uint8_t)(*lcdmem & ~bitmask);
|
||||
*(lcdmem+0x20) = (uint8_t)(*(lcdmem+0x20) & ~bitmask);
|
||||
|
||||
// Set visible / blink segments
|
||||
*lcdmem = (uint8_t)(*lcdmem | bits);
|
||||
*(lcdmem+0x20) = (uint8_t)(*(lcdmem+0x20) | bits);
|
||||
}
|
||||
else if (state == SEG_ON_BLINK_OFF)
|
||||
{
|
||||
// Clear visible segments before writing
|
||||
*lcdmem = (uint8_t)(*lcdmem & ~bitmask);
|
||||
|
||||
// Set visible segments
|
||||
*lcdmem = (uint8_t)(*lcdmem | bits);
|
||||
|
||||
// Clear blink segments
|
||||
*(lcdmem+0x20) = (uint8_t)(*(lcdmem+0x20) & ~bitmask);
|
||||
}
|
||||
else if (state == SEG_OFF_BLINK_OFF)
|
||||
{
|
||||
// Clear segments
|
||||
*lcdmem = (uint8_t)(*lcdmem & ~bitmask);
|
||||
|
||||
// Clear blink segments
|
||||
*(lcdmem+0x20) = (uint8_t)(*(lcdmem+0x20) & ~bitmask);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// *************************************************************************************************
|
||||
// @fn itoa
|
||||
// @brief Generic integer to array routine. Converts integer n to string.
|
||||
// Default conversion result has leading zeros, e.g. "00123"
|
||||
// Option to convert leading '0' into whitespace (blanks)
|
||||
// @param uint32_t n integer to convert
|
||||
// uint8_t digits number of digits
|
||||
// uint8_t blanks fill up result string with number of whitespaces instead of leading zeros
|
||||
// @return uint8_t string
|
||||
// *************************************************************************************************
|
||||
uint8_t * itoa(uint32_t n, uint8_t digits, uint8_t blanks)
|
||||
{
|
||||
uint8_t i;
|
||||
uint8_t digits1 = digits;
|
||||
|
||||
// Preset result string
|
||||
memcpy(itoa_str, "0000000", 7);
|
||||
|
||||
// Return empty string if number of digits is invalid (valid range for digits: 1-7)
|
||||
if ((digits == 0) || (digits > 7)) return (itoa_str);
|
||||
|
||||
// Numbers 0 .. 180 can be copied from itoa_conversion_table without conversion
|
||||
if (n <= 180)
|
||||
{
|
||||
if (digits >= 3)
|
||||
{
|
||||
memcpy(itoa_str+(digits-3), itoa_conversion_table[n], 3);
|
||||
}
|
||||
else // digits == 1 || 2
|
||||
{
|
||||
memcpy(itoa_str, itoa_conversion_table[n]+(3-digits), digits);
|
||||
}
|
||||
}
|
||||
else // For n > 180 need to calculate string content
|
||||
{
|
||||
// Calculate digits from least to most significant number
|
||||
do
|
||||
{
|
||||
itoa_str[digits-1] = n % 10 + '0';
|
||||
n /= 10;
|
||||
} while (--digits > 0);
|
||||
}
|
||||
|
||||
// Remove specified number of leading '0', always keep last one
|
||||
i = 0;
|
||||
while ((itoa_str[i] == '0') && (i < digits1-1))
|
||||
{
|
||||
if (blanks > 0)
|
||||
{
|
||||
// Convert only specified number of leading '0'
|
||||
itoa_str[i]=' ';
|
||||
blanks--;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
return (itoa_str);
|
||||
}
|
||||
|
||||
|
||||
// *************************************************************************************************
|
||||
// @fn display_value1
|
||||
// @brief Generic decimal display routine. Used exclusively by set_value function.
|
||||
// @param uint8_t segments LCD segments where value is displayed
|
||||
// uint32_t value Integer value to be displayed
|
||||
// uint8_t digits Number of digits to convert
|
||||
// uint8_t blanks Number of leadings blanks in itoa result string
|
||||
// @return none
|
||||
// *************************************************************************************************
|
||||
void display_value1(uint8_t segments, uint32_t value, uint8_t digits, uint8_t blanks, uint8_t disp_mode)
|
||||
{
|
||||
uint8_t * str;
|
||||
|
||||
str = itoa(value, digits, blanks);
|
||||
|
||||
// Display string in blink mode
|
||||
display_chars(segments, str, disp_mode);
|
||||
}
|
||||
|
||||
|
||||
// *************************************************************************************************
|
||||
// @fn display_symbol
|
||||
// @brief Switch symbol on or off on LCD.
|
||||
// @param uint8_t symbol A valid LCD symbol (index 0..42)
|
||||
// uint8_t state SEG_ON, SEG_OFF, SEG_BLINK
|
||||
// @return none
|
||||
// *************************************************************************************************
|
||||
void display_symbol(uint8_t symbol, uint8_t mode)
|
||||
{
|
||||
uint8_t * lcdmem;
|
||||
uint8_t bits;
|
||||
uint8_t bitmask;
|
||||
|
||||
if (symbol <= LCD_SEG_L2_DP)
|
||||
{
|
||||
// Get LCD memory address for symbol from table
|
||||
lcdmem = (uint8_t *)segments_lcdmem[symbol];
|
||||
|
||||
// Get bits for symbol from table
|
||||
bits = segments_bitmask[symbol];
|
||||
|
||||
// Bitmask for symbols equals bits
|
||||
bitmask = bits;
|
||||
|
||||
// Write LCD memory
|
||||
write_lcd_mem(lcdmem, bits, bitmask, mode);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// *************************************************************************************************
|
||||
// @fn display_char
|
||||
// @brief Write to 7-segment characters.
|
||||
// @param uint8_t segment A valid LCD segment
|
||||
// uint8_t chr Character to display
|
||||
// uint8_t mode SEG_ON, SEG_OFF, SEG_BLINK
|
||||
// @return none
|
||||
// *************************************************************************************************
|
||||
void display_char(uint8_t segment, uint8_t chr, uint8_t mode)
|
||||
{
|
||||
uint8_t * lcdmem; // Pointer to LCD memory
|
||||
uint8_t bitmask; // Bitmask for character
|
||||
uint8_t bits, bits1; // Bits to write
|
||||
|
||||
// Write to single 7-segment character
|
||||
if ((segment >= LCD_SEG_L1_3) && (segment <= LCD_SEG_L2_DP))
|
||||
{
|
||||
// Get LCD memory address for segment from table
|
||||
lcdmem = (uint8_t *)segments_lcdmem[segment];
|
||||
|
||||
// Get bitmask for character from table
|
||||
bitmask = segments_bitmask[segment];
|
||||
|
||||
// Get bits from font set
|
||||
if ((chr >= 0x30) && (chr <= 0x5A))
|
||||
{
|
||||
// Use font set
|
||||
bits = lcd_font[chr-0x30];
|
||||
}
|
||||
else if (chr == 0x2D)
|
||||
{
|
||||
// '-' not in font set
|
||||
bits = BIT1;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Other characters map to ' ' (blank)
|
||||
bits = 0;
|
||||
}
|
||||
|
||||
// When addressing LINE2 7-segment characters need to swap high- and low-nibble,
|
||||
// because LCD COM/SEG assignment is mirrored against LINE1
|
||||
if (segment >= LCD_SEG_L2_5)
|
||||
{
|
||||
bits1 = ((bits << 4) & 0xF0) | ((bits >> 4) & 0x0F);
|
||||
bits = bits1;
|
||||
|
||||
// When addressing LCD_SEG_L2_5, need to convert ASCII '1' and 'L' to 1 bit,
|
||||
// because LCD COM/SEG assignment is special for this incomplete character
|
||||
if (segment == LCD_SEG_L2_5)
|
||||
{
|
||||
if ((chr == '1') || (chr == 'L')) bits = BIT7;
|
||||
}
|
||||
}
|
||||
|
||||
// Physically write to LCD memory
|
||||
write_lcd_mem(lcdmem, bits, bitmask, mode);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// *************************************************************************************************
|
||||
// @fn display_chars
|
||||
// @brief Write to consecutive 7-segment characters.
|
||||
// @param uint8_t segments LCD segment array
|
||||
// uint8_t * str Pointer to a string
|
||||
// uint8_t mode SEG_ON, SEG_OFF, SEG_BLINK
|
||||
// @return none
|
||||
// *************************************************************************************************
|
||||
void display_chars(uint8_t segments, uint8_t * str, uint8_t mode)
|
||||
{
|
||||
uint8_t i;
|
||||
uint8_t length = 0; // Write length
|
||||
uint8_t char_start = 0; // Starting point for consecutive write
|
||||
|
||||
switch (segments)
|
||||
{
|
||||
// LINE1
|
||||
case LCD_SEG_L1_3_0: length=4; char_start=LCD_SEG_L1_3; break;
|
||||
case LCD_SEG_L1_2_0: length=3; char_start=LCD_SEG_L1_2; break;
|
||||
case LCD_SEG_L1_1_0: length=2; char_start=LCD_SEG_L1_1; break;
|
||||
case LCD_SEG_L1_3_1: length=3; char_start=LCD_SEG_L1_3; break;
|
||||
case LCD_SEG_L1_3_2: length=2; char_start=LCD_SEG_L1_3; break;
|
||||
|
||||
// LINE2
|
||||
case LCD_SEG_L2_5_0: length=6; char_start=LCD_SEG_L2_5; break;
|
||||
case LCD_SEG_L2_4_0: length=5; char_start=LCD_SEG_L2_4; break;
|
||||
case LCD_SEG_L2_3_0: length=4; char_start=LCD_SEG_L2_3; break;
|
||||
case LCD_SEG_L2_2_0: length=3; char_start=LCD_SEG_L2_2; break;
|
||||
case LCD_SEG_L2_1_0: length=2; char_start=LCD_SEG_L2_1; break;
|
||||
case LCD_SEG_L2_5_4: length=2; char_start=LCD_SEG_L2_5; break;
|
||||
case LCD_SEG_L2_5_2: length=4; char_start=LCD_SEG_L2_5; break;
|
||||
case LCD_SEG_L2_3_2: length=2; char_start=LCD_SEG_L2_3; break;
|
||||
case LCD_SEG_L2_4_2: length=3; char_start=LCD_SEG_L2_4; break;
|
||||
}
|
||||
|
||||
// Write to consecutive digits
|
||||
for(i=0; i<length; i++)
|
||||
{
|
||||
// Use single character routine to write display memory
|
||||
display_char(char_start+i, *(str+i), mode);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// *************************************************************************************************
|
||||
// @fn switch_seg
|
||||
// @brief Returns index of 7-segment character. Required for display routines that can draw
|
||||
// information on both lines.
|
||||
// @param uint8_t line LINE1, LINE2
|
||||
// uint8_t index1 Index of LINE1
|
||||
// uint8_t index2 Index of LINE2
|
||||
// @return uint8
|
||||
// *************************************************************************************************
|
||||
uint8_t switch_seg(uint8_t line, uint8_t index1, uint8_t index2)
|
||||
{
|
||||
if (line == LINE1)
|
||||
{
|
||||
return index1;
|
||||
}
|
||||
else // line == LINE2
|
||||
{
|
||||
return index2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// *************************************************************************************************
|
||||
// @fn start_blink
|
||||
// @brief Start blinking.
|
||||
// @param none
|
||||
// @return none
|
||||
// *************************************************************************************************
|
||||
void start_blink(void)
|
||||
{
|
||||
LCDBBLKCTL |= LCDBLKMOD0;
|
||||
}
|
||||
|
||||
|
||||
// *************************************************************************************************
|
||||
// @fn stop_blink
|
||||
// @brief Stop blinking.
|
||||
// @param none
|
||||
// @return none
|
||||
// *************************************************************************************************
|
||||
void stop_blink(void)
|
||||
{
|
||||
LCDBBLKCTL &= ~LCDBLKMOD0;
|
||||
}
|
||||
|
||||
|
||||
// *************************************************************************************************
|
||||
// @fn stop_blink
|
||||
// @brief Clear blinking memory.
|
||||
// @param none
|
||||
// @return none
|
||||
// *************************************************************************************************
|
||||
void clear_blink_mem(void)
|
||||
{
|
||||
LCDBMEMCTL |= LCDCLRBM;
|
||||
}
|
||||
|
||||
|
||||
// *************************************************************************************************
|
||||
// @fn set_blink_rate
|
||||
// @brief Set blink rate register bits.
|
||||
// @param none
|
||||
// @return none
|
||||
// *************************************************************************************************
|
||||
void set_blink_rate(uint8_t bits)
|
||||
{
|
||||
LCDBBLKCTL &= ~(BIT7 | BIT6 | BIT5);
|
||||
LCDBBLKCTL |= bits;
|
||||
}
|
||||
|
||||
|
||||
// *************************************************************************************************
|
||||
// @fn display_all_off
|
||||
// @brief Sets everything of on the display
|
||||
// @param none
|
||||
// @return none
|
||||
// *************************************************************************************************
|
||||
void display_all_off(void)
|
||||
{
|
||||
uint8_t * lcdptr = (uint8_t*)0x0A20;
|
||||
uint8_t i;
|
||||
|
||||
for (i=1; i<=12; i++)
|
||||
{
|
||||
*lcdptr = 0x00;
|
||||
lcdptr++;
|
||||
}
|
||||
}
|
@ -0,0 +1,360 @@
|
||||
// *************************************************************************************************
|
||||
//
|
||||
// Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/
|
||||
//
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
//
|
||||
// Redistributions in binary form must reproduce the above copyright
|
||||
// notice, this list of conditions and the following disclaimer in the
|
||||
// documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
//
|
||||
// Neither the name of Texas Instruments Incorporated nor the names of
|
||||
// its contributors may be used to endorse or promote products derived
|
||||
// from this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// *************************************************************************************************
|
||||
|
||||
#ifndef __DISPLAY_H
|
||||
#define __DISPLAY_H
|
||||
|
||||
|
||||
// *************************************************************************************************
|
||||
// Include section
|
||||
|
||||
/*
|
||||
* Set some options at compile time for how the time is displayed
|
||||
* The options are, in order of code space used-
|
||||
* OPTION_TIME_DISPLAY == CLOCK_24HR
|
||||
* OPTION_TIME_DISPLAY == CLOCK_AM_PM
|
||||
* OPTION_TIME_DISPLAY == CLOCK_DISPLAY_SELECT
|
||||
*/
|
||||
|
||||
#define CLOCK_24HR 0
|
||||
#define CLOCK_AM_PM 1
|
||||
#define CLOCK_DISPLAY_SELECT 2
|
||||
|
||||
|
||||
|
||||
|
||||
// *************************************************************************************************
|
||||
// Extern section
|
||||
|
||||
// *************************************************************************************************
|
||||
// Global Variable section
|
||||
|
||||
// Set of display flags
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
// Line1 + Line2 + Icons
|
||||
uint16_t full_update : 1; // 1 = Redraw all content
|
||||
uint16_t partial_update : 1; // 1 = Update changes
|
||||
|
||||
// Line only
|
||||
uint16_t line1_full_update : 1; // 1 = Redraw Line1 content
|
||||
uint16_t line2_full_update : 1; // 1 = Redraw Line2 content
|
||||
|
||||
// Logic module data update flags
|
||||
uint16_t update_time : 1; // 1 = Time was updated
|
||||
uint16_t update_stopwatch : 1; // 1 = Stopwatch was updated
|
||||
uint16_t update_temperature : 1; // 1 = Temperature was updated
|
||||
uint16_t update_battery_voltage : 1; // 1 = Battery voltage was updated
|
||||
uint16_t update_date : 1; // 1 = Date was updated
|
||||
uint16_t update_alarm : 1; // 1 = Alarm time was updated
|
||||
uint16_t update_acceleration : 1; // 1 = Acceleration data was updated
|
||||
} flag;
|
||||
uint16_t all_flags; // Shortcut to all display flags (for reset)
|
||||
} s_display_flags;
|
||||
|
||||
extern volatile s_display_flags display;
|
||||
|
||||
// Constants defined in library
|
||||
extern const uint8_t lcd_font[];
|
||||
extern const uint8_t * segments_lcdmem[];
|
||||
extern const uint8_t segments_bitmask[];
|
||||
extern const uint8_t itoa_conversion_table[][3];
|
||||
|
||||
// *************************************************************************************************
|
||||
// Defines section
|
||||
|
||||
// Display function modes
|
||||
#define DISPLAY_LINE_UPDATE_FULL (BIT0)
|
||||
#define DISPLAY_LINE_UPDATE_PARTIAL (BIT1)
|
||||
#define DISPLAY_LINE_CLEAR (BIT2)
|
||||
|
||||
// Definitions for line view style
|
||||
#define DISPLAY_DEFAULT_VIEW (0u)
|
||||
#define DISPLAY_ALTERNATIVE_VIEW (1u)
|
||||
#define DISPLAY_ALTERNATIVE2_VIEW (2u)
|
||||
|
||||
// Definitions for line access
|
||||
#define LINE1 (1u)
|
||||
#define LINE2 (2u)
|
||||
|
||||
// LCD display modes
|
||||
#define SEG_OFF (0u)
|
||||
#define SEG_ON (1u)
|
||||
#define SEG_ON_BLINK_ON (2u)
|
||||
#define SEG_ON_BLINK_OFF (3u)
|
||||
#define SEG_OFF_BLINK_OFF (4u)
|
||||
|
||||
// 7-segment character bit assignments
|
||||
#define SEG_A (BIT4)
|
||||
#define SEG_B (BIT5)
|
||||
#define SEG_C (BIT6)
|
||||
#define SEG_D (BIT7)
|
||||
#define SEG_E (BIT2)
|
||||
#define SEG_F (BIT0)
|
||||
#define SEG_G (BIT1)
|
||||
|
||||
// ------------------------------------------
|
||||
// LCD symbols for easier access
|
||||
//
|
||||
// xxx_SEG_xxx = Seven-segment character (sequence 5-4-3-2-1-0)
|
||||
// xxx_SYMB_xxx = Display symbol, e.g. "AM" for ante meridiem
|
||||
// xxx_UNIT_xxx = Display unit, e.g. "km/h" for kilometers per hour
|
||||
// xxx_ICON_xxx = Display icon, e.g. heart to indicate reception of heart rate data
|
||||
// xxx_L1_xxx = Item is part of Line1 information
|
||||
// xxx_L2_xxx = Item is part of Line2 information
|
||||
|
||||
// Symbols for Line1
|
||||
#define LCD_SYMB_AM 0
|
||||
#define LCD_SYMB_PM 1
|
||||
#define LCD_SYMB_ARROW_UP 2
|
||||
#define LCD_SYMB_ARROW_DOWN 3
|
||||
#define LCD_SYMB_PERCENT 4
|
||||
|
||||
// Symbols for Line2
|
||||
#define LCD_SYMB_TOTAL 5
|
||||
#define LCD_SYMB_AVERAGE 6
|
||||
#define LCD_SYMB_MAX 7
|
||||
#define LCD_SYMB_BATTERY 8
|
||||
|
||||
// Units for Line1
|
||||
#define LCD_UNIT_L1_FT 9
|
||||
#define LCD_UNIT_L1_K 10
|
||||
#define LCD_UNIT_L1_M 11
|
||||
#define LCD_UNIT_L1_I 12
|
||||
#define LCD_UNIT_L1_PER_S 13
|
||||
#define LCD_UNIT_L1_PER_H 14
|
||||
#define LCD_UNIT_L1_DEGREE 15
|
||||
|
||||
// Units for Line2
|
||||
#define LCD_UNIT_L2_KCAL 16
|
||||
#define LCD_UNIT_L2_KM 17
|
||||
#define LCD_UNIT_L2_MI 18
|
||||
|
||||
// Icons
|
||||
#define LCD_ICON_HEART 19
|
||||
#define LCD_ICON_STOPWATCH 20
|
||||
#define LCD_ICON_RECORD 21
|
||||
#define LCD_ICON_ALARM 22
|
||||
#define LCD_ICON_BEEPER1 23
|
||||
#define LCD_ICON_BEEPER2 24
|
||||
#define LCD_ICON_BEEPER3 25
|
||||
|
||||
// Line1 7-segments
|
||||
#define LCD_SEG_L1_3 26
|
||||
#define LCD_SEG_L1_2 27
|
||||
#define LCD_SEG_L1_1 28
|
||||
#define LCD_SEG_L1_0 29
|
||||
#define LCD_SEG_L1_COL 30
|
||||
#define LCD_SEG_L1_DP1 31
|
||||
#define LCD_SEG_L1_DP0 32
|
||||
|
||||
// Line2 7-segments
|
||||
#define LCD_SEG_L2_5 33
|
||||
#define LCD_SEG_L2_4 34
|
||||
#define LCD_SEG_L2_3 35
|
||||
#define LCD_SEG_L2_2 36
|
||||
#define LCD_SEG_L2_1 37
|
||||
#define LCD_SEG_L2_0 38
|
||||
#define LCD_SEG_L2_COL1 39
|
||||
#define LCD_SEG_L2_COL0 40
|
||||
#define LCD_SEG_L2_DP 41
|
||||
|
||||
|
||||
// Line1 7-segment arrays
|
||||
#define LCD_SEG_L1_3_0 70
|
||||
#define LCD_SEG_L1_2_0 71
|
||||
#define LCD_SEG_L1_1_0 72
|
||||
#define LCD_SEG_L1_3_1 73
|
||||
#define LCD_SEG_L1_3_2 74
|
||||
|
||||
// Line2 7-segment arrays
|
||||
#define LCD_SEG_L2_5_0 90
|
||||
#define LCD_SEG_L2_4_0 91
|
||||
#define LCD_SEG_L2_3_0 92
|
||||
#define LCD_SEG_L2_2_0 93
|
||||
#define LCD_SEG_L2_1_0 94
|
||||
#define LCD_SEG_L2_5_2 95
|
||||
#define LCD_SEG_L2_3_2 96
|
||||
#define LCD_SEG_L2_5_4 97
|
||||
#define LCD_SEG_L2_4_2 98
|
||||
|
||||
|
||||
// LCD controller memory map
|
||||
#define LCD_MEM_1 ((uint8_t*)0x0A20)
|
||||
#define LCD_MEM_2 ((uint8_t*)0x0A21)
|
||||
#define LCD_MEM_3 ((uint8_t*)0x0A22)
|
||||
#define LCD_MEM_4 ((uint8_t*)0x0A23)
|
||||
#define LCD_MEM_5 ((uint8_t*)0x0A24)
|
||||
#define LCD_MEM_6 ((uint8_t*)0x0A25)
|
||||
#define LCD_MEM_7 ((uint8_t*)0x0A26)
|
||||
#define LCD_MEM_8 ((uint8_t*)0x0A27)
|
||||
#define LCD_MEM_9 ((uint8_t*)0x0A28)
|
||||
#define LCD_MEM_10 ((uint8_t*)0x0A29)
|
||||
#define LCD_MEM_11 ((uint8_t*)0x0A2A)
|
||||
#define LCD_MEM_12 ((uint8_t*)0x0A2B)
|
||||
|
||||
|
||||
// Memory assignment
|
||||
#define LCD_SEG_L1_0_MEM (LCD_MEM_6)
|
||||
#define LCD_SEG_L1_1_MEM (LCD_MEM_4)
|
||||
#define LCD_SEG_L1_2_MEM (LCD_MEM_3)
|
||||
#define LCD_SEG_L1_3_MEM (LCD_MEM_2)
|
||||
#define LCD_SEG_L1_COL_MEM (LCD_MEM_1)
|
||||
#define LCD_SEG_L1_DP1_MEM (LCD_MEM_1)
|
||||
#define LCD_SEG_L1_DP0_MEM (LCD_MEM_5)
|
||||
#define LCD_SEG_L2_0_MEM (LCD_MEM_8)
|
||||
#define LCD_SEG_L2_1_MEM (LCD_MEM_9)
|
||||
#define LCD_SEG_L2_2_MEM (LCD_MEM_10)
|
||||
#define LCD_SEG_L2_3_MEM (LCD_MEM_11)
|
||||
#define LCD_SEG_L2_4_MEM (LCD_MEM_12)
|
||||
#define LCD_SEG_L2_5_MEM (LCD_MEM_12)
|
||||
#define LCD_SEG_L2_COL1_MEM (LCD_MEM_1)
|
||||
#define LCD_SEG_L2_COL0_MEM (LCD_MEM_5)
|
||||
#define LCD_SEG_L2_DP_MEM (LCD_MEM_9)
|
||||
#define LCD_SYMB_AM_MEM (LCD_MEM_1)
|
||||
#define LCD_SYMB_PM_MEM (LCD_MEM_1)
|
||||
#define LCD_SYMB_ARROW_UP_MEM (LCD_MEM_1)
|
||||
#define LCD_SYMB_ARROW_DOWN_MEM (LCD_MEM_1)
|
||||
#define LCD_SYMB_PERCENT_MEM (LCD_MEM_5)
|
||||
#define LCD_SYMB_TOTAL_MEM (LCD_MEM_11)
|
||||
#define LCD_SYMB_AVERAGE_MEM (LCD_MEM_10)
|
||||
#define LCD_SYMB_MAX_MEM (LCD_MEM_8)
|
||||
#define LCD_SYMB_BATTERY_MEM (LCD_MEM_7)
|
||||
#define LCD_UNIT_L1_FT_MEM (LCD_MEM_5)
|
||||
#define LCD_UNIT_L1_K_MEM (LCD_MEM_5)
|
||||
#define LCD_UNIT_L1_M_MEM (LCD_MEM_7)
|
||||
#define LCD_UNIT_L1_I_MEM (LCD_MEM_7)
|
||||
#define LCD_UNIT_L1_PER_S_MEM (LCD_MEM_5)
|
||||
#define LCD_UNIT_L1_PER_H_MEM (LCD_MEM_7)
|
||||
#define LCD_UNIT_L1_DEGREE_MEM (LCD_MEM_5)
|
||||
#define LCD_UNIT_L2_KCAL_MEM (LCD_MEM_7)
|
||||
#define LCD_UNIT_L2_KM_MEM (LCD_MEM_7)
|
||||
#define LCD_UNIT_L2_MI_MEM (LCD_MEM_7)
|
||||
#define LCD_ICON_HEART_MEM (LCD_MEM_2)
|
||||
#define LCD_ICON_STOPWATCH_MEM (LCD_MEM_3)
|
||||
#define LCD_ICON_RECORD_MEM (LCD_MEM_1)
|
||||
#define LCD_ICON_ALARM_MEM (LCD_MEM_4)
|
||||
#define LCD_ICON_BEEPER1_MEM (LCD_MEM_5)
|
||||
#define LCD_ICON_BEEPER2_MEM (LCD_MEM_6)
|
||||
#define LCD_ICON_BEEPER3_MEM (LCD_MEM_7)
|
||||
|
||||
// Bit masks for write access
|
||||
#define LCD_SEG_L1_0_MASK (BIT2+BIT1+BIT0+BIT7+BIT6+BIT5+BIT4)
|
||||
#define LCD_SEG_L1_1_MASK (BIT2+BIT1+BIT0+BIT7+BIT6+BIT5+BIT4)
|
||||
#define LCD_SEG_L1_2_MASK (BIT2+BIT1+BIT0+BIT7+BIT6+BIT5+BIT4)
|
||||
#define LCD_SEG_L1_3_MASK (BIT2+BIT1+BIT0+BIT7+BIT6+BIT5+BIT4)
|
||||
#define LCD_SEG_L1_COL_MASK (BIT5)
|
||||
#define LCD_SEG_L1_DP1_MASK (BIT6)
|
||||
#define LCD_SEG_L1_DP0_MASK (BIT2)
|
||||
#define LCD_SEG_L2_0_MASK (BIT3+BIT2+BIT1+BIT0+BIT6+BIT5+BIT4)
|
||||
#define LCD_SEG_L2_1_MASK (BIT3+BIT2+BIT1+BIT0+BIT6+BIT5+BIT4)
|
||||
#define LCD_SEG_L2_2_MASK (BIT3+BIT2+BIT1+BIT0+BIT6+BIT5+BIT4)
|
||||
#define LCD_SEG_L2_3_MASK (BIT3+BIT2+BIT1+BIT0+BIT6+BIT5+BIT4)
|
||||
#define LCD_SEG_L2_4_MASK (BIT3+BIT2+BIT1+BIT0+BIT6+BIT5+BIT4)
|
||||
#define LCD_SEG_L2_5_MASK (BIT7)
|
||||
#define LCD_SEG_L2_COL1_MASK (BIT4)
|
||||
#define LCD_SEG_L2_COL0_MASK (BIT0)
|
||||
#define LCD_SEG_L2_DP_MASK (BIT7)
|
||||
#define LCD_SYMB_AM_MASK (BIT1+BIT0)
|
||||
#define LCD_SYMB_PM_MASK (BIT0)
|
||||
#define LCD_SYMB_ARROW_UP_MASK (BIT2)
|
||||
#define LCD_SYMB_ARROW_DOWN_MASK (BIT3)
|
||||
#define LCD_SYMB_PERCENT_MASK (BIT4)
|
||||
#define LCD_SYMB_TOTAL_MASK (BIT7)
|
||||
#define LCD_SYMB_AVERAGE_MASK (BIT7)
|
||||
#define LCD_SYMB_MAX_MASK (BIT7)
|
||||
#define LCD_SYMB_BATTERY_MASK (BIT7)
|
||||
#define LCD_UNIT_L1_FT_MASK (BIT5)
|
||||
#define LCD_UNIT_L1_K_MASK (BIT6)
|
||||
#define LCD_UNIT_L1_M_MASK (BIT1)
|
||||
#define LCD_UNIT_L1_I_MASK (BIT0)
|
||||
#define LCD_UNIT_L1_PER_S_MASK (BIT7)
|
||||
#define LCD_UNIT_L1_PER_H_MASK (BIT2)
|
||||
#define LCD_UNIT_L1_DEGREE_MASK (BIT1)
|
||||
#define LCD_UNIT_L2_KCAL_MASK (BIT4)
|
||||
#define LCD_UNIT_L2_KM_MASK (BIT5)
|
||||
#define LCD_UNIT_L2_MI_MASK (BIT6)
|
||||
#define LCD_ICON_HEART_MASK (BIT3)
|
||||
#define LCD_ICON_STOPWATCH_MASK (BIT3)
|
||||
#define LCD_ICON_RECORD_MASK (BIT7)
|
||||
#define LCD_ICON_ALARM_MASK (BIT3)
|
||||
#define LCD_ICON_BEEPER1_MASK (BIT3)
|
||||
#define LCD_ICON_BEEPER2_MASK (BIT3)
|
||||
#define LCD_ICON_BEEPER3_MASK (BIT3)
|
||||
|
||||
|
||||
|
||||
// *************************************************************************************************
|
||||
// API section
|
||||
|
||||
// Physical LCD memory write
|
||||
void write_lcd_mem(uint8_t * lcdmem, uint8_t bits, uint8_t bitmask, uint8_t state);
|
||||
|
||||
// Display init / clear
|
||||
void lcd_init(void);
|
||||
void clear_display(void);
|
||||
void clear_display_all(void);
|
||||
void clear_line(uint8_t line);
|
||||
|
||||
// Blinking function
|
||||
void start_blink(void);
|
||||
void stop_blink(void);
|
||||
void clear_blink_mem(void);
|
||||
void set_blink_rate(uint8_t bits);
|
||||
|
||||
// Character / symbol draw functions
|
||||
void display_char(uint8_t segment, uint8_t chr, uint8_t mode);
|
||||
void display_chars(uint8_t segments, uint8_t * str, uint8_t mode);
|
||||
void display_symbol(uint8_t symbol, uint8_t mode);
|
||||
|
||||
// Time display function
|
||||
void DisplayTime(uint8_t updateMode);
|
||||
void display_am_pm_symbol(uint8_t timeAM);
|
||||
|
||||
// Set_value display functions
|
||||
void display_value1(uint8_t segments, uint32_t value, uint8_t digits, uint8_t blanks, uint8_t disp_mode);
|
||||
void display_hours_12_or_24(uint8_t segments, uint32_t value, uint8_t digits, uint8_t blanks, uint8_t disp_mode);
|
||||
|
||||
// Integer to string conversion
|
||||
uint8_t * itoa(uint32_t n, uint8_t digits, uint8_t blanks);
|
||||
|
||||
// Segment index helper function
|
||||
uint8_t switch_seg(uint8_t line, uint8_t index1, uint8_t index2);
|
||||
|
||||
void display_all_off(void);
|
||||
|
||||
#endif // __DISPLAY_
|
@ -0,0 +1,226 @@
|
||||
// *************************************************************************************************
|
||||
//
|
||||
// Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/
|
||||
//
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
//
|
||||
// Redistributions in binary form must reproduce the above copyright
|
||||
// notice, this list of conditions and the following disclaimer in the
|
||||
// documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
//
|
||||
// Neither the name of Texas Instruments Incorporated nor the names of
|
||||
// its contributors may be used to endorse or promote products derived
|
||||
// from this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
// *************************************************************************************************
|
||||
// Basic display functions.
|
||||
// *************************************************************************************************
|
||||
|
||||
|
||||
// *************************************************************************************************
|
||||
// Include section
|
||||
#include "cc430x613x.h"
|
||||
|
||||
|
||||
// driver
|
||||
#include "display.h"
|
||||
|
||||
|
||||
// *************************************************************************************************
|
||||
// Prototypes section
|
||||
|
||||
|
||||
// *************************************************************************************************
|
||||
// Defines section
|
||||
|
||||
|
||||
|
||||
// *************************************************************************************************
|
||||
// Global Variable section
|
||||
|
||||
// Table with memory bit assignment for digits "0" to "9" and characters "A" to "Z"
|
||||
// A
|
||||
// F B
|
||||
// G
|
||||
// E C
|
||||
// D
|
||||
const uint8_t lcd_font[] =
|
||||
{
|
||||
SEG_A+SEG_B+SEG_C+SEG_D+SEG_E+SEG_F, // Displays "0"
|
||||
SEG_B+SEG_C, // Displays "1"
|
||||
SEG_A+SEG_B+ SEG_D+SEG_E+ SEG_G, // Displays "2"
|
||||
SEG_A+SEG_B+SEG_C+SEG_D+ SEG_G, // Displays "3"
|
||||
SEG_B+SEG_C+ SEG_F+SEG_G, // Displays "4"
|
||||
SEG_A+ SEG_C+SEG_D+ SEG_F+SEG_G, // Displays "5"
|
||||
SEG_A+ SEG_C+SEG_D+SEG_E+SEG_F+SEG_G, // Displays "6"
|
||||
SEG_A+SEG_B+SEG_C, // Displays "7"
|
||||
SEG_A+SEG_B+SEG_C+SEG_D+SEG_E+SEG_F+SEG_G, // Displays "8"
|
||||
SEG_A+SEG_B+SEG_C+SEG_D+ SEG_F+SEG_G, // Displays "9"
|
||||
0 , // Displays " " (:)
|
||||
0 , // Displays " " (;)
|
||||
SEG_A+ SEG_F+SEG_G, // Displays "<" as high c
|
||||
SEG_D+ SEG_G, // Displays "="
|
||||
0 , // Displays " " (>)
|
||||
SEG_A+SEG_B+ SEG_E+ SEG_G, // Displays "?"
|
||||
0 , // Displays " " (@)
|
||||
SEG_A+SEG_B+SEG_C+ SEG_E+SEG_F+SEG_G, // Displays "A"
|
||||
SEG_C+SEG_D+SEG_E+SEG_F+SEG_G, // Displays "b"
|
||||
SEG_D+SEG_E+ SEG_G, // Displays "c"
|
||||
SEG_B+SEG_C+SEG_D+SEG_E+ SEG_G, // Displays "d"
|
||||
SEG_A+ +SEG_D+SEG_E+SEG_F+SEG_G, // Displays "E"
|
||||
SEG_A+ SEG_E+SEG_F+SEG_G, // Displays "f"
|
||||
SEG_A+SEG_B+SEG_C+SEG_D+ SEG_F+SEG_G, // Displays "g" same as 9
|
||||
SEG_C+ SEG_E+SEG_F+SEG_G, // Displays "h"
|
||||
SEG_E , // Displays "i"
|
||||
SEG_A+SEG_B+SEG_C+SEG_D , // Displays "J"
|
||||
SEG_D+ SEG_F+SEG_G, // Displays "k"
|
||||
SEG_D+SEG_E+SEG_F , // Displays "L"
|
||||
SEG_A+SEG_B+SEG_C+ SEG_E+SEG_F , // Displays "M"
|
||||
SEG_C+ SEG_E+ SEG_G, // Displays "n"
|
||||
SEG_C+SEG_D+SEG_E+ SEG_G, // Displays "o"
|
||||
SEG_A+SEG_B+ SEG_E+SEG_F+SEG_G, // Displays "P"
|
||||
SEG_A+SEG_B+SEG_C+ SEG_F+SEG_G, // Displays "q"
|
||||
SEG_E+ SEG_G, // Displays "r"
|
||||
SEG_A+ SEG_C+SEG_D+ SEG_F+SEG_G, // Displays "S" same as 5
|
||||
SEG_D+SEG_E+SEG_F+SEG_G, // Displays "t"
|
||||
SEG_C+SEG_D+SEG_E , // Displays "u"
|
||||
SEG_C+SEG_D+SEG_E , // Displays "v" same as u
|
||||
SEG_B+SEG_C+SEG_D+SEG_E+SEG_F+SEG_G, // Displays "W"
|
||||
SEG_B+SEG_C+ +SEG_E+SEG_F+SEG_G, // Displays "X" as H
|
||||
SEG_B+SEG_C+SEG_D+ SEG_F+SEG_G, // Displays "Y"
|
||||
SEG_A+SEG_B+ SEG_D+SEG_E+ SEG_G, // Displays "Z" same as 2
|
||||
};
|
||||
|
||||
|
||||
// Table with memory address for each display element
|
||||
const uint8_t * segments_lcdmem[] =
|
||||
{
|
||||
LCD_SYMB_AM_MEM,
|
||||
LCD_SYMB_PM_MEM,
|
||||
LCD_SYMB_ARROW_UP_MEM,
|
||||
LCD_SYMB_ARROW_DOWN_MEM,
|
||||
LCD_SYMB_PERCENT_MEM,
|
||||
LCD_SYMB_TOTAL_MEM,
|
||||
LCD_SYMB_AVERAGE_MEM,
|
||||
LCD_SYMB_MAX_MEM,
|
||||
LCD_SYMB_BATTERY_MEM,
|
||||
LCD_UNIT_L1_FT_MEM,
|
||||
LCD_UNIT_L1_K_MEM,
|
||||
LCD_UNIT_L1_M_MEM,
|
||||
LCD_UNIT_L1_I_MEM,
|
||||
LCD_UNIT_L1_PER_S_MEM,
|
||||
LCD_UNIT_L1_PER_H_MEM,
|
||||
LCD_UNIT_L1_DEGREE_MEM,
|
||||
LCD_UNIT_L2_KCAL_MEM,
|
||||
LCD_UNIT_L2_KM_MEM,
|
||||
LCD_UNIT_L2_MI_MEM,
|
||||
LCD_ICON_HEART_MEM,
|
||||
LCD_ICON_STOPWATCH_MEM,
|
||||
LCD_ICON_RECORD_MEM,
|
||||
LCD_ICON_ALARM_MEM,
|
||||
LCD_ICON_BEEPER1_MEM,
|
||||
LCD_ICON_BEEPER2_MEM,
|
||||
LCD_ICON_BEEPER3_MEM,
|
||||
LCD_SEG_L1_3_MEM,
|
||||
LCD_SEG_L1_2_MEM,
|
||||
LCD_SEG_L1_1_MEM,
|
||||
LCD_SEG_L1_0_MEM,
|
||||
LCD_SEG_L1_COL_MEM,
|
||||
LCD_SEG_L1_DP1_MEM,
|
||||
LCD_SEG_L1_DP0_MEM,
|
||||
LCD_SEG_L2_5_MEM,
|
||||
LCD_SEG_L2_4_MEM,
|
||||
LCD_SEG_L2_3_MEM,
|
||||
LCD_SEG_L2_2_MEM,
|
||||
LCD_SEG_L2_1_MEM,
|
||||
LCD_SEG_L2_0_MEM,
|
||||
LCD_SEG_L2_COL1_MEM,
|
||||
LCD_SEG_L2_COL0_MEM,
|
||||
LCD_SEG_L2_DP_MEM,
|
||||
};
|
||||
|
||||
|
||||
// Table with bit mask for each display element
|
||||
const uint8_t segments_bitmask[] =
|
||||
{
|
||||
LCD_SYMB_AM_MASK,
|
||||
LCD_SYMB_PM_MASK,
|
||||
LCD_SYMB_ARROW_UP_MASK,
|
||||
LCD_SYMB_ARROW_DOWN_MASK,
|
||||
LCD_SYMB_PERCENT_MASK,
|
||||
LCD_SYMB_TOTAL_MASK,
|
||||
LCD_SYMB_AVERAGE_MASK,
|
||||
LCD_SYMB_MAX_MASK,
|
||||
LCD_SYMB_BATTERY_MASK,
|
||||
LCD_UNIT_L1_FT_MASK,
|
||||
LCD_UNIT_L1_K_MASK,
|
||||
LCD_UNIT_L1_M_MASK,
|
||||
LCD_UNIT_L1_I_MASK,
|
||||
LCD_UNIT_L1_PER_S_MASK,
|
||||
LCD_UNIT_L1_PER_H_MASK,
|
||||
LCD_UNIT_L1_DEGREE_MASK,
|
||||
LCD_UNIT_L2_KCAL_MASK,
|
||||
LCD_UNIT_L2_KM_MASK,
|
||||
LCD_UNIT_L2_MI_MASK,
|
||||
LCD_ICON_HEART_MASK,
|
||||
LCD_ICON_STOPWATCH_MASK,
|
||||
LCD_ICON_RECORD_MASK,
|
||||
LCD_ICON_ALARM_MASK,
|
||||
LCD_ICON_BEEPER1_MASK,
|
||||
LCD_ICON_BEEPER2_MASK,
|
||||
LCD_ICON_BEEPER3_MASK,
|
||||
LCD_SEG_L1_3_MASK,
|
||||
LCD_SEG_L1_2_MASK,
|
||||
LCD_SEG_L1_1_MASK,
|
||||
LCD_SEG_L1_0_MASK,
|
||||
LCD_SEG_L1_COL_MASK,
|
||||
LCD_SEG_L1_DP1_MASK,
|
||||
LCD_SEG_L1_DP0_MASK,
|
||||
LCD_SEG_L2_5_MASK,
|
||||
LCD_SEG_L2_4_MASK,
|
||||
LCD_SEG_L2_3_MASK,
|
||||
LCD_SEG_L2_2_MASK,
|
||||
LCD_SEG_L2_1_MASK,
|
||||
LCD_SEG_L2_0_MASK,
|
||||
LCD_SEG_L2_COL1_MASK,
|
||||
LCD_SEG_L2_COL0_MASK,
|
||||
LCD_SEG_L2_DP_MASK,
|
||||
};
|
||||
|
||||
|
||||
// Quick integer to array conversion table for most common integer values
|
||||
const uint8_t itoa_conversion_table[][3] =
|
||||
{
|
||||
"000", "001", "002", "003", "004", "005", "006", "007", "008", "009", "010", "011", "012", "013", "014", "015",
|
||||
"016", "017", "018", "019", "020", "021", "022", "023", "024", "025", "026", "027", "028", "029", "030", "031",
|
||||
"032", "033", "034", "035", "036", "037", "038", "039", "040", "041", "042", "043", "044", "045", "046", "047",
|
||||
"048", "049", "050", "051", "052", "053", "054", "055", "056", "057", "058", "059", "060", "061", "062", "063",
|
||||
"064", "065", "066", "067", "068", "069", "070", "071", "072", "073", "074", "075", "076", "077", "078", "079",
|
||||
"080", "081", "082", "083", "084", "085", "086", "087", "088", "089", "090", "091", "092", "093", "094", "095",
|
||||
"096", "097", "098", "099", "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",
|
||||
};
|
||||
|
@ -0,0 +1,10 @@
|
||||
#ifndef _MSB_BOARD_H
|
||||
#define _MSB_BOARD_H
|
||||
|
||||
#include <cc430x613x.h>
|
||||
|
||||
#define MSP430_INITIAL_CPU_SPEED 7372800uL
|
||||
#define MSP430_HAS_DCOR 1
|
||||
#define MSP430_HAS_EXTERNAL_CRYSTAL 1
|
||||
|
||||
#endif // _MSB_BOARD_H
|
@ -0,0 +1,35 @@
|
||||
# ******************************************************************************
|
||||
# Copyright 2009, Freie Universitaet Berlin (FUB). All rights reserved.
|
||||
#
|
||||
# These sources were developed at the Freie Universitaet Berlin, Computer
|
||||
# Systems and Telematics group (http://cst.mi.fu-berlin.de).
|
||||
# ------------------------------------------------------------------------------
|
||||
# This file is part of FeuerWare.
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify it under
|
||||
# the terms of the GNU General Public License as published by the Free Software
|
||||
# Foundation, either version 3 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# FeuerWare is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along with
|
||||
# this program. If not, see http://www.gnu.org/licenses/ .
|
||||
# ------------------------------------------------------------------------------
|
||||
# For further information and questions please use the web site
|
||||
# http://scatterweb.mi.fu-berlin.de
|
||||
# and the mailinglist (subscription via web site)
|
||||
# scatterweb@lists.spline.inf.fu-berlin.de
|
||||
# ******************************************************************************
|
||||
# $Id$
|
||||
|
||||
SubDir TOP board msb-430h ;
|
||||
|
||||
Module board : board_init.c debug_uart.c ;
|
||||
UseModule board ;
|
||||
|
||||
Module board_cc1100 : driver_cc1100.c ;
|
||||
|
||||
SubInclude TOP cpu $(CPU) ;
|
@ -0,0 +1,37 @@
|
||||
# ******************************************************************************
|
||||
# Copyright 2009, Freie Universitaet Berlin (FUB). All rights reserved.
|
||||
#
|
||||
# These sources were developed at the Freie Universitaet Berlin, Computer
|
||||
# Systems and Telematics group (http://cst.mi.fu-berlin.de).
|
||||
# ------------------------------------------------------------------------------
|
||||
# This file is part of FeuerWare.
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify it under
|
||||
# the terms of the GNU General Public License as published by the Free Software
|
||||
# Foundation, either version 3 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# FeuerWare is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along with
|
||||
# this program. If not, see http://www.gnu.org/licenses/ .
|
||||
# ------------------------------------------------------------------------------
|
||||
# For further information and questions please use the web site
|
||||
# http://scatterweb.mi.fu-berlin.de
|
||||
# and the mailinglist (subscription via web site)
|
||||
# scatterweb@lists.spline.inf.fu-berlin.de
|
||||
# ******************************************************************************
|
||||
# $Id$
|
||||
|
||||
BOARD = msb-430h ;
|
||||
CPU = msp430 ;
|
||||
MCU = msp430x1612 ;
|
||||
|
||||
FLASH_PORT ?= /dev/ttyUSB0 ;
|
||||
FLASHER ?= mspdebug ;
|
||||
FLASHFLAGS ?= -d $(FLASH_PORT) -j uif ;
|
||||
|
||||
RESET ?= $(FLASHER) $(FLASHFLAGS) reset ;
|
||||
|
@ -0,0 +1,207 @@
|
||||
#include "cpu.h"
|
||||
#include "board.h"
|
||||
#include "kernel_intern.h"
|
||||
#include "msp430.h"
|
||||
#include "debug.h"
|
||||
|
||||
volatile static uint32_t __msp430_cpu_speed = MSP430_INITIAL_CPU_SPEED;
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static uint8_t calc_umctl(uint16_t br) {
|
||||
// from TI slaa049
|
||||
register uint8_t CMOD = 256 * br - 256 * (br + 1) / 2;
|
||||
register uint8_t c = 0;
|
||||
register int i = 0;
|
||||
register uint8_t a = CMOD;
|
||||
a <<= 1;
|
||||
do {
|
||||
if( a & 0x80 ) { // Overflow to integer?
|
||||
a = a - 128 + CMOD; // Yes, subtract 1.000000
|
||||
c |= 0x80;
|
||||
} else {
|
||||
a += CMOD; // No, add fraction
|
||||
}
|
||||
if( i == 7 )
|
||||
return c;
|
||||
i++;
|
||||
c >>= 1;
|
||||
} while(1);
|
||||
}
|
||||
|
||||
static void msb_ports_init(void)
|
||||
{
|
||||
// Port 1: Free port, for energy saving all outputs are set to zero.
|
||||
P1SEL = 0x00; // Port1 Zweitfunktion
|
||||
P1OUT = 0x00; // Port1 Ausgangsregister: 00000000 = 0x00
|
||||
P1DIR = 0xFF; // Port1 Direction: 11111111 = 0xFF
|
||||
|
||||
P2SEL = 0x20; // Port2 Zweitfunktion
|
||||
P2OUT = 0x00; // Port2 Ausgangsregister: 00000000 = 0x00
|
||||
P2DIR = 0x1C; // Port2 Direction: 00011010 = 0x1C
|
||||
// 0 - P2.0 [IN ] -
|
||||
// 0 - P2.1 [OUT] -
|
||||
// 1 - P2.2 [IN ] -
|
||||
// 1 - P2.3 [OUT] -
|
||||
// 1 - P2.4 [OUT] -
|
||||
// 0 - P2.5 [IN ] -
|
||||
// 0 - P2.6 [IN ] - SD-KARTE Protect
|
||||
// 0 - P2.7 [IN ] - SD-KARTE Detect
|
||||
|
||||
P3SEL = 0xC0; // Port3 Zweitfunktion
|
||||
P3OUT = 0x09; // Port3 Ausgangsregister: 00001001 = 0x09
|
||||
P3DIR = 0x2B; // Port3 Direction
|
||||
// 1 - P3.0
|
||||
// 1 - P3.1
|
||||
// 0 - P3.2
|
||||
// 1 - P3.3
|
||||
// 0 - P3.4 [IN ] - SHT 11 DATA (OUT/IN)
|
||||
// 1 - P3.5 [OUT] - SHT 11 CLK
|
||||
// 0 - P3.6 [2-Funktion] - RS232_RxD
|
||||
// 0 - P3.7 [2-Funktion] - RS232_TxD
|
||||
|
||||
// Port 4: Free port, for energy saving all outputs are set to zero.
|
||||
P4SEL = 0x00; // Port4 Zweitfunktion
|
||||
P4OUT = 0x00; // Port4 Ausgangsregister: 00000000 = 0x00
|
||||
P4DIR = 0xFF; // Port4 Direction: 11111111 = 0xFF
|
||||
// 1 - P4.0 [OUT] - unused
|
||||
// 1 - P4.1 [OUT] - unused
|
||||
// 1 - P4.2 [OUT] - unused
|
||||
// 1 - P4.3 [OUT] - unused
|
||||
// 1 - P4.4 [OUT] - unused
|
||||
// 1 - P4.5 [OUT] - unused
|
||||
// 1 - P4.6 [OUT] - unused
|
||||
// 1 - P4.7 [OUT] - unused
|
||||
|
||||
P5SEL = 0x00; // Port5 Zweitfunktion: 00000000 = 0x00
|
||||
P5OUT = 0x80; // Port5 Ausgangsregister: 00001001 = 0x09
|
||||
P5DIR = 0xFF; // Port5 Direction: 11111011 = 0xFB
|
||||
// 1 - P5.0 [OUT] - SD-KARTE /CS
|
||||
// 1 - P5.1 [OUT] - SD-KARTE DI
|
||||
// 0 - P5.2 [IN ] - SD-KARTE DO
|
||||
// 1 - P5.3 [OUT] - SD-KARTE DCLK
|
||||
// 1 - P5.4 [OUT] - MMA GS1
|
||||
// 1 - P5.5 [OUT] - MMA GS2
|
||||
// 1 - P5.6 [OUT] - MMA /SLEEP
|
||||
// 1 - P5.7 [OUT] - LED_ROT 0-an, 1-aus
|
||||
|
||||
P6SEL = 0x00; // Port6 Zweitfunktion = 0x07
|
||||
P6OUT = 0x00; // Port6 Ausgangsregister: 00000000 = 0x00
|
||||
P6DIR = 0xFF; // Port6 Direction: 11111000 = 0xF8
|
||||
// 0 - P6.0 [AD-IN] - MMA X-Achse
|
||||
// 0 - P6.1 [AD-IN] - MMA Y-Achse
|
||||
// 0 - P6.2 [AD-IN] - MMA Z-Achse
|
||||
// 1 - P6.3 [OUT] - unused
|
||||
// 1 - P6.4 [OUT] - unused
|
||||
// 1 - P6.5 [OUT] - unused
|
||||
// 1 - P6.6 [OUT] - unused
|
||||
// 1 - P6.7 [OUT] - unused
|
||||
}
|
||||
|
||||
void msp430_set_cpu_speed(uint32_t speed)
|
||||
{
|
||||
dint();
|
||||
__msp430_cpu_speed = speed;
|
||||
msp430_init_dco();
|
||||
uint16_t br;
|
||||
UCTL1 = SWRST | CHAR; // 8-bit character
|
||||
UTCTL1 |= SSEL1 | URXSE; // UCLK = MCLK
|
||||
// activate
|
||||
U1ME |= UTXE1 | URXE1; // Enable USART1 TXD/RXD
|
||||
br = (uint16_t)(__msp430_cpu_speed / 115200uL);
|
||||
UBR01 = br; // set baudrate
|
||||
UBR11 = br>>8;
|
||||
UMCTL1 = calc_umctl(br); // set modulation
|
||||
|
||||
UCTL1 &= ~SWRST;
|
||||
//clock_init();
|
||||
eint();
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void
|
||||
msp430_init_dco()
|
||||
{
|
||||
#if MSP430_HAS_EXTERNAL_CRYSTAL
|
||||
/*------------------ use external oszillator -----------------------*/
|
||||
uint16_t i;
|
||||
|
||||
// Stop watchdog
|
||||
WDTCTL = WDTPW + WDTHOLD;
|
||||
|
||||
//Init crystal for mclk
|
||||
//XT2 = HF XTAL
|
||||
BCSCTL1 = RSEL2;
|
||||
|
||||
// Wait for xtal to stabilize
|
||||
do {
|
||||
IFG1 &= ~OFIFG; // Clear oscillator fault flag
|
||||
for (i = 0xFF; i > 0; i--); // Time for flag to set
|
||||
}
|
||||
while ((IFG1 & OFIFG) != 0); // Oscillator fault flag still set?
|
||||
BCSCTL2 = SELM_2 + SELS; // MCLK und SMCLK = XT2 (safe)
|
||||
#else
|
||||
/* Thdeltais code taken from the FU Berlin sources and reformatted. */
|
||||
int delta = __msp430_cpu_speed >> 12;
|
||||
//#define DELTA 600
|
||||
|
||||
unsigned int compare, oldcapture = 0;
|
||||
unsigned int i;
|
||||
|
||||
|
||||
BCSCTL1 = 0xa4; /* ACLK is devided by 4. RSEL=6 no division for MCLK
|
||||
and SSMCLK. XT2 is off. */
|
||||
|
||||
// Init FLL to desired frequency using the 32762Hz crystal
|
||||
#if MSP430_HAS_DCOR
|
||||
BCSCTL2 = 0x01;
|
||||
#else
|
||||
BCSCTL2 = 0x00;
|
||||
#endif
|
||||
|
||||
WDTCTL = WDTPW + WDTHOLD; /* Stop WDT */
|
||||
BCSCTL1 |= DIVA1 + DIVA0; /* ACLK = LFXT1CLK/8 */
|
||||
for(i = 0xffff; i > 0; i--); /* Delay for XTAL to settle */
|
||||
|
||||
CCTL2 = CCIS0 + CM0 + CAP; // Define CCR2, CAP, ACLK
|
||||
TACTL = TASSEL1 + TACLR + MC1; // SMCLK, continous mode
|
||||
|
||||
|
||||
while(1) {
|
||||
|
||||
while((CCTL2 & CCIFG) != CCIFG); /* Wait until capture occured! */
|
||||
CCTL2 &= ~CCIFG; /* Capture occured, clear flag */
|
||||
compare = CCR2; /* Get current captured SMCLK */
|
||||
compare = compare - oldcapture; /* SMCLK difference */
|
||||
oldcapture = CCR2; /* Save current captured SMCLK */
|
||||
|
||||
if(delta == compare) {
|
||||
break; /* if equal, leave "while(1)" */
|
||||
} else if(delta < compare) { /* DCO is too fast, slow it down */
|
||||
DCOCTL--;
|
||||
if(DCOCTL == 0xFF) { /* Did DCO role under? */
|
||||
BCSCTL1--;
|
||||
}
|
||||
} else { /* -> Select next lower RSEL */
|
||||
DCOCTL++;
|
||||
if(DCOCTL == 0x00) { /* Did DCO role over? */
|
||||
BCSCTL1++;
|
||||
}
|
||||
/* -> Select next higher RSEL */
|
||||
}
|
||||
}
|
||||
|
||||
CCTL2 = 0; /* Stop CCR2 function */
|
||||
TACTL = 0; /* Stop Timer_A */
|
||||
|
||||
BCSCTL1 &= ~(DIVA1 + DIVA0); /* remove /8 divisor from ACLK again */
|
||||
#endif
|
||||
}
|
||||
|
||||
void board_init() {
|
||||
msp430_cpu_init();
|
||||
msb_ports_init();
|
||||
|
||||
RED_ON;
|
||||
|
||||
msp430_set_cpu_speed(7372800uL);
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
#include "board.h"
|
||||
|
||||
#define UART1_TX TXBUF1
|
||||
#define UART1_WAIT_TXDONE() while( (UTCTL1 & TXEPT) == 0 ) { _NOP(); }
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
int putchar(int c)
|
||||
{
|
||||
UART1_TX = c;
|
||||
UART1_WAIT_TXDONE();
|
||||
|
||||
if (c == 10) {
|
||||
UART1_TX = 13;
|
||||
UART1_WAIT_TXDONE();
|
||||
}
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,343 @@
|
||||
/* Copyright (C) 2005, 2006, 2007, 2008 by Thomas Hillebrandt and Heiko Will
|
||||
|
||||
This file is part of the Micro-mesh SensorWeb Firmware.
|
||||
|
||||
Micro-Mesh is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3, or (at your option)
|
||||
any later version.
|
||||
|
||||
Micro-Mesh is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with Micro-Mesh; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <board.h>
|
||||
#include <cpu.h>
|
||||
#include <irq.h>
|
||||
|
||||
#include <cc1100.h>
|
||||
#include <arch_cc1100.h>
|
||||
|
||||
#define CC1100_GDO0 (P2IN & 0x02) // read serial I/O (GDO0)
|
||||
#define CC1100_GDO1 (P3IN & 0x04) // read serial I/O (GDO1)
|
||||
#define CC1100_GDO2 (P2IN & 0x01) // read serial I/O (GDO2)
|
||||
|
||||
#define CC1100_CS_LOW (P3OUT &= ~0x01)
|
||||
#define CC1100_CS_HIGH (P3OUT |= 0x01)
|
||||
|
||||
#define CC1100_GDO1_LOW_COUNT (2700) // loop count (timeout ~ 500 us) to wait
|
||||
#define CC1100_GDO1_LOW_RETRY (100) // max. retries for GDO1 to go low
|
||||
|
||||
volatile int abort_count;
|
||||
volatile int retry_count = 0;
|
||||
|
||||
void cc1100_gdo0_enable(void)
|
||||
{
|
||||
P2IFG &= ~0x02; /* Clear IFG for GDO0 */
|
||||
P2IE |= 0x02; /* Enable interrupt for GDO0 */
|
||||
}
|
||||
|
||||
void cc1100_gdo0_disable(void)
|
||||
{
|
||||
P2IE &= ~0x02; /* Disable interrupt for GDO0 */
|
||||
P2IFG &= ~0x02; /* Clear IFG for GDO0 */
|
||||
}
|
||||
|
||||
void cc1100_gdo2_enable(void)
|
||||
{
|
||||
P2IFG &= ~0x01; /* Clear IFG for GDO2 */
|
||||
P2IE |= 0x01; /* Enable interrupt for GDO2 */
|
||||
}
|
||||
|
||||
void cc1100_gdo2_disable(void)
|
||||
{
|
||||
P2IE &= ~0x01; /* Disable interrupt for GDO2 */
|
||||
P2IFG &= ~0x01; /* Clear IFG for GDO2 */
|
||||
}
|
||||
|
||||
void cc1100_before_send(void)
|
||||
{
|
||||
// Disable GDO2 interrupt before sending packet
|
||||
|