Jump to content
43oh

Rickta59

Members
  • Content Count

    1,135
  • Joined

  • Last visited

  • Days Won

    71

Reputation Activity

  1. Like
    Rickta59 reacted to greeeg in Epaper desk calendar   
    Hi all,
     
    So basically instead of buying another one of those desk calendars that you tear of each day as it goes by I decided to make use of an epaper display from Sparkfun (that up until last week had been collecting dust) to create a digital daily calendar.
     
    The screen fits 20 16 segment digits on 2 lines. This gives enough room to display the current day of the week, and date. It is powered by a Li-ion cell from an old laptop battery, rated at 2.4Ah. (My estimates put the battery dying in about 200 years, as this draws ~20mAh for ~6 seconds every 24 hours )

     
    This was originally a launchpad project but I ported it to a F2013 board by changing one line, Shows how universal the code is
    The current hardware consists of a F2013 board that I got free from TI during one of their promo's. The board is soldered directly to the back of the epaper breakout board.

     
    The code is attached. The 2kb of flash available on the MSP430F2013 didn't give much wriggle room. currently the code compiles with about 64 bytes of flash free.
    Due to the sparkfun breakout board not breaking out the enable pin for the on board boost circuit I found to achieve reasonable low power consumption I had to connect the power Pins of the display to IO pins on the MSP430F2013

    main.c
  2. Like
    Rickta59 reacted to voodoofish in 25AA320A SPI eeprom read and write   
    Posted my code to github for others to pull down and use.
    It's not clean(I'm still a nube), but it works. currently it just writes to 1 memory location, but can easily be modified for whatever purposes. I still also need to add more functions as I have not completed it...this will be done soon.
    Thanks to Rickta59 for his post related to the 23k256 ram chip. It helped to look at someone elses code and confirm that mine in fact should have worked...I liked his streamlined code as well...so I may integrate that into the next version.
    Also thanks to fj604, though he doesn't know it, but his code also was useful and used in part for the timer related code from his max6957 project.
     
    As a short description of the problem. I was running into issues with reading the memory after writing to location X. When stepping through, I would get the correct value, but when allowing the code to just run I would get 0 for the read data. I added a timer delay (fj604 code)after the write which gives the chip enough time to wait for the memory to be written. I could have sworn I had tried something similar and it didn't work, but this one did. The timer value will most likely need to be changed based on the the mclk and smclk....so that will be up to the person using this to figure it out.
    This was run on a G2231 chip running at the base 1mhz.
     
    https://github.com/voodoofish/MemoryWriter25AA320A
  3. Like
    Rickta59 got a reaction from timsoer in Use a 12MHZ external square wave as MCLK   
    I've been looking for a way to run the msp430 with accurate MHZ speeds. In talking
    with NatureTM on IRC, he mentioned that he had used a crystal oscillator ( ECS-100A-160 ) successfully
    with his msp430g2231. He didn't have the exact code he used but he helped me recreate this snippet.
     
    I didn't have a crystal oscillator but I did have an ATTiny84 lying around that I put on a breadboard.
    I reprogrammed the ATTiny84 fuses so its CLKOUT fuse bit was enabled. The ATTiny is using an external
    12MHZ crystal. This is fairly accurate, when you enable the CLKOUT fuse, avr outputs the
    CPU clock on that pin as a square wave. I connected that pin to the XIN on my msp430g2231
    and left XOUT unconnected.
     
    I'm not sure if this is going to damage my g2231 as the specs say you should only feed it low
    frequency external square waves from 10k - 50k. So don't expect this to actually work. I'm
    just passing along what I've discovered.
     
    https://gist.github.com/954778
     
    -rick
     

    //*********************************************************** // runfast.c - Using 12MHZ external square wave clock as LFXTCLK // source MCLK/SMCLK from 12MHZ wave and blink led // at 60Hz // // Use an external clock ( I'm using an attiny running at 12.00 MHZ // with the CLKOUT fuse enabled ) as the MCLK/SMCLK for the MSP430. // I've been told you could also use an external oscillator like an // ECS-100A-160. I ordered some of these to verify. // // LFXT1 oscillator logic level square wave input frequency, LF mode // // XIN - external clock in from attiny CLKOUT pin ( set avr fuse to get clock ) // XOUT - NC // P1.0 - led on until OSCFault cleared // P1.4 - SMCLK frequency, measuer with multimeter/oscope // P1.6 - 60Hz led flash, measure with multimeter/oscope // //*********************************************************** #include void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer P1DIR = BIT0 | BIT6 | BIT4; // P1.0 and P1.6 output, P1.4 SMCLK frequency P1SEL = BIT4; // P1.4 output SMCLK on P1.4, measure with multi meter P1OUT = BIT0; // red LED on until OSCFault is cleared DCOCTL = 0x00; BCSCTL2 = SELM_3 + DIVM_0 + SELS + DIVS_0; // MCLK Source Select 3: LFXTCLK // MCLK/1 SMCLK/1 SMCLK LFXTCLK BCSCTL1 |= XTS; // XTS BCSCTL3 = LFXT1S_3 | XCAP_0; // LFXT1 = 12MHZ crystal, No Capacitor // not sure if this is needed while(IFG1 & OFIFG) { IFG1 &= ~OFIFG; // Clear OSCFault flag _delay_cycles(10000); // delay for flag and visibility } P1OUT = 0; // red LED off __bis_SR_register(SCG0); // Stop DCO, we just use the LFXT1 which is // actually running at 12MHZ while(1) { P1OUT ^= BIT6; // green LED on, measure this, it should be 60Hz _delay_cycles((12000000/60/2)-35); // 12MHZ, 60/2, 35 overhead clocks } }
  4. Like
    Rickta59 reacted to gordon in IR Booster Pack   
    Here's a little Payload (yeah, let's add some more confusion ) for IR communications. It's basically completely oPossum's EHP TV-B-Gone design for the transmitter part, and also oPossum's IR Widget for the receiver parts. You may think of it as Dangerous Prototypes' USB IR Toy for the LaunchPad, but with more oomph.
     
    There's a healthy list of compile-time configurability and features:
     


    [*:22nw21ko]selectable transmitter power source (LP's VCC or external)
    [*:22nw21ko]FTDI cable-compatible RX/TX breakout for the capturing sessions when 9k6 is not enough, selectable for both pre-'2553 and '2553-style RX/TX pinout
    [*:22nw21ko]IR demodulator for your remote
    [*:22nw21ko]IR photodiode for capturing your unknown remote's codes
    [*:22nw21ko]five transmitter blocks (wire in as few or as many as you actually need)
    [*:22nw21ko]all of these are functions are wired to pins where they make most sense
    [*:22nw21ko]unused pins brought out to a tiny bit of a prototyping area so you can do this properly right on the board
    [*:22nw21ko]all of this in 1206 so you can build it even if your kit is a copper rod and a BBQ fireplace
     
    Software-wise there's nothing overly usable yet, but the CIR capture thread and the IR Widget writeup is more or less what one needs to get going.
     
    A big "thank you" to oPossum is quite in order; he has been invaluable help. Thank you!
     


     
    I am now seeking input as to what else might be there you'd like added (though I want to keep it IR-only, and it's pretty good at that , or anything else you may want to add. I'll keep this afloat for a couple of days, then replace these design files with the final ones.(The Eagle files will come soon, when Bluehash allows .sch/.brd attachments :mrgreen: )
    ir8.sch
    ir8.brd
  5. Like
    Rickta59 reacted to oPossum in Digital Picture Frame Thermometer   
    A digital picture frame is used as a thermometer. Pictures representing a range of temperature are displayed by simulating the press of the next or previous buttons on the picture frame. This makes the project very simple by avoiding having to drive the LCD directly with the microcontroller. The high resolution backlit display is much more readable than the usual reflective monochrome LCD thermometer and the pictures can be as simple or fancy as you want.
     
    A Maxim DS1820, DS18S20, DS18B20 or DS1822 temperature sensor can be used. The code will adapt to any of these models. The DS18B20 is recommend.
     
    The main code is written in C and uses assembly libraries for speed and precision timing. All the assembly code has been posted previously: Dallas/Maxim one wire library, Fast itoa() for CCS, and Compact serial tx
     
    Typical wiring

     
    Simple text display on picture frame. The text color changes with temperature (blue -> green -> yellow -> red)

     
    Serial output shows Deg C, Deg F, Displayed temperature, and up/down actions.

     
    Excerpt from main.c showing how the temperature sensor is read and the display is updated when necessary. Hysteresis is used to ensure a stable display.

    do { // puth(owrst()); // Reset puth(owwb(0x33)); // Read ROM puts("\r\n"); // } while(!read_block(id, 9)); // Read ID and serial show_block(id, 8); // // for(; { // print_temp(tc); // Show Deg C on terminal print_temp(tf); // Show Deg F on terminal itoa(display, s); puts(s); // Show displayed temperature on terminal // delta = tf - (display << 4); // Difference between measured and displayed // if(delta > hyst) { // - Above displayed ++display; // Increment displayed pb(1 << up_pin); // Push up button puts(" Up"); // } else if(-delta > hyst) { // - Below displayed --display; // Decrement displayed pb(1 << down_pin); // Push down button puts(" Down"); // } // puts("\r\n"); // // tc = tf = error_temp << 4; // Default to error temperature if(!owrst()) continue; // Convert if(owww(0x44CC) != 0x44CC) continue; // delay_ms(800); // Wait for conversion to complete if(!owrst()) continue; // Read temperature if(owww(0xBECC) != 0xBECC) continue; // if(read_block(b, 9)) continue; // // tc = b[1]; tc <<= 8; tc |= b[0]; // All if(id[0] == 0x10) { // DS1820 and DS18S20 only tc <<= 3; // Convert 1/2 C resolution to 1/16 C resolution if(b[7] == 16) { // DS18S20 12 bit only (divisor of DS1820 is not fixed at 16) tc &= 0xFFF0; tc = tc + 12 - b[6]; // Update with residual count for 1/16 C resolution } // } // tf = ((tc + (tc << 3)) + 2562 ) / 5; // Convert deg C to deg F }
     
    Complete code
    dpft.zip
  6. Like
    Rickta59 reacted to oPossum in TV-B-Gone using Launchpad   
    This is a reimplementation of adafruit's TV-B-Gone kit. It has been written from scratch to be more efficient and more precise than the AVR version. Assembly code is used for the critical timing, everything else is in C. Clock is 1 MHz (vs. 8 MHz for AVR).
     
    This code is small enough to fit in a G2231 (2K flash, 128 RAM) that comes with the launchpad. There are only 39 codes due to limited flash capacity. Obviously larger parts like the G2553 could be used to fit all codes and add additional features.
     
    main code (excerpt)

    void send_code(TIRCODE * const ic) { const uint8_t *code_byte; unsigned code_bitmask; static uint8_t idx[100]; // static so it is not on the stack unsigned n, j; uint8_t *p; // Make sure there is room for all indicies if(ic->pair_count > sizeof(idx)) return; // Convert variable bit count to uint8_t n = ic->pair_count; code_byte = ic->bitstream; code_bitmask = 0x80; p = idx; // Iterate indicies while(n--) { *p = 0; j = ic->bits_per_index; // Iterate bits while(j--) { *p <<= 1; if(*code_byte & code_bitmask) *p |= 4; code_bitmask >>= 1; if(!code_bitmask) ++code_byte, code_bitmask = 0x80; } ++p; } if(ic->carrier_period) { TACCR0 = ic->carrier_period; TACCR1 = ic->carrier_period >> 1; tx_ir_carrier(ic->pair_count, idx, ic->durations); } else { tx_ir_pulse(ic->pair_count, idx, ic->durations); } } void main(void) { unsigned n; WDTCTL = WDTPW + WDTHOLD; // Disable watchdog // DCOCTL = 0; // Use 1 MHz calibration BCSCTL1 = CALBC1_1MHZ; // DCOCTL = CALDCO_1MHZ; // // // See chart for I/O assignment P1OUT = 0x0E; // Txd, Rxd, S2 high P1REN = 0x0C; // Rxd / S2 pullup enabled P1DIR = 0xF3; // Rxd / S2 in, all others out P1SEL = 0x50; // Timer A T0.1 / SMCLK TACTL = TASSEL_2 | MC_1; // Clock = SMCLK, Mode = UP // do { // /// todo: Sleep while waiting for S2 press // while(P1IN & 8); // Wait for S2 press // for(n = 0; n < code_count; ++n) { // P1OUT |= 0x01; // LED on delay10us(450 * 100u); // Wait 450 ms P1OUT &= ~0x01; // LED off send_code(CodeList[n]); // Send code } // } while(1); // }
     
    ir transmission code (excerpt)

    tx_ir_carrier ; void tx_ir_carrier(unsigned n, uint8_t *i, TDUR *d) ; R12 Duration pair count ; R13 Pointer to duration indicies ; R14 Pointer to durations ; mov #OUTMOD_7, R10 ; IR Carrier On (reset/set output mode) mov #OUTMOD_5, R11 ; IR Carrier Off (reset output mode) ; ir_tx_loop mov.b @R13, R15 ; Get duration index add R14, R15 ; Add duration pointer mov @R15, R15 ; Get duration ; mov R10, &TACCTL1 ; Turn on IR call #delay ; Wait for on duration ; nop2 ; Precise timing ; mov.b @R13+, R15 ; Get duration index and increment pointer incd R15 ; Adjust for off duration add R14, R15 ; Add duration pointer mov @R15, R15 ; Get duration ; mov R11, &TACCTL1 ; Turn off IR call #delay ; Wait for off duration ; dec R12 ; Decrement pair count jne ir_tx_loop ; Do next duration pair... ; ret ; Return ; ; ; ; - Delay in units of 10 cycles (10 us at 1 MHz) delay cmp #4, R15 ; Compare to minimum jlo dlyret ; Below minimum, return... sub #2, R15 ; Adjust loop count for overhead jmp eloop ; Make the first iteration shorter ; delay10us mov R12, R15 ; C callable ; dloop nop2 ; 7 cycles of nop nop2 ; nop2 ; eloop nop ; dec R15 ; Decrement loop count - 1 cycle jne dloop ; Loop if not zero - 2 cycles ; dlyret ret ;
     
    Complete code attached
    tvbg_lp.zip
  7. Like
    Rickta59 reacted to bluehash in Booster pack sub-forum   
    Hello everyone,
     
    First, we should start calling shields as booster packs. What do you guys say?
     
    Second, since many members are creating extension boards, would it be better to have a sub-forum under dev kits, so that they can all be in one place? Your boards also get exposure.
     
     
    Yes/No?
  8. Like
    Rickta59 got a reaction from oPossum in Compact async serial tx   
    : ) unfortunately no one seemed to pick up on my hint of getting the code to work with msp430-gcc.
    I gave it a try. You probably need a uniarch version of msp430-gcc to get the #include working:
     

    ; ; Copyright (C) 2011 Kevin Timmerman ; ; 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. ; ; This program 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 . ; ; ; #include "msp430g2452.h" .file "serial.s" .arch msp430g2452 .cpu 430 .mpy none .comm bit_dur,2,2 .comm bit_mask,2,2 .text .p2align 1,0 .global serial_setup .type serial_setup,@function /************************************************************ * void serial_setup(unsigned bitmask, unsigned bit_dur) */ serial_setup: mov R15, &bit_mask ; Save serial output bitmask sub #16, R14 ; Adjust count for loop overhead rla R14 ; 4 cycle loop decrements by 8 to ensure even remainder mov R14, &bit_dur ; Save bit duration initial count ret ; Return .Lfe1: .size serial_setup,.Lfe1-serial_setup ;; End of function .p2align 1,0 .global putc .type putc,@function /************************************************************ * void putc(int c) */ putc: ; Char to tx in r15 ; r15, R14, r12 trashed mov &bit_mask, r12 ; Serial output bitmask mov &bit_dur, R14 ; Bit duration bis #0x0300, r15 ; Stop bit(s) jmp bit_low ; Send start bit bit_loop: mov R14, R13 ; Get bit duration bit_time: nop ; 4 cycle loop sub #8, R13 jc bit_time ; subc R13, r0 ; 0 to 3 cycle delay nop ; 3 nop ; 2 nop ; 1 rra r15 ; Get bit to tx, test for zero jc bit_high ; If high... bit_low: bic.b r12, &0x0021 ; Send zero bit P1OUT=0x0021 jmp bit_loop ; Next bit... bit_high: bis.b r12, &0x0021 ; Send one bit jnz bit_loop ; If tx data is not zero, then there are more bits to send... ret_ins: ret ; Return when all bits sent .Lfe2: .size putc,.Lfe2-putc ;; End of function .p2align 1,0 .global puts .type puts,@function /************************************************************ * void puts(char *s) */ puts: push r9 mov r15,r9 putsloop: mov.b @r9+, r15 tst.b r15 jz puts_exit call #putc jmp putsloop puts_exit: pop r9 ret .Lfe3: .size puts,.Lfe3-puts ;; End of function
     
    Also here for the grabbing:
    https://gist.github.com/1220877
     
    -rick
  9. Like
    Rickta59 reacted to oPossum in Fast itoa() for CCS   
    itoa() is not part of the standard C library and is absent from CCS.
     
    Here are three functions to convert signed and unsigned integers to ASCII. They are written for speed, not compactness.
     
    void itoa(int, char *); // Convert signed integer to ASCII
    void utoa(unsigned, char *); // Convert unsigned integer to ASCII
    void btoa(unsigned, char *); // Convert unsigned char to ASCII (leading spaces)
     
    itoa() and utoa()

    utoa ; --- Unsigned to ASCII --- ; - Range 0 to 65535 ; - Leading zeros supressed push R10 ; clr R14 ; Clear packed BCD mov #-1, R10 ; Flag as positive rla R12 ; Get bit 15 of binary jmp unsigned ; itoa ; --- Integer to ASCII --- ; - Range -32768 to +32767 ; - Leading zeros supressed push R10 ; clr R14 ; Clear packed BCD rla R12 ; Get bit 15 of binary subc R10, R10 ; Save sign bit jne notneg ; Positive... inv R12 ; Negate negative numbers inc R12 ; This will overflow only for -32768 unsigned ; dadd R14, R14 ; Multiply BCD by 2 and add binary bit notneg ; .loop 12 ; Do 12 bits rla R12 ; Get bit 14 to 3 of binary dadd R14, R14 ; Multiply BCD by 2 and add binary bit .endloop ; clr R15 ; Clear digit 1 of packed BCD .loop 3 ; Do 3 bits rla R12 ; Get bit 2 to 0 of binary dadd R14, R14 ; Multiply BCD by 2 and add binary bit dadd R15, R15 ; .endloop ; swpb R14 ; Swap digit order mov R14, R12 ; Copy packed BCD digits and #0x0F0F, R12 ; Mask digits 5 & 3 rra R14 ; Shift digits 4 & 2 to lower nibble rra R14 ; rra R14 ; rra R14 ; and #0x0F0F, R14 ; Mask digits 4 & 2 tst R10 ; Negative? jne nosign ; No, skip sign... mov.b #'-', 0(R13) ; Negative sign to string inc R13 ; nosign ; mov #('0' << 8) | '0', R10 ; Make ASCII add R10, R12 ; add R10, R14 ; add R10, R15 ; cmp.b R10, R15 ; Is first digit a 0? jne dig5 ; No... cmp.b R10, R14 ; Is second digit a 0? jne dig4 ; No, only the first... cmp.b R10, R12 ; Is third digit a 0? jne dig3 ; No, only the first two... cmp R10, R14 ; Is fourth digit a 0? (second is zero) jne dig2 ; No, only the first three... dig1 ; First four digits are all 0 swpb R12 ; Fifth digit to string mov.b R12, 0(R13) ; inc R13 ; clr.b 0(R13) ; NULL terminate string pop R10 ; reta ; Return ; dig5 ; mov.b R15, 0(R13) ; First digit to string inc R13 ; dig4 ; mov.b R14, 0(R13) ; Second digit to string inc R13 ; dig3 ; mov.b R12, 0(R13) ; Third digit to string inc R13 ; dig2 ; swpb R14 ; Fourth digit to string mov.b R14, 0(R13) ; inc R13 ; jmp dig1 ; ;
    btoa()

    btoa ; --- Byte to ASCII --- ; - Range 0 to 255 ; - Leading zeros converted to spaces clr R14 ; Clear packed BCD swpb R12 ; Move LSB to MSB .loop 8 ; Do 8 bits rla R12 ; Get a bit of binary dadd R14, R14 ; Multiply BCD by 2 and add binary bit .endloop ; ; mov R14, R12 ; Copy packed BCD digits and #0x0F0F, R12 ; Mask digits 1 & 3 mov #('0' << 8) | '0', R15 ; Make ASCII add R15, R12 ; mov.b R12, 2(R13) ; Move digit 3 to bcd[2] swpb R12 ; Swap digits 1 & 3 mov.b R12, 0(R13) ; Move digit 1 to bcd[0] rra R14 ; Shift digit 2 to lower nibble rra R14 ; rra R14 ; rra R14 ; and #0x0F0F, R14 ; Mask digit 2 add R15, R14 ; Make ASCII mov.b R14, 1(R13) ; Move digit 2 to bcd[1] clr.b 3(R13) ; NULL terminate string cmp.b R15, 0(R13) ; Is first digit a 0? jne b2aex ; No... cmp.b R15, 1(R13) ; Is second digit a 0? jne b2a2d ; No, only the first.. mov #(' ' << 8) | ' ', 0(R13); Make first two digits spaces reta ; Return b2a2d ; mov.b #' ', 0(R13) ; Make first digit a space b2aex ; reta ; Return
    itoa.zip
  10. Like
    Rickta59 got a reaction from bluehash in Compact async serial tx   
    : ) unfortunately no one seemed to pick up on my hint of getting the code to work with msp430-gcc.
    I gave it a try. You probably need a uniarch version of msp430-gcc to get the #include working:
     

    ; ; Copyright (C) 2011 Kevin Timmerman ; ; 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. ; ; This program 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 . ; ; ; #include "msp430g2452.h" .file "serial.s" .arch msp430g2452 .cpu 430 .mpy none .comm bit_dur,2,2 .comm bit_mask,2,2 .text .p2align 1,0 .global serial_setup .type serial_setup,@function /************************************************************ * void serial_setup(unsigned bitmask, unsigned bit_dur) */ serial_setup: mov R15, &bit_mask ; Save serial output bitmask sub #16, R14 ; Adjust count for loop overhead rla R14 ; 4 cycle loop decrements by 8 to ensure even remainder mov R14, &bit_dur ; Save bit duration initial count ret ; Return .Lfe1: .size serial_setup,.Lfe1-serial_setup ;; End of function .p2align 1,0 .global putc .type putc,@function /************************************************************ * void putc(int c) */ putc: ; Char to tx in r15 ; r15, R14, r12 trashed mov &bit_mask, r12 ; Serial output bitmask mov &bit_dur, R14 ; Bit duration bis #0x0300, r15 ; Stop bit(s) jmp bit_low ; Send start bit bit_loop: mov R14, R13 ; Get bit duration bit_time: nop ; 4 cycle loop sub #8, R13 jc bit_time ; subc R13, r0 ; 0 to 3 cycle delay nop ; 3 nop ; 2 nop ; 1 rra r15 ; Get bit to tx, test for zero jc bit_high ; If high... bit_low: bic.b r12, &0x0021 ; Send zero bit P1OUT=0x0021 jmp bit_loop ; Next bit... bit_high: bis.b r12, &0x0021 ; Send one bit jnz bit_loop ; If tx data is not zero, then there are more bits to send... ret_ins: ret ; Return when all bits sent .Lfe2: .size putc,.Lfe2-putc ;; End of function .p2align 1,0 .global puts .type puts,@function /************************************************************ * void puts(char *s) */ puts: push r9 mov r15,r9 putsloop: mov.b @r9+, r15 tst.b r15 jz puts_exit call #putc jmp putsloop puts_exit: pop r9 ret .Lfe3: .size puts,.Lfe3-puts ;; End of function
     
    Also here for the grabbing:
    https://gist.github.com/1220877
     
    -rick
  11. Like
    Rickta59 got a reaction from zborgerd in Compact async serial tx   
    : ) unfortunately no one seemed to pick up on my hint of getting the code to work with msp430-gcc.
    I gave it a try. You probably need a uniarch version of msp430-gcc to get the #include working:
     

    ; ; Copyright (C) 2011 Kevin Timmerman ; ; 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. ; ; This program 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 . ; ; ; #include "msp430g2452.h" .file "serial.s" .arch msp430g2452 .cpu 430 .mpy none .comm bit_dur,2,2 .comm bit_mask,2,2 .text .p2align 1,0 .global serial_setup .type serial_setup,@function /************************************************************ * void serial_setup(unsigned bitmask, unsigned bit_dur) */ serial_setup: mov R15, &bit_mask ; Save serial output bitmask sub #16, R14 ; Adjust count for loop overhead rla R14 ; 4 cycle loop decrements by 8 to ensure even remainder mov R14, &bit_dur ; Save bit duration initial count ret ; Return .Lfe1: .size serial_setup,.Lfe1-serial_setup ;; End of function .p2align 1,0 .global putc .type putc,@function /************************************************************ * void putc(int c) */ putc: ; Char to tx in r15 ; r15, R14, r12 trashed mov &bit_mask, r12 ; Serial output bitmask mov &bit_dur, R14 ; Bit duration bis #0x0300, r15 ; Stop bit(s) jmp bit_low ; Send start bit bit_loop: mov R14, R13 ; Get bit duration bit_time: nop ; 4 cycle loop sub #8, R13 jc bit_time ; subc R13, r0 ; 0 to 3 cycle delay nop ; 3 nop ; 2 nop ; 1 rra r15 ; Get bit to tx, test for zero jc bit_high ; If high... bit_low: bic.b r12, &0x0021 ; Send zero bit P1OUT=0x0021 jmp bit_loop ; Next bit... bit_high: bis.b r12, &0x0021 ; Send one bit jnz bit_loop ; If tx data is not zero, then there are more bits to send... ret_ins: ret ; Return when all bits sent .Lfe2: .size putc,.Lfe2-putc ;; End of function .p2align 1,0 .global puts .type puts,@function /************************************************************ * void puts(char *s) */ puts: push r9 mov r15,r9 putsloop: mov.b @r9+, r15 tst.b r15 jz puts_exit call #putc jmp putsloop puts_exit: pop r9 ret .Lfe3: .size puts,.Lfe3-puts ;; End of function
     
    Also here for the grabbing:
    https://gist.github.com/1220877
     
    -rick
  12. Like
    Rickta59 got a reaction from Tribes in Full-duplex software UART for launchpad   
    So this code snippet springs forth from my desire to use a terminal emulator ( I like putty best ) with my launchpad via the built-in COM port. Simple I think, someone must have already done this by now, no? Well, trying to find a working example for the launchpad led me down a lot of dead ends with nothing that worked well. I did find examples that were half-duplex and ones that required more Timer features than you find on the msp430g2231. Unfortunately, none of them fit my requirements.
     
    My goal was to find something that would allow me to use higher DCO clock speeds such as 16MHZ. I also wanted to be able to run reliably with 115k baud rates, so that I can connect a serial to TCP proxy and make my launchpad web enabled.
     
    I've implemented something here that meets both of those goals. Well sort of. I discovered that the COM port on the launchpad will only work up to 9600 baud. However, you can disconnect the jumpers and plug your RX/TX lines into an FT232RL device and get higher speeds. It also works well if your goal is to interface to some other device via TTL level RS232, say a GPS device.
     
    You can find the code here:
     
    https://github.com/RickKimball/msp430softserial
     
    Because everything is better with pictures, I took a snapshot of the RX line receiving the character 'U' at 9600 baud. 'U' is unique in that it forms a perfect clock wave 0 10101010 1 when you add the stop and start bits. The green line is the RX line, the red line is me toggling a debug pin inside of the RX ISR routine. I used a program called Soundcard Oscilloscope that helped me dial in the proper timing so that I was sampling in the center of each data bit. http://www.zeitnitz.de/Christian/scope_en
     

     
    In the picture above, you'll notice that the first red crossing takes longer than the other samplings, that is because we just ignore the value of the start bit and start sampling in the center of the first data bit.
     
    To use and test the code, download it from github and bring it into CCS. Once it is running figure out which COM port your launchpad is using and connect to it with a terminal emulator like putty or minicom using 9600 baud. The default configuration expects you to have soldered a 32.768k crystal to the launchpad board. It uses the crystal to calibrate the DCO for a higher MHZ speed. Don't worry, I don't write it to flash, I just calibrate it and use it. However, you can edit the config.h to modify the baud rate and MCLK speed. You can even run it at the default MCLK speed. See the config.h file comments for more information.
     
    I think I've commented the code fairly well. However, this is actually my first published project with the MSP430 launchpad so comments are welcome. So enjoy!
     
    -rick
  13. Like
    Rickta59 got a reaction from jschilen in MSP-EXP430FR5739 demo code ported to msp430-gcc   
    Once the new version of mspdebug comes out with support for the MSP430FR5739 chip
    which is in the FRAM experimenter board, you are going to want something more than just
    a blinky program to see if it works on your system.
     
    I modified the User Experience Code Demo code for the MSP-EXP430FR5739 so that it
    compiles with the latest msp430-gcc.
     
    Find it here: https://gist.github.com/1057857
     
    -rick
  14. Like
    Rickta59 reacted to oPossum in Precision 12 MHz clock for Launchpad MCU   
    The MSP430F1612 on the Launchpad provides a 12 MHz clock to the TUSB3410 chip. This clock can also be used by the MSP430 in the 20 pin socket.
     
    Clock on pin 49 of F1612

     
    Mask off pin 49 with Kapton tape and solder a 1k resistor to the pin.
    Connect the other end of the resistor to the lower pad of C21 using a short wire.
     

     
    This test program will flash the red LED five times with the DCO at ~1 MHz and then switch to the 12 MHz external clock.
     

    #include "msp430g2231.h" void main(void) { unsigned i; volatile unsigned n = 0; WDTCTL = WDTPW | WDTHOLD; P1DIR = 0x01; P1SEL = 0x00; i = 10; do { P1OUT ^= 1; while(--n); } while(--i); BCSCTL3 = LFXT1S0 | LFXT1S1; // - Set XT1 clock type as external do { // - Wait for MSP430 to detect clock is stable IFG1 &= ~OFIFG; // Clear OFIFG n = 250; while(--n); // Wait a while } while(IFG1 & OFIFG); // Loop until OFIFG remains cleared BCSCTL2 = SELM1 | SELM0 | SELS; // - Use LFXT1CLK as clock source do { P1OUT ^= 1; while(--n); } while(1); }
  15. Like
    Rickta59 got a reaction from amstan in Full-duplex hardware UART for launchpad   
    Now that I have a freshly minted uniarch version of msp430-gcc, I wanted to test it out and make sure the newly added support for the msp430g2553 chip really worked. I took my softserial full duplex code and twisted it around some to take advantage of gcc. I also exercised some of my favorite features of gcc, specifically templates, just to make sure they work in the uniarch version.
     
    Yeah, as I get further into the msp430 world I've decided I don't really like TI's version of eclipse + CDT too much. Along my path to enlightenment I have left the CCS blanket and wrapped myself in the latest Eclipse+CDT (Helios) with msp430-gcc running on Ubuntu. Unfortunately, the code below probably won't compile with CCS. However, I'm sure at some point someone will port the uniarch version of mspgcc over to cygwin.
     
    One of the nice thing about the 2553 vs the 2231 is the 2553 chip has a hardware UART builtin. No more stolen TimerA cycles for me. I'm doing the serial dance with hardware now. Attached you will find the code and a Makefile.
     
    Notes about hardware USCI UART: You have to flip your TX/RX jumpers on your launchpad. This has been talked about elsewhere on the forums. I'm just using a couple of F-M jumper wires going to my msp430g2553 on a breadboard.
     
    You can read the announcement about uniarch and support for the newer chips over on the mailing list:
    http://sourceforge.net/mailarchive/foru ... pgcc-users
     
    The latest version of the following source code can be found here: https://gist.github.com/969447
     
    I took a snapshot of the code:

    /** * usci_serial.cpp - simple example using USCI UART + ringbuffer + command line monitor * * This code was written to test the new uniarch version of msp430-gcc. I wanted * to make sure it could generate code for the msp430g2553 running on the TI * launchpad. * * This code mplements a command line interface over the USB-CDC serial at * 9600-8-N-1. To test you must swap the RX/TX pins on your launchpad to use * the hardware USCI UART. I disconnected those jumpers on my launchpad and used * a couple of F-M jumper wires to run the msp430g2553 from a breadboard. * P1.1=RXD and P1.2=TXD ( this is the opposite of the msp430g2231 default setup ) * * * License: Do with this code what you want. However, don't blame * me if you connect it to a heart pump and it stops. This source * is provided as is with no warranties. It probably has bugs!! * You have been warned! * * Author: Rick Kimball * email: rick@kimballsoftware.com * Version: 1.00 Initial version 05-12-2011 */ #include #include #include #include "config.h" #include "ringbuffer.h" #include "usci_serial.h" /** * create a ring buffer that holds up to 16 uint8_t bytes * * Note: you could change the ringbuffer_ui8_16 typedef to * make it smaller or larger, just be consistent with what * you provide the Serial template */ ringbuffer_ui8_16 usci_buffer = { 0, 0, { 0 } }; Serial usci0 = { usci_buffer }; /** * USCI0RX_ISR - USCI UART receive character ISR handler * * we get an interrupt when a new character arrives via * the USCI UART receive pin. We just stuff it into * our buffer and let the main routine consume it. */ interrupt(USCIAB0RX_VECTOR) USCI0RX_ISR(void) { /** * Note: a side effect of reading UCA0RXBUF * is the rx interrupt flag is cleared */ usci_buffer.push_back(UCA0RXBUF); } /** * main - echo back to the user whatever they type */ int main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT BCSCTL1 = CALBC1_16MHZ; // set DCO clock for MCLK and SMCLK DCOCTL = CALDCO_16MHZ; usci0.init(); __bis_SR_register(GIE); // interrupts enabled usci0.xmit("\r\nMSP430G2553 Monitor\r\n$ "); while (true) { while (!usci0.empty()) { volatile int c; c = usci0.recv(); usci0.xmit((uint8_t) c); } } }
     

    /** * config.h - configure baud rates, MCLK frequency * * License: Do with this code what you want. However, don't blame * me if you connect it to a heart pump and it stops. This source * is provided as is with no warranties. It probably has bugs!! * You have been warned! * * Author: Rick Kimball * email: rick@kimballsoftware.com * Version: 1.00 Initial version 05-12-2011 */ #ifndef CONFIG_H_ #define CONFIG_H_ #define F_CPU 16000000 // use calibrated 16MHZ clock #ifdef __MSPGCC__ #define _enable_interrupts() __bis_status_register(GIE) #define _disable_interrupts() __bic_status_register(GIE) #endif #endif
     

    /* * ringbuffer.h - template for a circular buffer * * License: Do with this code what you want. However, don't blame * me if you connect it to a heart pump and it stops. This source * is provided as is with no warranties. It probably has bugs!! * You have been warned! * * Author: Rick Kimball * email: rick@kimballsoftware.com * Version: 1.00 Initial version 05-12-2011 */ #ifndef RINGBUFFER_H_ #define RINGBUFFER_H_ /** * ringbuffer - a template based interrupt safe circular buffer structure with functions */ template struct ringbuffer { volatile int head; volatile int tail; volatile T buffer[MAX_ITEMS]; /** * empty() - checks the buffer for data * * returns true if empty, false if there is data */ inline bool empty() { bool isEmpty; _disable_interrupts(); // prevent inconsistent reads isEmpty = (head == tail); _enable_interrupts(); return isEmpty; } /** * push_back() - append a byte to the buffer is possible * assumed to be called from the recv interrupt */ inline void push_back(T c) { int i = (unsigned int) (head + 1) % MAX_ITEMS; if (i != tail) { buffer[head] = c; head = i; } } /** * pop_front() - remove a value from front of ring buffer */ inline T pop_front() { T c = -1; _disable_interrupts(); // disable interrupts to protect head and tail values // This prevents the RX_ISR from modifying them // while we are trying to read and modify // if the head isn't ahead of the tail, we don't have any characters if (head != tail) { c = (T) buffer[tail]; tail = (unsigned int) (tail + 1) % MAX_ITEMS; } _enable_interrupts(); // ok .. let everyone at them return c; } }; typedef ringbuffer ringbuffer_ui8_16; // ringbuffer, max of 16 uint8_t values typedef ringbuffer Ringbuffer_uint8_32; // ringbuffer, max of 32 uint8_t values #endif /* RINGBUFFER_H_ */

    /** * usci_serial.cpp - simple example using USCI UART + ringbuffer + command line monitor * * This code was written to test the new uniarch version of msp430-gcc. I wanted * to make sure it could generate code for the msp430g2553 running on the TI * launchpad. * * This code mplements a command line interface over the USB-CDC serial at * 9600-8-N-1. To test you must swap the RX/TX pins on your launchpad to use * the hardware USCI UART. I disconnected those jumpers on my launchpad and used * a couple of F-M jumper wires to run the msp430g2553 from a breadboard. * P1.1=RXD and P1.2=TXD ( this is the opposite of the msp430g2231 default setup ) * * * License: Do with this code what you want. However, don't blame * me if you connect it to a heart pump and it stops. This source * is provided as is with no warranties. It probably has bugs!! * You have been warned! * * Author: Rick Kimball * email: rick@kimballsoftware.com * Version: 1.00 Initial version 05-12-2011 */ #include #include #include #include "config.h" #include "ringbuffer.h" #include "usci_serial.h" /** * create a ring buffer that holds up to 16 uint8_t bytes * * Note: you could change the ringbuffer_ui8_16 typedef to * make it smaller or larger, just be consistent with what * you provide the Serial template */ ringbuffer_ui8_16 usci_buffer = { 0, 0, { 0 } }; Serial usci0 = { usci_buffer }; /** * USCI0RX_ISR - USCI UART receive character ISR handler * * we get an interrupt when a new character arrives via * the USCI UART receive pin. We just stuff it into * our buffer and let the main routine consume it. */ interrupt(USCIAB0RX_VECTOR) USCI0RX_ISR(void) { /** * Note: a side effect of reading UCA0RXBUF * is the rx interrupt flag is cleared */ usci_buffer.push_back(UCA0RXBUF); } /** * main - echo back to the user whatever they type */ int main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT BCSCTL1 = CALBC1_16MHZ; // set DCO clock for MCLK and SMCLK DCOCTL = CALDCO_16MHZ; usci0.init(); __bis_SR_register(GIE); // interrupts enabled usci0.xmit("\r\nMSP430G2553 Monitor\r\n$ "); while (true) { while (!usci0.empty()) { volatile int c; c = usci0.recv(); usci0.xmit((uint8_t) c); } } }
    #ifndef HW_SERIAL_H #define HW_SERIAL_H /** * Serial - simple access to USCI UART hardware * code implements interrupt driven input * and poll driven output. * * License: Do with this code what you want. However, don't blame * me if you connect it to a heart pump and it stops. This source * is provided as is with no warranties. It probably has bugs!! * You have been warned! * * Author: Rick Kimball * email: rick@kimballsoftware.com * Version: 1.00 Initial version 05-12-2011 */ template struct Serial { T_STORAGE &_recv_buffer; /** * init - setup the USCI UART hardware for 9600-8-N-1 * P1.1 = RX PIN, P1.2 = TX PIN */ inline void init() { P1SEL = BIT1 + BIT2; // P1.1=RXD, P1.2=TXD P1SEL2 = BIT1 + BIT2; // P1.1=RXD, P1.2=TXD UCA0CTL1 |= UCSSEL_2; // use SMCLK for USCI clock UCA0BR0 = 130; // 16MHz 9600 UCA0BR1 = 6; // 16MHz 9600 UCA0MCTL = UCBRS1 + UCBRS0; // Modulation UCBRSx = 3 UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine** IE2 |= UCA0RXIE; // Enable USCI0RX_ISR interrupt } inline bool empty() { return _recv_buffer.empty(); } inline int recv() { return _recv_buffer.pop_front(); } void xmit(uint8_t c) { while (!(IFG2 & UCA0TXIFG)) ; // USCI_A0 TX buffer ready? UCA0TXBUF = (uint8_t) c; // TX -> RXed character } void xmit(const char *s) { while (*s) { xmit((uint8_t) *s); ++s; } } }; #endif /* HW_SERIAL_H */

    # # Makefile - usci_serial # # License: Do with this code what you want. However, don't blame # me if you connect it to a heart pump and it stops. This source # is provided as is with no warranties. It probably has bugs!! # You have been warned! # # Author: Rick Kimball # email: rick@kimballsoftware.com # Version: 1.00 Initial version 05-12-2011 CC=msp430-gcc CXX=msp430-g++ MCU=msp430g2553 CFLAGS=-mmcu=$(MCU) -O2 -g -Wall APP=usci_serial TARGET=Debug all: $(TARGET)/$(APP).elf $(TARGET)/$(APP).elf: $(TARGET)/$(APP).o $(CC) $(CFLAGS) -o $(TARGET)/$(APP).elf $(TARGET)/$(APP).o msp430-objdump -DS $(TARGET)/$(APP).elf >$(TARGET)/$(APP).lst msp430-size $(TARGET)/$(APP).elf $(TARGET)/$(APP).o: config.h ringbuffer.h $(APP).cpp $(APP).h $(CC) $(CFLAGS) -c -o $(TARGET)/$(APP).o $(APP).cpp install: mspdebug -q --force-reset rf2500 "prog $(TARGET)/$(APP).elf" clean: rm -f $(TARGET)/$(APP).o $(TARGET)/$(APP).elf $(TARGET)/$(APP).lst mkdir -p $(TARGET)/
  16. Like
    Rickta59 reacted to SugarAddict in G2553 28pin Prototyping?   
    So here are the first 30 minutes of me having the boards... which look pretty darn awesome to me so far! The slower turnaround wasn't too bad, the quality seems to be pretty good so far (testing needed), and the price is pretty darn good! I will probably use them for larger designs... I've got a few already, muahaha.
     








  17. Like
    Rickta59 reacted to jsolarski in Uniarch mspgcc ISR syntax   
    For coding interrupts on uniarch mspgcc --
     
    use the following format
     

    __attribute__((interrupt(ISR_VECTOR))) void Isr_Vector_Name(void) { //code goes here }
     
    no need to include signal.h, or leagacymsp430.h
    you will only need to include the device specific header or msp430.h
    http://sourceforge.net/mailarchive/foru ... pgcc-users
    or check out my post for all 4 variations ---http://justinstech.org/2011/07/msp430-different-interrupts-for-different-compilers/
     
    also one other thing i noticed is isr_compat.h in the current build for uniarch
    I will trying it out and seeing if it will make porting code from either IAR/CSS or mspgcc4 easier.
  18. Like
    Rickta59 got a reaction from mandeep in MSP-EXP430FR5739 demo code ported to msp430-gcc   
    The latest uniarch msp430-gcc does support the msp430fr5739. However, at this time, mspdebug
    doesn't support it. I have exchanged emails with Daniel Beer, primary developer on mspdebug,
    and he has indicated he is already working on this. I'm hoping this welcome addition will appear soon.
     
    There might be another option. I just noticed that TI offers a command line win32 only program flasher
    with source code on the their website:
     
    http://processors.wiki.ti.com/index.php/MSP430_Flasher_-_Command_Line_Programmer
     
    It might be possible to run this using WINE under linux. I haven't even tried this on Windows so I don't
    know if the program even supports the FRAM chip.
     
    BTW: msp430-gcc uniarch just got easier to install on ubuntu. You can now find the required binary
    install packages at https://launchpad.net/ubuntu/oneiric/+search?text=msp430. Previously, I was using
    a source build I hand cobbled, now I've switched to binary install with good success.
    Note: I'm running Ubuntu 11.04 natty.
     
    -rick
  19. Like
    Rickta59 got a reaction from jsolarski in MSP-EXP430FR5739 demo code ported to msp430-gcc   
    The latest uniarch msp430-gcc does support the msp430fr5739. However, at this time, mspdebug
    doesn't support it. I have exchanged emails with Daniel Beer, primary developer on mspdebug,
    and he has indicated he is already working on this. I'm hoping this welcome addition will appear soon.
     
    There might be another option. I just noticed that TI offers a command line win32 only program flasher
    with source code on the their website:
     
    http://processors.wiki.ti.com/index.php/MSP430_Flasher_-_Command_Line_Programmer
     
    It might be possible to run this using WINE under linux. I haven't even tried this on Windows so I don't
    know if the program even supports the FRAM chip.
     
    BTW: msp430-gcc uniarch just got easier to install on ubuntu. You can now find the required binary
    install packages at https://launchpad.net/ubuntu/oneiric/+search?text=msp430. Previously, I was using
    a source build I hand cobbled, now I've switched to binary install with good success.
    Note: I'm running Ubuntu 11.04 natty.
     
    -rick
  20. Like
    Rickta59 reacted to gordon in MSP-EXP430FR5739 demo code ported to msp430-gcc   
    "msp430-objcopy -O ihex infile.elf outfile.hex" should do the trick (if MSP430Flasher needs Intel hex as it's input).
  21. Like
    Rickta59 got a reaction from oPossum in MSP-EXP430FR5739 demo code ported to msp430-gcc   
    The latest uniarch msp430-gcc does support the msp430fr5739. However, at this time, mspdebug
    doesn't support it. I have exchanged emails with Daniel Beer, primary developer on mspdebug,
    and he has indicated he is already working on this. I'm hoping this welcome addition will appear soon.
     
    There might be another option. I just noticed that TI offers a command line win32 only program flasher
    with source code on the their website:
     
    http://processors.wiki.ti.com/index.php/MSP430_Flasher_-_Command_Line_Programmer
     
    It might be possible to run this using WINE under linux. I haven't even tried this on Windows so I don't
    know if the program even supports the FRAM chip.
     
    BTW: msp430-gcc uniarch just got easier to install on ubuntu. You can now find the required binary
    install packages at https://launchpad.net/ubuntu/oneiric/+search?text=msp430. Previously, I was using
    a source build I hand cobbled, now I've switched to binary install with good success.
    Note: I'm running Ubuntu 11.04 natty.
     
    -rick
  22. Like
    Rickta59 got a reaction from mandeep in MSP-EXP430FR5739 demo code ported to msp430-gcc   
    Once the new version of mspdebug comes out with support for the MSP430FR5739 chip
    which is in the FRAM experimenter board, you are going to want something more than just
    a blinky program to see if it works on your system.
     
    I modified the User Experience Code Demo code for the MSP-EXP430FR5739 so that it
    compiles with the latest msp430-gcc.
     
    Find it here: https://gist.github.com/1057857
     
    -rick
  23. Like
    Rickta59 got a reaction from RobG in MSP-EXP430FR5739 demo code ported to msp430-gcc   
    Once the new version of mspdebug comes out with support for the MSP430FR5739 chip
    which is in the FRAM experimenter board, you are going to want something more than just
    a blinky program to see if it works on your system.
     
    I modified the User Experience Code Demo code for the MSP-EXP430FR5739 so that it
    compiles with the latest msp430-gcc.
     
    Find it here: https://gist.github.com/1057857
     
    -rick
  24. Like
    Rickta59 got a reaction from bluehash in MSP-EXP430FR5739 demo code ported to msp430-gcc   
    Once the new version of mspdebug comes out with support for the MSP430FR5739 chip
    which is in the FRAM experimenter board, you are going to want something more than just
    a blinky program to see if it works on your system.
     
    I modified the User Experience Code Demo code for the MSP-EXP430FR5739 so that it
    compiles with the latest msp430-gcc.
     
    Find it here: https://gist.github.com/1057857
     
    -rick
  25. Like
    Rickta59 got a reaction from zborgerd in MSP-EXP430FR5739 demo code ported to msp430-gcc   
    Once the new version of mspdebug comes out with support for the MSP430FR5739 chip
    which is in the FRAM experimenter board, you are going to want something more than just
    a blinky program to see if it works on your system.
     
    I modified the User Experience Code Demo code for the MSP-EXP430FR5739 so that it
    compiles with the latest msp430-gcc.
     
    Find it here: https://gist.github.com/1057857
     
    -rick
×
×
  • Create New...