Categories
electrónica

Hola mundo para eZ430 chronos

El eZ430 chronos es una plataforma de desarrollo de Texas Instrument que tiene la peculiaridad de estar encapsulada en forma de reloj, y su objetivo es servir como banco de pruebas de su chip ms430, caracterizado sobre todo por su bajo consumo.

El kit del eZ430 chronos está compuesto por un reloj, un punto de acceso usb para comunicarse inalámbricamente con el reloj y un programador usb para poder reprogramar el reloj. El precio de todo el conjunto es de 50$ y los gastos de envío a Europa son de unos 15$.

A continuación lo que muestro son los pasos a seguir para crear un programa tipo “hola mundo” que únicamente muestra las palabras “hi earth” en la pantalla lcd del reloj, tal y como se ve en la imagen de cabecera.

1. Crear nuevo proyecto

2. poner nombre al proyecto

3. seleccionar el chip msp430 como objetivo

4. no seleccionar ninguna configuración adicional

5. seleccionar el chip CC430F6137 que es el que incorpora el reloj

6. hacer clic derecho sobre el proyecto y crear un nuevo fichero fuente

7. llamar al fichero “main.c”

8. copiar y pegar el siguiente código:

//******************************************************************************
//  eZ430 chronos hello world
//  Description: initializes lcd module and shows the string 'hi earth' on the 
//               lcd display becuase 'hello world' is too long
//  Author: Felix Genicio
//******************************************************************************

#include  "cc430x613x.h"
#include <string.h>

void main(void)
{  
	unsigned char * lcdmem;
	
    // 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
		
	// LCD_B Base Address is 0A00H page 30 y in SALS554 document
	// show 'h'
	lcdmem 	= (unsigned char *)0x0A21;
	*lcdmem = (unsigned char)(*lcdmem | (BIT2+BIT1+BIT6+BIT0));
	// show 'i'
	lcdmem 	= (unsigned char *)0x0A22;
	*lcdmem = (unsigned char)(*lcdmem | (BIT2));
	// show 'E'
	lcdmem 	= (unsigned char *)0x0A2B;
	*lcdmem = (unsigned char)(*lcdmem | (BIT4+BIT5+BIT6+BIT0+BIT3));
	// show 'A'
	lcdmem 	= (unsigned char *)0x0A2A;
	*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT1+BIT2+BIT4+BIT5+BIT6));
	// show 'r'
	lcdmem 	= (unsigned char *)0x0A29;
	*lcdmem = (unsigned char)(*lcdmem | (BIT6+BIT5));
	// show 't'
	lcdmem 	= (unsigned char *)0x0A28;
	*lcdmem = (unsigned char)(*lcdmem | (BIT4+BIT5+BIT6+BIT3));
	// show 'h'
	lcdmem 	= (unsigned char *)0x0A27;
	*lcdmem = (unsigned char)(*lcdmem | (BIT4+BIT5+BIT6+BIT2));
		
  __no_operation();  // For debugger
}

9. pulsar el botón de ‘debug’ (asegurarse antes de que el reloj está conectado al módulo de programación usb y este a un puerto usb del ordenador)

10. se abrirá la ventana de debug

11. seleccionar en la barra del menú el botón “Run”

12. ¡y ya tenemos nuestro programa corriendo en el reloj y mostrando el mensaje en el display!

94 replies on “Hola mundo para eZ430 chronos”

Ive been getting this error

**** Build of configuration Debug for project hello_world ****

C:\Program Files\Texas Instruments\ccsv4\utils\gmake\gmake -k all
‘\\psf\Home\Documents\workspace\hello_world\Debug’
CMD.EXE was started with the above path as the current directory.
UNC paths are not supported. Defaulting to Windows directory.
‘Building file: ../main.c’
‘\\psf\Home\Documents\workspace\hello_world\Debug’
CMD.EXE was started with the above path as the current directory.
UNC paths are not supported. Defaulting to Windows directory.
‘Invoking: Compiler’
“C:/Program Files/Texas Instruments/ccsv4/tools/compiler/msp430/bin/cl430″ -vmspx -g –define=__CC430F6137__ –include_path=”C:/Program Files/Texas Instruments/ccsv4/msp430/include” –include_path=”C:/Program Files/Texas Instruments/ccsv4/tools/compiler/msp430/include” –diag_warning=225 –silicon_errata=CPU22 –silicon_errata=CPU21 –silicon_errata=CPU23 –silicon_errata=CPU18 –silicon_errata=CPU40 –printf_support=minimal –preproc_with_compile –preproc_dependency=”main.pp” “../main.c”
‘\\psf\Home\Documents\workspace\hello_world\Debug’
CMD.EXE was started with the above path as the current directory.
UNC paths are not supported. Defaulting to Windows directory.
Fatal error: could not open source file “../main.c”
1 fatal error detected in the compilation of “../main.c”.
Compilation terminated.

>> Compilation failure
gmake: *** [main.obj] Error 1
gmake: Target `all’ not remade because of errors.
Build complete for project hello_world ”

what should i do??

[Responder]

sucotronic Reply:

@RND, sorry, I’ve never used mspgcc under windows, so it seems to be a platform specific error. You can try to find support in the mspgcc mailing list or irc groups.

[Responder]

hola, muy bueno el blog.

Estoy viendo un ejemplo de codigo RF que se llama “RF_Toggle_LED_Demo” (http://edge.rit.edu/content/P11252/public/CC430%20RF%20Code%20Example.txt) y veo que utiliza operadores logicos bit a bit entre registros y ciertos bits. Por ejemplo:

void Transmit(unsigned char *buffer, unsigned char length)
{
RF1AIES |= BIT9;
RF1AIFG &= ~BIT9; // Clear pending interrupts
RF1AIE |= BIT9; // Enable TX end-of-packet interrupt

WriteBurstReg(RF_TXFIFOWR, buffer, length);

Strobe( RF_STX ); // Strobe STX
}
¿Como puedo saber el significado de BIT9, BIT7, BIT6, BIT0, etc? Pude encontrar el significado de esos registros, pero el significado de esos bits no lo encuentro por ningun lado 🙁

Desde ya muchas gracias!!

[Responder]

sucotronic Reply:

@Luis, en la wiki de TI tienes toda la documentación que necesitas. En concreto el registro que tu comentas está en el documento slau259 en la página 600 y explica que se usa para determinar como son lanzadas las interrupciones que puede generar el módulo RF. En la página 538 tienes la explicación de las interrupciones.

[Responder]

Luis Reply:

@sucotronic, muchisimas gracias por la info!!
Ahora otra cuestión: este ejemplo RF que estoy viendo “RF_Toggle_LED_Demo” es para que se envien paquetes dos aparatos CC430, pero lo que yo quiero solamente es que el Chronos eZ430 le envie paquetes al Access Point (basado en el CC1111) incluido en el kit
¿será necesario cargar un codigo fuente al Access Point para lograr este objetivo?
en caso de ser necesario ¿debo comprar el CC Debugger (http://focus.ti.com/docs/toolsw/folders/print/cc-debugger.html)? ¿o simplemente poniendo el RF AP en el puerto USB de mi maquina ya lo puedo programar?

Gracias y disculpa las molestias!!

[Responder]

sucotronic Reply:

@Luis, lo siento, ahí si que no te puedo ayudar, ya que no he trasteado más con él. Lo que si es seguro es que si quieres usar el Access Point para otra cosa que sea interactuar con el chronos y el programa que trae por defecto, te hará falta el CC Debugger para reprogramarlo.

Hola, no sé si me podéis ayudar pero a alguien le ha salido el siguiente error?

MSP430: Can’t Run Target CPU: Could not read Enhanced Emulation Module register

El programa antes me funcionaba correctamente pero ya no.

Gracias, un saludo.

[Responder]

sucotronic Reply:

@Blen, parece que no tienes bien configurado el tipo de chip que quieres programar. Revisa la configuración para asegurarte de que es el correspondiente al ez430.

[Responder]

Buenas,

buen aporte ,después de trastear con el reloj se pueden hacer cosas chulas y a buen precio :). Tengo una duda, e igual me puedes ayudar. ¿Es posible cambiar los nombres al menú? Por ejemplo que en vez de “Acc” aparezca “app”. ¿Sería necesario el CC debugger para ello?

Un saludo, y muchas gracias de antemano.

[Responder]

sucotronic Reply:

@Paniplús, tienes que modificar el código original que viene el reloj y que te puedes descargar en la página del wiki de ti.

[Responder]

Paniplus Reply:

@sucotronic, Ya lo he modificado,sólo se necesita cambiar la cadena de texto que se le pasa a “display_chars()” dentro de “display_rf()”. Pero no consigo compilarlo, me da repetidamente este error “ERROR: argument to option -O (“0-3″) is out of range (must be from 0 to 3)” al compilar todos los archivos ¿qué puede ser? CCS tiene alguna limitación?

[Responder]

sucotronic Reply:

@Paniplus, ese error sale porque las opciones del compilador no son correctas. En concreto dice que la opción -O tiene un argumento fuera de rango, ya que debe estar entre 0 y 3. No es ninguna limitación del CCS, debería buscar donde está la configuración del compilador y cambiarlo.

@Matt,
Hola chicos,

If I may I would like to write this comment in English. I just got this toy a few days ago but so far I love it!!
I would like to share with this community the program I’ve made. I’m new at this but I want to get better so if you can change the time setting in my program to improve it, or have a better solution to do it, that would be great! My program works but it gives me a warning about the time, check it out, I think you guys would like it!! (at the end)
Some people have asked; why when I take my watch out of the PC the text stills there? Well, I know why and I have also made some texts myself, but I was getting bored of placing only short texts because of the space on the Chronos Watch’s LCD. So I thought it would be cool if I can make the texts to scroll when we have bigger stuff to display and I did it! I’m able to make my texts to scroll. But here comes the problem; it only “runs” when I hit the play button in the CCSprogram after debugging, once I take the Watch out I’m not able to see my text scrolling anymore! I’m guessing it is because when the watch is plug into my computer the “program.c” it’s reading the time from my computer but once I take it off, well I have no time or clock in my watch… at least that’s my guess! :p can you guys check it out and maybe we can came out with a solution for it 😉 I hope you enjoy the program it is what I am able to do so far!!!
# I would also like to ask you, I have been trying to get back to the original programming of my watch and I think I’ve found what I need but every time I try to debug it, it tells me that I have an error in the library “dm.h” which is inside another library the “project.h” library…. Do you guys know what can I do!!? I need to make a project with it and can’t reset or get to the original program, help!

Program (just copy and paste in new.c);

//***************************************************************************
//***************************************************************************
// EZ430-Chronos-915
// “H,O,L,A, “I “yOUr
// + @ + <3 + @ +   
// m,U,n,d,O” MEXICO” nAmE”
//***************************************************************************
// Nombre: Leonardo Daniel Reyes Fuentes
// U.A.N.L.
// Universidad Autónoma de Nuevo León
// México
// F.I.M.E.
// Facultad de Ingeniería Mecánica y Eléctrica
//***************************************************************************
// (Esp) Si no entiendes mi programa, con toda confianza pregúnteme, adiós.
// (Eng) If you do not understand my program, feel free to contact me, bye.
// (汉语) 如果你不明白我的方案请问我,再见.
// (Deu) Wenn Sie meiner Program nicht verstehen kann fragt mir bitte, tschüß.
// (Ita) Se non capisci il mio programma, chiedere di me, ciao.
//***************************************************************************
//***************************************************************************

#include "cc430x613x.h"
#include

void blank(void) {
LCDBMEMCTL |= (LCDCLRBM + LCDCLRM); // LCDBMEMCTL = 6;
}

void setfreq(void) {
LCDBCTL0 = (LCDDIV0 + LCDDIV1 + LCDDIV2 + LCDDIV3) | (LCDPRE0 + LCDPRE1) | LCD4MUX | LCDON;
LCDBBLKCTL = LCDBLKPRE0 | LCDBLKPRE1 | LCDBLKDIV0 | LCDBLKDIV1 | LCDBLKDIV2 | LCDBLKMOD0;
}

void iotocom(void) {
P5SEL |= (BIT5 | BIT6 | BIT7);
P5DIR |= (BIT5 | BIT6 | BIT7);
}

void lcdon(void) {
LCDBPCTL0 = 0xFFFF;
LCDBPCTL1 = 0x00FF;
}

int main(void) {
unsigned char *lcdmem;

blank();

setfreq();

iotocom();

lcdon();

/* LCD_B Base Address is 0A00H */

// Muestra Icono
lcdmem = (unsigned char *)0x0A22;
*lcdmem = (unsigned char)(*lcdmem | (BIT3));
clock (10); blank();
// Muestra H
lcdmem = (unsigned char *)0x0A21;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT1+BIT2+BIT5+BIT6));
clock (10);
// Muestra O
lcdmem = (unsigned char *)0x0A22;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT2+BIT4+BIT5+BIT6+BIT7));
clock (10);
// Muestra L
lcdmem = (unsigned char *)0x0A23;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT2+BIT7));
clock (10);
// Muestra A
lcdmem = (unsigned char *)0x0A25;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT1+BIT2+BIT4+BIT5+BIT6));
clock (10);
//Muestra m
lcdmem = (unsigned char *)0x0A2B;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT2+BIT6));
clock (10);
// Muestra U
lcdmem = (unsigned char *)0x0A2A;
*lcdmem = (unsigned char)(*lcdmem | (BIT1+BIT2+BIT3+BIT4+BIT6));
clock (10);
// Muestra n
lcdmem = (unsigned char *)0x0A29;
*lcdmem = (unsigned char)(*lcdmem | (BIT2+BIT5+BIT6));
clock (10);
// Muestra d
lcdmem = (unsigned char *)0x0A28;
*lcdmem = (unsigned char)(*lcdmem | (BIT1+BIT2+BIT3+BIT5+BIT6));
clock (10);
// Muestra O + Limpia (tras tiempo cumplido)
lcdmem = (unsigned char *)0x0A27;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT1+BIT2+BIT3+BIT4+BIT6));
clock(10);
blank();
// Muestra Icono
lcdmem = (unsigned char *)0x0A22;
*lcdmem = (unsigned char)(*lcdmem | (BIT3));
clock (10);
blank();
// Muestra ‘I’ + ‘<3'
lcdmem = (unsigned char *)0x0A21;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT2) + BIT3);
// Muestra '''
lcdmem = (unsigned char *)0x0A24;
*lcdmem = (unsigned char)(*lcdmem | (BIT0));
// Muestra 'M'
lcdmem = (unsigned char *)0x0A2B;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT2+BIT6));
// Muestra 'E'
lcdmem = (unsigned char *)0x0A2A;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT3+BIT4+BIT5+BIT6));
// Muestra 'X'
lcdmem = (unsigned char *)0x0A29;
*lcdmem = (unsigned char)(*lcdmem | (BIT1+BIT2+BIT4+BIT5+BIT6));
// Muestra 'C'
lcdmem = (unsigned char *)0x0A28;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT3+BIT4+BIT6)+BIT7);
// Muestra 'O' + Limpia (tras tiempo cumplido)
lcdmem = (unsigned char *)0x0A27;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT1+BIT2+BIT3+BIT4+BIT6));
clock(10);
clock(10);
blank();
// Muestra Icono
lcdmem = (unsigned char *)0x0A22;
*lcdmem = (unsigned char)(*lcdmem | (BIT3));
clock (10);
blank();
// Muestra /***Y/****n/
lcdmem = (unsigned char *)0x0A25;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT1+BIT5+BIT6+BIT7));
lcdmem = (unsigned char *)0x0A27;
*lcdmem = (unsigned char)(*lcdmem | (BIT2+BIT5+BIT6));
clock (10);
blank();
// Muestra /**YO/***nA/
lcdmem = (unsigned char *)0x0A23;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT1+BIT5+BIT6+BIT7));
lcdmem = (unsigned char *)0x0A25;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT2+BIT4+BIT5+BIT6+BIT7));
lcdmem = (unsigned char *)0x0A28;
*lcdmem = (unsigned char)(*lcdmem | (BIT2+BIT5+BIT6));
lcdmem = (unsigned char *)0x0A27;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT1+BIT2+BIT4+BIT5+BIT6));
clock (10);
blank();
// Muestra /*YOU/**nAm/
lcdmem = (unsigned char *)0x0A22;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT1+BIT5+BIT6+BIT7));
lcdmem = (unsigned char *)0x0A23;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT2+BIT4+BIT5+BIT6+BIT7));
lcdmem = (unsigned char *)0x0A25;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT2+BIT5+BIT6+BIT7));
lcdmem = (unsigned char *)0x0A29;
*lcdmem = (unsigned char)(*lcdmem | (BIT2+BIT5+BIT6));
lcdmem = (unsigned char *)0x0A28;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT1+BIT2+BIT4+BIT5+BIT6));
lcdmem = (unsigned char *)0x0A27;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT2+BIT6));
clock (10);
blank();
// Muestra /YOUr/*nAmE/
lcdmem = (unsigned char *)0x0A21;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT1+BIT5+BIT6+BIT7));
lcdmem = (unsigned char *)0x0A22;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT2+BIT4+BIT5+BIT6+BIT7));
lcdmem = (unsigned char *)0x0A23;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT2+BIT5+BIT6+BIT7));
lcdmem = (unsigned char *)0x0A25;
*lcdmem = (unsigned char)(*lcdmem | (BIT1+BIT2));
lcdmem = (unsigned char *)0x0A2A;
*lcdmem = (unsigned char)(*lcdmem | (BIT2+BIT5+BIT6));
lcdmem = (unsigned char *)0x0A29;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT1+BIT2+BIT4+BIT5+BIT6));
lcdmem = (unsigned char *)0x0A28;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT2+BIT6));
lcdmem = (unsigned char *)0x0A27;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT3+BIT4+BIT5+BIT6));
clock (10);
blank();
// Muestra /OUr*/*AmE*/
lcdmem = (unsigned char *)0x0A21;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT2+BIT4+BIT5+BIT6+BIT7));
lcdmem = (unsigned char *)0x0A22;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT2+BIT5+BIT6+BIT7));
lcdmem = (unsigned char *)0x0A23;
*lcdmem = (unsigned char)(*lcdmem | (BIT1+BIT2));
lcdmem = (unsigned char *)0x0A2A;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT1+BIT2+BIT4+BIT5+BIT6));
lcdmem = (unsigned char *)0x0A29;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT2+BIT6));
lcdmem = (unsigned char *)0x0A28;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT3+BIT4+BIT5+BIT6));
clock (10);
blank();
// Muestra /Ur**/*mE**/
lcdmem = (unsigned char *)0x0A21;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT2+BIT5+BIT6+BIT7));
lcdmem = (unsigned char *)0x0A22;
*lcdmem = (unsigned char)(*lcdmem | (BIT1+BIT2));
lcdmem = (unsigned char *)0x0A2A;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT2+BIT6));
lcdmem = (unsigned char *)0x0A29;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT3+BIT4+BIT5+BIT6));
clock (10);
blank();
// Muestra /r***/*E***/ y /****/*****/
lcdmem = (unsigned char *)0x0A21;
*lcdmem = (unsigned char)(*lcdmem | (BIT1+BIT2));
lcdmem = (unsigned char *)0x0A2A;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT3+BIT4+BIT5+BIT6));
clock (10); blank();
// Muestra /***Y/****n/
lcdmem = (unsigned char *)0x0A25;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT1+BIT5+BIT6+BIT7));
lcdmem = (unsigned char *)0x0A27;
*lcdmem = (unsigned char)(*lcdmem | (BIT2+BIT5+BIT6));
clock (10);
blank();
// Muestra /**YO/***nA/
lcdmem = (unsigned char *)0x0A23;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT1+BIT5+BIT6+BIT7));
lcdmem = (unsigned char *)0x0A25;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT2+BIT4+BIT5+BIT6+BIT7));
lcdmem = (unsigned char *)0x0A28;
*lcdmem = (unsigned char)(*lcdmem | (BIT2+BIT5+BIT6));
lcdmem = (unsigned char *)0x0A27;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT1+BIT2+BIT4+BIT5+BIT6));
clock (10);
blank();
// Muestra /*YOU/**nAm/
lcdmem = (unsigned char *)0x0A22;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT1+BIT5+BIT6+BIT7));
lcdmem = (unsigned char *)0x0A23;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT2+BIT4+BIT5+BIT6+BIT7));
lcdmem = (unsigned char *)0x0A25;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT2+BIT5+BIT6+BIT7));
lcdmem = (unsigned char *)0x0A29;
*lcdmem = (unsigned char)(*lcdmem | (BIT2+BIT5+BIT6));
lcdmem = (unsigned char *)0x0A28;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT1+BIT2+BIT4+BIT5+BIT6));
lcdmem = (unsigned char *)0x0A27;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT2+BIT6));
clock (10);
blank();
// Muestra /YOUr/*nAmE/
lcdmem = (unsigned char *)0x0A21;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT1+BIT5+BIT6+BIT7));
lcdmem = (unsigned char *)0x0A22;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT2+BIT4+BIT5+BIT6+BIT7));
lcdmem = (unsigned char *)0x0A23;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT2+BIT5+BIT6+BIT7));
lcdmem = (unsigned char *)0x0A25;
*lcdmem = (unsigned char)(*lcdmem | (BIT1+BIT2));
lcdmem = (unsigned char *)0x0A2A;
*lcdmem = (unsigned char)(*lcdmem | (BIT2+BIT5+BIT6));
lcdmem = (unsigned char *)0x0A29;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT1+BIT2+BIT4+BIT5+BIT6));
lcdmem = (unsigned char *)0x0A28;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT2+BIT6));
lcdmem = (unsigned char *)0x0A27;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT3+BIT4+BIT5+BIT6));
clock (10);
blank();
// Muestra /OUr*/*AmE*/
lcdmem = (unsigned char *)0x0A21;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT2+BIT4+BIT5+BIT6+BIT7));
lcdmem = (unsigned char *)0x0A22;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT2+BIT5+BIT6+BIT7));
lcdmem = (unsigned char *)0x0A23;
*lcdmem = (unsigned char)(*lcdmem | (BIT1+BIT2));
lcdmem = (unsigned char *)0x0A2A;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT1+BIT2+BIT4+BIT5+BIT6));
lcdmem = (unsigned char *)0x0A29;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT2+BIT6));
lcdmem = (unsigned char *)0x0A28;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT3+BIT4+BIT5+BIT6));
clock (10);
blank();
// Muestra /Ur**/*mE**/
lcdmem = (unsigned char *)0x0A21;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT2+BIT5+BIT6+BIT7));
lcdmem = (unsigned char *)0x0A22;
*lcdmem = (unsigned char)(*lcdmem | (BIT1+BIT2));
lcdmem = (unsigned char *)0x0A2A;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT2+BIT6));
lcdmem = (unsigned char *)0x0A29;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT3+BIT4+BIT5+BIT6));
clock (10);
blank();
// Muestra /r***/*E***/ y /****/*****/
lcdmem = (unsigned char *)0x0A21;
*lcdmem = (unsigned char)(*lcdmem | (BIT1+BIT2));
lcdmem = (unsigned char *)0x0A2A;
*lcdmem = (unsigned char)(*lcdmem | (BIT0+BIT3+BIT4+BIT5+BIT6));
clock (10); blank();

__no_operation(); // For debugger

return 0;
}

[Responder]

sucotronic Reply:

@Le0o, gracias por tu aporte Leo.

[Responder]

Hola sucotronic,

buen dia, oye tienes alguna idea de porque me puede marca un error en libreria “dm.h” la cual es una libreria que se encuentra dentro de la libreria “project.h” la verdad es que solo introduje los documentos .h y cree mi propio .c pero no me deja debuggear porque me dice que no puede abrir fuentes dentro del project.h
Sabes que significan dm.h? si tengo la libreria si la encontre dentro de unas de las carpetas, pero no se que sea :p
Ayer mande mi trabajo el cual postie en el punto 17 y fue bien recibido, sin embargo quiero seguir trabajando con el. Gracias!

Le0o

[Responder]

sucotronic Reply:

@Le0o, siento no poder ayudarte LeoOo, pero tiene pinta de que la ruta hacia el fichero “dm.h” no está bien especificada en el fichero que lo incluye. Busca el fichero que lo incluye, e intenta modificar la ruta.

[Responder]

Hola a todos.
Alguien que esté utilizando el eZ430 tiene problemas con la aceleración?? Estoy usándolo para medir aceleraciones y velocidades y tengo el problema de que cuando leo los valores de la aceleración en posición estática da valores que no se corresponden con la realidad. Si por ejemplo pongo un eje para que la gravedad solo le afecte a él, me debería dar 1g y me da 1,2 aproximadamente y si le doy la vuelta, debería darme -1g y me da -0,7. Así con todos los ejes, y por tanto no puedo hacer aplicaciones si los valores de la aceleración son incorrectos. Voy a intentar ver si consigo calibrarlo o algo, pero si alguien sabe como solucionarlo se lo agradecería.

Gracias

[Responder]

sucotronic Reply:

@Lucidio, siento no poder ayudarte, pero te recomiendo que te pases por el foro de 43oh, allí seguro que alguien tiene los conocimientos adecuados.

[Responder]

Buenas, yo estoy usando el compilador IAR (tengo que hacer un programita usando el reloj para mi proyecto fin de carrera y tengo que usar ese compilador ya que me lo ha impuesto el profesor, para empezar estoy probando con programarle algo sencillo como este “hello world”)… en fin, copio y pego el programa, compilo, debug, run (en el caso de IAR es “go”) pero no aparece nada en la pantalla, esta todo parado, y en la pantalla estan todos los segmentos del display encendidos, se queda todo igual desde que conecto el reloj hasta que lo desconecto. Luego al desconectarlo, sigue igual, pero pulso un boton y vuelve a estar como siempre, con la hora y demas opciones.
Total, que no se como es. Soy principiante y tengo que aprenderlo a la fuerza.

Gracias.

[Responder]

sucotronic Reply:

@Coffin, hola Coffin, ¿le has quitado la pila para programarlo?

[Responder]

Coffin Reply:

@sucotronic,
Claro, le quité la pila.
No se si incidir sobre este problemilla e intentar solucionarlo hasta ver que consigo cargar este programa en el reloj o pasar a programar lo mio, pero me da cosa que llegado el momento me surja el mismo problema.

[Responder]

Coffin Reply:

@sucotronic, SOLUCIONADO!
he estado mirando las opciones del compilador, y es que para este (el IAR) hay que trastear un poco mas en las opciones, me faltaba lo de seleccionar el chip CC430F6137.

Bueno, ahora tras esto, para volver a tener el reloj como estaba, he leido que basta con cargarle digamos el programa basico, que… debo tenerlo, no? en el CD quizas?

[Responder]

Coffin Reply:

@sucotronic,

Perdón por la sucesión de posts, debí preveer esto y haberme esperado.

Solucionado queda todo, hi earth en pantalla, y luego recarga del programa original que viene con la instalacion del Chronos-setup.

Gracias.

Un saludo.

[Responder]

Buenas, tengo una duda.
No se en que parte de la documentación del reloj buscar que variable tengo que usar para hacer que el reloj haga un pitido. Por ejemplo, algo sencillo, quiero que dado un numero, si es mayor que tal, pues el reloj pite. Cuando ponga “if (numero>nº) { PITAR? }”
Lo mismo supongo para programar algo que necesite el uso de los botones del reloj, en fin, quiero usar los “periféricos del reloj”, botones, sonido, display, etc.
Gracias.

Un saludo.

[Responder]

sucotronic Reply:

@Coffin, para usar el buzzer tienes que hacer uso del buzzer, que está conectado a un pin capaz de generar un pulso PWM. Ahora mismo no puedo mirar el código y/o el esquema para orientarte, pero para guiarte puedes ehar un ojo a otro artículo que escribí sobre un buzzer y un msp430.

[Responder]

Buenas, hace unos días te escribí preguntándote por el buzzer, ya vi como usarlo y tal, solo hay que llamar a la función start_buzzer, pero hay un problema, llevo días probando combinaciones y no veo sentido a esto. La función pide 3 parámetros: (cycles, on_time, off_time) … viene una descripción de cada uno pero no acabo de entenderlas.

la función es así en buzzer.c:

void start_buzzer(u8 cycles, u16 on_time, u16 off_time)
{
// Store new buzzer duration while buzzer is off
if (sBuzzer.time == 0)
{
sBuzzer.time = cycles;
sBuzzer.on_time = on_time;
sBuzzer.off_time = off_time;

// Need to init every time, because SimpliciTI claims same timer

// Reset TA1R, set up mode, TA1 runs from 32768Hz ACLK
TA1CTL = TACLR | MC_1 | TASSEL__ACLK;

// Set PWM frequency
TA1CCR0 = BUZZER_TIMER_STEPS;

// Enable IRQ, set output mode “toggle”
TA1CCTL0 = OUTMOD_4;

// Allow buzzer PWM output on P2.7
P2SEL |= BIT7;

// Activate Timer0_A3 periodic interrupts
fptr_Timer0_A3_function = toggle_buzzer;
Timer0_A3_Start(sBuzzer.on_time);

// Preload timer advance variable
sTimer.timer0_A3_ticks = sBuzzer.off_time;

// Start with buzzer output on
sBuzzer.state = BUZZER_ON_OUTPUT_ENABLED;
}
}

… y en el buzzer.h también hay una breve descripción de las variables:

struct buzzer
{
// Keep output for “time” seconds
u8 time;

// On/off duty
u16 on_time;
u16 off_time;

// Current buzzer output state
u8 state;
};
extern struct buzzer sBuzzer;

(cycles, on_time, off_time)
he probado combinaciones (5,500,0) pita 5 veces, 1 tick cada 2 seg, luego 3 seg de espera.
luego (10,500,0) igual pero pita 10 veces… pensé que el primer valor daba el numero de pitidos, pero en cuanto meto valor al ultimo parámetro, off_time… se desmoronan todas mis hipótesis:
(3,500,10)…. pita 1 vez cada segundo, (cuando yo pensaba que pitaría 3 veces.

un lío…

Gracias, un saludo.

[Responder]

sucotronic Reply:

@Coffin, cycles -> número de ciclos (pítidos), on_time -> tiempo sonando en un ciclo, off_time->tiempo apagado en un ciclo. Las medidas de los tiempo no sé si serán en ms o en otro, depende de como haga las cuentas el código y en que reloj se base.

[Responder]

Hola, no puedo reprogramar el reloj con el codigo original, alguien sabe como hacerlo??

Gracias y buena explicacion.

[Responder]

sucotronic Reply:

@jjtr19, tienes que abrir un proyecto que hay en la misma carpeta donde se instala el programa y reprogramar el reloj con él.

[Responder]

jjtr19 Reply:

@sucotronic,
Gracias por contestar tan pronto,te comento mi problema, por si sabes lo que me puede ocurrir.

Lo gue hago es, desde el menu del Code Composer studio:

Project->Import existing CCS/CCE Eclipse project-> selecciono la ruta, que queo que es esta:

Program files/Texas Instruments/eZ430-Chronos/Software Projects/Chronos Watch/CCS/Sports Watch

Y me da el siguiente error, ademas, en la ventana de proyectos me aparece el nombre del proyecto pero sin el Debug, es decir: ez430_chronos[Active-]

“The Managed Make project file could not be read because of the following error:

Error loading Managed Make project information for project ez430_chronos.

The tool definitions used to create the project are not available.

Managed Make functionality will not be available for this project.”

[Responder]

sucotronic Reply:

@jjtr19, no me suena el error, pero si que recuerdo que el proyecto con el firmware base no se puede compilar, solo se puede pulsar el botón de debug para programarlo en el reloj.

perdonen mi ignorancia, pero como vuelvo al estado original del reloj?

[Responder]

jjtr19 Reply:

@anonimo,
Hola, bajate el codigo original del reloj para CCS desde la wikipedia.
Despues, descargate una version de CCS que este limitada en tiempo, o “compra” una licencia, pero no eligas una version que esté limitada en codigo, ya que con esta ultima solo podras compilar programas pequeños y no podrias recompilar el programa original (ya que es muy extenso). Por cierto, el CCS que viene con el cd del reloj, esta limitada en codigo de compilacion, por eso no lo puedes compilar.
Espero haberte orientado un poco!

[Responder]

sucotronic Reply:

@anonimo, hola, para reprogramarlo solo tienes que abrir el proyecto “C:\Archivos de programa\Texas Instruments\eZ430-Chronos\Software Projects” y darle a Run (no a compilar) y lo cargará en el reloj.

[Responder]

Hola!
Hoy es mi primer día con el chronos y estoy intentando meterle tu programa. pero cuando le doy a la opción debug me manda este mensaje

“Error connecting to the target:
The target setup (CC430F6127) does not match the actual target type (CC430F6137)”
No tengo mucha idea ya que esoy empezando y estado cacharreando un poco entre las opciones y demás. pero no se que puede ser.
Que puedo hacer? Gracias de antemano!

[Responder]

sucotronic Reply:

@Jona, hola Jona. Al parecer se trata de algún error de configuracińo del proyecto, que no coincide el tipo de procesador para el cual estás compilando con el del objetivo. Ahora no recuero muy bien donde estaba, pero es posible que en las opciones del proyecto (clic derecho en el arbol de la izquierda) se pudiese cambiar.

[Responder]

Que tal! hace algunos meses compre mi chronos pero apenas estoy intentando hacer algo de provecho con el para un proyecto escolar, veo que ya tienes algo de experiencia con el y me preguntaba si me podrías asesorar por correo electrónico, solo lo básico para arrancar, de antemano gracias.

[Responder]

sucotronic Reply:

@Ernesto, me gustaría poder ayudarte, pero ahora no tengo mucho tiempo libre para asesorarte. Te recomiendo eches un vistazo por los foros de 43oh para ver ejemplos y buscar ayuda

[Responder]

hi i need help with EZ430-Chronos’ is shit
hello world called a code I found on the web.
buttons do not work and trying to climb another code
my eZ430-Chronos-915 black screen just does not work only the light button
purchase and I do not get the CD with the driver I can not install to usb datalogger in windows 8 please help

[Responder]

Leave a Reply

Your email address will not be published. Required fields are marked *