sábado, 23 de marzo de 2013

Cambiar Gnome a KDE en Fedora 18 64 bits

Esta información la saque de la siguiente entrada de blog

http://blog.desdelinux.net/como-instalar-kde-en-fedora/

Donde se indica que como primer paso, se debe agregar los repositorios kde de red-hat

#yum -y install wget && wget http://apt.kde-redhat.org/apt/kde-redhat/fedora/kde.repo -O /etc/yum.repos.d/kde.repo

Después hace la siguiente recomendación:

Luego hay que activarlos (Personalmente me quedaron activados pero verifica que hayan quedado activados)
sudo nano /etc/yum.repos.d/kde.repo
Busca la palabra Enable y cambia su valor a 1 (Enable = 1).
Guarda

Ahora van los pasos de actualizar

yum update

y luego instalación de kde

yum install @kde-desktop

Ahora reinicia el pc y selecciona iniciar con kde.

SDCC en Fedora 18 64 bits

Al instalar SDCC en Fedora, este no lo reconoce el software Piklab, ya que piklab lo busca como

sdcc -v

sin embargo en la instalación se encuentra definido como

sdcc-sdcc

pues que en /usr/bin así está definido

 [root@dhcppc6 bin]# ls -l sdcc-sdcc
-rwxr-xr-x. 1 root root 67 jul 26  2012 sdcc-sdcc
[root@dhcppc6 bin]#

ahora solo se procede a renombrar el paquete
y ya lo acepta piklab


miércoles, 20 de marzo de 2013

Poniendo ISO en USB Fedora 17 y Fedora 18

En la siguiente dirección http://fedoratimes.wordpress.com/2013/01/19/crear-un-usb-de-instalacion-de-fedora-18-kde-2/ encontré la forma de como instalar una fedora.iso en una memoria usb, tal y como comenté en la entrada de dicho blog, mi memoria tenia formato exFAT y si funcionó el procedimiento:

1. entrar como root
2. ver cual es la partición donde está nuestra memoria usb
3. instalar el programa livecd-tools
$su -c 'yum install livecd-tools'
4. desmontar la unidad seleccionada
 # umount /dev/sdb1
5. Ingresar el comando (ejemplo)
#su -c "livecd-iso-to-disk --format --reset-mbr  RutaALaISO /dev/sdbX"
6. en mi caso la imagen iso la tengo en la carpeta Descargas de mi home

# cd /home/miguel/Descargas/
# su -c "livecd-iso-to-disk --format --reset-mbr Fedora-17-x86_64-Live-Desktop.iso /dev/sdb1"

Y al dar enter arroja el sistema los siguientes mensajes, hay que estar atentos cuando nos pida pulsar la tecla INTRO, para confirmar que queremos proceder con la instalacion de la ISO
en la memoria USB

Verifying image...
/home/miguel/Descargas/Fedora-17-x86_64-Live-Desktop.iso:   8f867005fc8d23b3a9f0d3918d7ad825
Fragment sums: 937bd8e8d79fa61fdebca46ed56bb7f295116544a578b8c2c6c35f51cb9e
Fragment count: 20
Press [Esc] to abort check.
Checking: 100.0%

The media check is complete, the result is: PASS.

It is OK to use this media.
WARNING: THIS WILL DESTROY ANY DATA ON /dev/sdb!!!
Press Enter to continue or ctrl-c to abort

2 bytes were erased at offset 0x000001fe (dos): 55 aa
Waiting for devices to settle...
mke2fs 1.42.3 (14-May-2012)
Etiqueta del sistema de ficheros=LIVE
OS type: Linux
Tamaño del bloque=4096 (bitácora=2)
Tamaño del fragmento=4096 (bitácora=2)
Stride=0 blocks, Stripe width=0 blocks
991232 inodes, 3962112 blocks
198105 blocks (5.00%) reserved for the super user
Primer bloque de datos=0
Número máximo de bloques del sistema de ficheros=4060086272
121 bloque de grupos
32768 bloques por grupo, 32768 fragmentos por grupo
8192 nodos-i por grupo
Respaldo del superbloque guardado en los bloques:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

Allocating group tables: hecho                          
Escribiendo las tablas de nodos-i: hecho                          
Creating journal (32768 blocks): hecho
Escribiendo superbloques y la información contable del sistema de ficheros:   0/hecho 

Copying live image to target device.
squashfs.img
   655540224 100%   15.19MB/s    0:00:41 (xfer#1, to-check=0/1)

sent 655620321 bytes  received 31 bytes  15798080.77 bytes/sec
total size is 655540224  speedup is 1.00
osmin.img
        8192 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/1)

sent 8265 bytes  received 31 bytes  16592.00 bytes/sec
total size is 8192  speedup is 0.99
Updating boot config file
Installing boot loader
/media/tgttmp.ucr2nj/syslinux is device /dev/sdb1
Target device is now set up with a Live image!

Backlight en NV55C con tarjeta hídrida intel-nvidia en fedora 18 64 bits

http://lirabyte.blogspot.mx/2012/11/problema-de-brillo-de-pantalla-acer.html

Tomado de aqui para el mismo modelo NV55C gateway pero con fedora 18

ya solamente que no funciona update-grub

sino que de acuerdo a http://fedoraproject.org/wiki/GRUB_2

se debe teclear
grub2-mkconfig -o /boot/grub2/grub.cfg

y ya luego un reboot

lunes, 18 de febrero de 2013

ACTUALIZADO - Instalando el tookit de Lógica Difusa en Octave en Fedora 18 64 bits

Octave cuenta desde hace poco con un toolbox de lógica difusa, del autor Markowsky L., quien en el International Workshop “Open-Source Software for Scientific Computation (OSSC) 2011” dictó una conferencia titulada The Octave Fuzzy Logic Toolkit llevada a cabo del 12 al 14 de octubre. El paper se encuentra disponible en http://ieeexplore.ieee.org/xpl/articleDetails.jsp?reload=true&arnumber=6184706

El software se encuentra disponible de forma gratuita en: http://sourceforge.net/projects/octave-fuzzy/ y solo pesa unos 80kB, ya que se encuentra conformada por archivos .m Para su instalación, en Linux, desde octave , en la linea de comando teclea lo siguiente:

>>>pkg install -forge fuzzy-logic-toolkit 


de esta forma, automáticamente se instala el toolkit en octave.

Ahora tecleando:

>>>pkg list

Se muestran los paquetes instalados en nuestro sistema:
 
Package Name | Version | Installation directory
---------------------+---------+-----------------------
audio *| 1.1.4 | /usr/share/octave/packages/audio-1.1.4
control *| 2.4.0 | /usr/share/octave/packages/control-2.4.0
fuzzy-logic-toolkit | 0.4.2 | /home/miguel/octave/fuzzy-logic-toolkit-0.4.2
gnuplot *| 1.0.1 | /home/miguel/octave/gnuplot-1.0.1
gsl *| 1.0.8 | /usr/share/octave/packages/gsl-1.0.8
image *| 1.0.15 | /usr/share/octave/packages/image-1.0.15
miscellaneous *| 1.2.0 | /usr/share/octave/packages/miscellaneous-1.2.0
nnet *| 0.1.13 | /usr/share/octave/packages/nnet-0.1.13
odebvp *| 1.0.6 | /home/miguel/octave/odebvp-1.0.6
optim | 1.2.2 | /usr/share/octave/packages/optim-1.2.2
physicalconstants *| 0.1.7 | /home/miguel/octave/physicalconstants-0.1.7
quaternion *| 2.0.0 | /usr/share/octave/packages/quaternion-2.0.0
signal | 1.1.3 | /usr/share/octave/packages/signal-1.1.3
specfun | 1.1.0 | /usr/share/octave/packages/specfun-1.1.0
statistics *| 1.0.10 | /home/miguel/octave/statistics-1.0.10
struct | 1.0.10 | /usr/share/octave/packages/struct-1.0.10
symbolic *| 1.1.0 | /usr/share/octave/packages/symbolic-1.1.0

donde aquellos que tienen un '*' delante del nombre del paquete instalado, son los que se encuentran instalados. (si deseas instalar mas paquetes, puedes consultar la siguiente página)
 http://octave.sourceforge.net/

Ahora como verán, el paquete de lógica borrosa no está cargado automáticamente, para cargarlo debe teclear lo siguiente

 
>>> pkg load fuzzy-logic-toolkit

En consecuencia, es posible usar ya funciones del toolkit
>>> demo('sigmf')
sigmf example 1:
x = 0:100;
params = [0.3 40];
y1 = sigmf(x, params);
params = [0.2 40];
y2 = sigmf(x, params);
params = [0.1 40];
y3 = sigmf(x, params);
figure('NumberTitle', 'off', 'Name', 'sigmf demo');
plot(x, y1, 'r;params = [0.3 40];', 'LineWidth', 2)
hold on;
plot(x, y2, 'b;params = [0.2 40];', 'LineWidth', 2)
hold on;
plot(x, y3, 'g;params = [0.1 40];', 'LineWidth', 2)
ylim([-0.1 1.2]);
xlabel('Crisp Input Value', 'FontWeight', 'bold');
ylabel('Degree of Membership', 'FontWeight', 'bold');
grid;

 solo una advertencia, el comando load debe usarse siempre que se requiera usar el toolkit.


solo descarga el paquete tar.gz en alguna ubicación, y crean dentro de tu home un archivo opt

$makedir opt

y descomprime ahi el archivo descargado ahora abre octave y desde la línea de comandos (http://iimyo.forja.rediris.es/tutorial/gui.html) teclea el siguiente comando

path(path,'/home/miguel/opt/fuzzy-logic-toolkit/')

 y con esto, es posible usar las funciones del fuzzy-logic-toolkit, por ejemplo al usar

help trimf
`trimf' is a function from the file /home/miguel/opt/fuzzy-logic-toolkit/inst/t rimf.m

-- Function File: Y = trimf (X, PARAMS)
-- Function File: Y = trimf ([X1 X2 ... XN], [A B C])

For a given domain X and parameters PARAMS (or [A B C]), return the corresponding Y values for the triangular membership function.

The argument X must be a real number or a non-empty vector of strictly increasing real numbers, and parameters A, B, and C must be real numbers that satisfy A < B < C. None of the parameters A, B, and C are required to be in the domain X. The minimum and maximum values of the triangle are assumed to be 0 and 1.

The parameters [A B C] correspond to the x values of the vertices of the triangle:

 1-|      /\
    |     /  \
    |    /    \
    |   /      \
     0-----------------------
       a b   c

To run the demonstration code, type demo('trimf') at the Octave prompt.

See also: dsigmf, gauss2mf, gaussmf, gbellmf, pimf, psigmf, sigmf, smf, trapmf, trimf_demo, zmf

Additional help for built-in functions and operators is available in the on-line version of the manual. Use the command `doc ' to search the manual index.

En la siguiente página podrás encontrar las referencias y las funciones con las que cuenta el toolkit

http://octave.sourceforge.net/fuzzy-logic-toolkit/overview.html


 Help and information about Octave is also available on the WWW at http://www.octave.org and via the help@octave.org mailing list.

miércoles, 30 de enero de 2013

Este es el link para consultar las bases del quinto Rally mecatrónico, organizado por la academia de Ing Mecatronica en el ITST http://www.facebook.com/media/set/?set=a.453017148085895.107113.102397876481159&type=1 Se llevará a cabo a fines del mes de mayo. los esperamos!

martes, 8 de enero de 2013

Participación en WEEF2012

Aquí puede acceder al recurso: http://www.weef2012.edu.ar/papersFinal/information.php?doc=186

Libro de Abstracts: http://www.weef2012.edu.ar/archivos/papers/WEEF2012.pdf

Tuve a bien participar en el World Engineering Education Forum (WEFF) 2012 “Educación de ingeniería para el desarrollo sostenible y la inclusión social”, con la publicación del trabajo “Kit de prácticas OSH para la programación básica del microcontrolador PIC18F2550 con SDCC y PIKLAB en GNU/Linux” en Co-autoría con la M.S.C. Mariana Lobato Baéz y el M.C. Jorge Rivera Flores, en el cual se propone el uso de las herramientas libres para la enseñanza de microcontroladores.

Agradezco los comentarios de los revisiones, quienes comentaron:

"En este trabajo se recupera el valor de la “guía didáctica”. Los autores la proponen como material didáctico integrado a la realización de prácticas experimentales con elementos físicos (circuito pre-ensamblado o Kit de prueba) y a la aplicación del concepto de Open Source Hardware en un curso de Microcontroladores. Como resultado los autores exponen que esta estrategia integradora aparece cómo más favorable que el empleo de clases y simulación para el desarrollo de competencias específicas.

Esta experiencia concreta puede resultar de interés para los docentes en carreras de ingeniería ya que estaría mostrando que la simulación por sí sola no garantiza el aprendizaje de ciertas habilidades. Resalta la aplicación de Software Libre y sus beneficios en caso de no disponer de los recursos económicos necesarios para adquirir un software comercial."

Del mismo modo, agradezco el apoyo del Instituto Tecnológico Superior de Teziutlán, que es donde actualmente laboro.

miércoles, 26 de diciembre de 2012

Winavr- display 7 segmentos multiplexados - libreria alfa

Esta es una libreria en alfa, ya es funcional y admite cierta flexibilidad en el uso de pines, pero requiere de mucho manoseo por parte del usuario, espero comentarios, en el post se encuentra el diagrama con las indicaciones pertinentes.

Winavr- display 7 segmentos multiplexados - libreria alfa

lunes, 24 de diciembre de 2012

Libreria LCD 20 x 4 Flexible 4 bits SDCC PIC18F2550

Este enlace lleva al codigo fuente de como hacer la interfaz entre una LCD y un micro PIC18f2550 mediante 4 bits definidos por el usuario, no importa el orden de conexion, esto es muy util cuando
se requiere de hacer ajustes en la placa donde se montaría el circuito.

Libreria LCD 20 x 4 Flexible 4 bits SDCC PIC18F2550

Libreria LCD 20x 4 Flexible 3 bits SDCC PIC18F2550

Esta es una libreria que se utiliza para comunicar un micro pic18f2550 con una pantalla LCD
alfanumerica de 2 caracteres por 4 lineas:

Libreria LCD 20x 4 Flexible 3 bits SDCC PIC18F2550

jueves, 7 de junio de 2012

Ya hace tiempo que tengo abandona el blog, todo por culpa del Fb, pero bueno tengo una duda, ¿Creen que C sobreviva a la transición que se está dando con la nube? Espero sus comentarios

miércoles, 21 de diciembre de 2011

Tercer Rally Mecatrónico -- Sumobots

competencia que se desarrollo en el marco de la semana académica 2011 en el ITST por los chavos de Ing. en Mecatrónica.

miércoles, 14 de diciembre de 2011

Tercer Rally Mecatrónico -- Mecanismos Móviles

Este video resume el evento del tercer rally mecatrónico en la categoría Mecanismos Móviles.

Proyecto para IGL UNAM

Este es parte del proyecto que estamos realizando en el ITST.
Créditos
Ing. Miguel Montiel Mtz -- Parte Electrónica
M.C. Julio César Camargo Santos -- Parte Mecánica

PIC18F2250 y timer 1 una propuesta para configurarlo.

bueno aquí está parte del trabajo que realicé en el año. Se esperan comentarios.

http://www.itsteziutlan.edu.mx/index.php?option=com_content&view=article&id=715:propuesta-para-la-programacion-basica-del-temporizador-1-del-microcontrolador-pic18f2550-con-el-compilador-sdcc&catid=27:artlos&Itemid=288

http://www.itsteziutlan.edu.mx/index.php?option=com_content&view=article&id=714:propuesta-para-la-configuracion-basica-del-temporizador-1-del-microcontrolador-pic18f2550&catid=27:artlos&Itemid=288

martes, 13 de diciembre de 2011

Casi saliendo de vacaciones

Va saliendo este año y esta vez casi no he escrito nada, algo bueno ha pasado, ya en enero estaré con el examen de maestría.

Siempre es grato saber que mis alumnos van progresando día día, con mucho esfuerzo y con gran dedicación.

Les deseo a todos una feliz navidad y un próspero año nuevo.

miércoles, 14 de septiembre de 2011

etapa Regional de Innovación Tecnológica Tehuacan Puebla

Pues hace un buen rato que no escribo nada, y creo que tenia suficiente tiempo para hacerlo antes.

Ahora ya hay mas trabajo que antes, aunque esto, por el momento, no veo remuneración alguna, mas que la entera satisfacción, de hacer bien mi chamba.

Pues como uno de los resultados, el proyecto Gramatical, sigue adelante y ahora con un nuevo integrante, gramabot (aun está en condiciones de prototipo, pero ya está funcional)

el codigo fuente de control, está en lenguaje C, con el compiladr SDCC, programdo usando IDE beta MPLABX y libero el codigo con licencia GPL que anexo a continuación.





/**
*
Copyright (C) <2011>

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

#define FOSC 48000000
#include "simple_delay.h"

__code char __at __CONFIG1L CONFIG1L = _PLLDIV_DIVIDE_BY_5__20MHZ_INPUT__1L & _CPUDIV__OSC1_OSC2_SRC___1__96MHZ_PLL_SRC___2__1L & _USBPLL_CLOCK_SRC_FROM_96MHZ_PLL_2_1L;
//code char at __CONFIG1H CONFIG1H = _OSC_HS__USB_HS_1H & _FCMEN_OFF_1H & _IESO_OFF_1H;
__code char __at __CONFIG1H CONFIG1H = _OSC_HS__HS_PLL__USB_HS_1H & _FCMEN_ON_1H & _IESO_ON_1H;
//_FOSC_HS_1H _FOSC_HS_1H
//_OSC_HS__HS_PLL__USB_HS_1H
__code char __at __CONFIG2L CONFIG2L = _PUT_ON_2L & _BODEN_ON_2L & _BODENV_4_2V_2L & _VREGEN_ON_2L;
__code char __at __CONFIG2H CONFIG2H = _WDT_DISABLED_CONTROLLED_2H & _WDTPS_1_32768_2H;
__code char __at __CONFIG3H CONFIG3H = _CCP2MUX_RC1_3H & _PBADEN_PORTB_4_0__CONFIGURED_AS_DIGITAL_I_O_ON_RESET_3H & _LPT1OSC_ON_3H & _MCLRE_MCLR_ON_RE3_OFF_3H;
__code char __at __CONFIG4L CONFIG4L = _STVR_ON_4L & _LVP_OFF_4L & _ENHCPU_OFF_4L & _BACKBUG_OFF_4L;
__code char __at __CONFIG5L CONFIG5L = _CP_0_OFF_5L & _CP_1_OFF_5L & _CP_2_OFF_5L & _CP_3_OFF_5L;
__code char __at __CONFIG5H CONFIG5H = _CPB_OFF_5H;
__code char __at __CONFIG6L CONFIG6L = _WRT_0_OFF_6L & _WRT_1_OFF_6L & _WRT_2_OFF_6L & _WRT_3_OFF_6L;
__code char __at __CONFIG6H CONFIG6H = _WRTC_OFF_6H & _WRTB_OFF_6H;
__code char __at __CONFIG7L CONFIG7L = _EBTR_0_OFF_7L & _EBTR_1_OFF_7L & _EBTR_2_OFF_7L & _EBTR_3_OFF_7L;
__code char __at __CONFIG7H CONFIG7H = _EBTRB_OFF_7H;

//Definiciones de servos
#define SERVO1 LATBbits.LATB0
#define SERVO2 LATBbits.LATB1
#define SERVO3 LATBbits.LATB2
#define SERVO4 LATBbits.LATB3
#define SERVO5 LATBbits.LATB4
#define SERVO6 LATBbits.LATB5
#define SERVO7 LATBbits.LATB6
#define SERVO8 LATBbits.LATB7

#define CSERVO1 TRISBbits.TRISB0
#define CSERVO2 TRISBbits.TRISB1
#define CSERVO3 TRISBbits.TRISB2
#define CSERVO4 TRISBbits.TRISB3
#define CSERVO5 TRISBbits.TRISB4
#define CSERVO6 TRISBbits.TRISB5
#define CSERVO7 TRISBbits.TRISB6
#define CSERVO8 TRISBbits.TRISB7

typedef enum{false = 0, true = 1} boolean; //para definir variables booleanas

//Constantes para la definición de ventanas
const unsigned Ticks4WindowH = 0x75;
const unsigned Ticks4WindowL = 0x2F;
const unsigned Ticks4CenterH = 0x46;
const unsigned Ticks4CenterL = 0x4F;
const unsigned Ticks4MinimumH = 0x17;
const unsigned Ticks4MinimumL = 0x6F;
const unsigned Ticks4MaximumH = 0x6B;
const unsigned Ticks4MaximumL = 0xCF;
static unsigned int Ticks4NextInterruptH = 0xCF;
static unsigned int Ticks4NextInterruptL = 0x2C;


const unsigned Ticks4Window = 0x752F;
const unsigned Ticks4Minimum = 0x176F;
const unsigned Ticks4Center = 0x464F;
const unsigned Ticks4Maximum = 0x6BCF;
static unsigned int Ticks4NextInterrupt = 0xCF2C;
static unsigned int Servo_PWM[8];
static unsigned int tempom=0x0000;
static unsigned int tempo=0x0000;
static unsigned int tempol;
static unsigned int tempoh;

static unsigned int Servo_PWMH[8];
static unsigned int Servo_PWML[8];
static unsigned short Servo_Idx = 0;

boolean SERVO1_ON = false;
boolean SERVO2_ON = false;
boolean SERVO3_ON = false;
boolean SERVO4_ON = false;
boolean SERVO5_ON = false;
boolean SERVO6_ON = false;
boolean SERVO7_ON = true;
boolean SERVO8_ON = true;


boolean flag_Phase;
unsigned short j=0xFF;
unsigned int posI;

//Prototipos
void init_board(void);
void EnableTimer1Interrupt(void);
void DiSi(void);
void DiNo(void);
void Tmr1Carga(unsigned char tempoH,unsigned char tempoL);
unsigned int SelectServo(unsigned char Servo);
void turnPlus(int vueltas, unsigned char vel, unsigned char Servo);
void turnMinus(int vueltas, unsigned char vel, unsigned char Servo);


//Sección de interrupciones
static void isr_Tmr1() __interrupt 1 //Esta es una interrupcion de alta prioridad
{
PIE1bits.RCIE=0; //deshabilitamos la interrupcion del puerto serie
if(flag_Phase == 1)
{
if(Servo_Idx == 0 && SERVO1_ON) {SERVO1 = 1;}
if(Servo_Idx == 1 && SERVO2_ON) {SERVO2 = 1;}
if(Servo_Idx == 2 && SERVO3_ON) {SERVO3 = 1;}
if(Servo_Idx == 3 && SERVO4_ON) {SERVO4 = 1;}
if(Servo_Idx == 4 && SERVO5_ON) {SERVO5 = 1;}
if(Servo_Idx == 5 && SERVO6_ON) {SERVO6 = 1;}
if(Servo_Idx == 6 && SERVO7_ON) {SERVO7 = 1;}
if(Servo_Idx == 7 && SERVO8_ON) {SERVO8 = 1;}
Ticks4NextInterruptH = 0xFF - Servo_PWMH[Servo_Idx];
Ticks4NextInterruptL = 0xFF - Servo_PWML[Servo_Idx];
Tmr1Carga(Ticks4NextInterruptH,Ticks4NextInterruptL);
}

if(flag_Phase == 0)
{
if(Servo_Idx == 0 && SERVO1_ON) {SERVO1 = 0;}
if(Servo_Idx == 1 && SERVO2_ON) {SERVO2 = 0;}
if(Servo_Idx == 2 && SERVO3_ON) {SERVO3 = 0;}
if(Servo_Idx == 3 && SERVO4_ON) {SERVO4 = 0;}
if(Servo_Idx == 4 && SERVO5_ON) {SERVO5 = 0;}
if(Servo_Idx == 5 && SERVO6_ON) {SERVO6 = 0;}
if(Servo_Idx == 6 && SERVO7_ON) {SERVO7 = 0;}
if(Servo_Idx == 7 && SERVO8_ON) {SERVO8 = 0;}
Ticks4NextInterruptH = 0xFF - Ticks4WindowH;
Ticks4NextInterruptL = 0xFF - Ticks4WindowL;

if(Ticks4NextInterruptL + Servo_PWML[Servo_Idx] > 0xFF)
{
Ticks4NextInterruptL = Ticks4NextInterruptL + Servo_PWML[Servo_Idx];
Ticks4NextInterruptH = Ticks4NextInterruptH + Servo_PWMH[Servo_Idx] + 1;
}
else
{
Ticks4NextInterruptL = Ticks4NextInterruptL + Servo_PWML[Servo_Idx];
Ticks4NextInterruptH = Ticks4NextInterruptH + Servo_PWMH[Servo_Idx];
}
Tmr1Carga(Ticks4NextInterruptH, Ticks4NextInterruptL);
if(++Servo_Idx > 7 ) Servo_Idx = 0;
}
if(++flag_Phase > 1) flag_Phase = 0;

//Esta instruccion se esta ejecutando cada 13ms con un xtal de 20MHz
//LATBbits.LATB7^=1; //complementamos el valor del bit RB7
PIR1bits.TMR1IF=0; //limpiamos la bandera de interrupcion
PIE1bits.RCIE=1; //habilitamos la interrupcion del puerto serie
}



//Funcion Principal
int main(void)
{
//declaracion de variables
int i=0;
int button_down=1;
int valTimer=0;

RCONbits.IPEN=1; //interrupciones por prioridad habilitadas

init_board();


//Centrar los servos
for (i=0;i<9;i++)
{
Servo_PWMH[i] = Ticks4CenterH;
Servo_PWML[i] = Ticks4CenterL;
}

EnableTimer1Interrupt();
tempo = Ticks4Center;
tempoh = tempo & 0xFF00;
tempol = tempo & 0x00FF;
Tmr1Carga(tempoh, tempol);
posI = Ticks4Center;




while (true)
{
//Aquí va el código para si y no
if(!PORTBbits.RB0) //Termino exitosamente la actividad
{
PORTAbits.RA4 = 0;
DiSi();
// PORTAbits.RA4 = 1;
// delay_ms(20);
// PORTAbits.RA4 = 0;
// delay_ms(20);
}
if(!PORTBbits.RB1) //esta prendido el led amarillo del semaforo
{
PORTAbits.RA4 = 0;
DiNo();
}
else
{
PORTAbits.RA4 = 1; //Mientras no pase nada prende el testigo
delay_ms(20);
PORTAbits.RA4 = 0;
delay_ms(20);
}
}
return 0;
}


void init_board(void)
{
ADCON1=0x7; // PORTA used for digital I/O
TRISAbits.TRISA4=false; // configure PORTA4 como salida TESTIGO
/*Falta configurar RA0 y RA1 como entradas*/
/* Configuramos las salidas de los servomotores*/
CSERVO1 = true;
CSERVO2 = true;
CSERVO3 = true;
CSERVO4 = true;
CSERVO5 = true;
CSERVO6 = true;
CSERVO7 = false;
CSERVO8 = false;
//configurar Entradas para GRAMAKIT
TRISBbits.TRISB0 = true;
TRISBbits.TRISB1 = true;

}

void EnableTimer1Interrupt(void)
{
T1CON=1; //Timer1 preescaler 1 interno, carga de 8 bits
PIE1bits.TMR1IE=1;
INTCONbits.PEIE=1;
INTCONbits.GIE=1;
}

void DiSi(void)
{
unsigned char posicion[] = {60,90,60,90,60,90}; //posiciones en grados a mover la cabeza para decir SI
unsigned char i, DerIzq = 1;
unsigned char vel=1; //AQUI SE DEFINE LA VELOCIDAD DEL SERVO
//si quieres ver como se puede modificar este valor por medio
//de rs232, ve el archivo timer1.c


unsigned int posF;
unsigned int vueltas;

for(i = 0;i<4;i++)
{
posI = SelectServo(6); //El servo conectado a RB6
posF = 106.66 * posicion[i] + 8399;

if(posF>posI){
vueltas = posF - posI;
vueltas = vueltas / vel;
DerIzq = 1;
}
else
{
vueltas = posI - posF;
vueltas = vueltas/ vel;
DerIzq = 0;
}

if(DerIzq)
{
turnPlus(vueltas,vel,6);
}
else
{
turnMinus(vueltas,vel,6);
}
delay_ms(10);
}
}

void DiNo(void)
{
unsigned char posicion[] = {60,120,60,90}; //posiciones en grados a mover la cabeza para decir NO
unsigned char i, DerIzq = 1;
unsigned char vel=1; //AQUI SE DEFINE LA VELOCIDAD DEL SERVO
//si quieres ver como se puede modificar este valor por medio
//de rs232, ve el archivo timer1.c


unsigned int posF;
unsigned int vueltas;

for(i = 0;i<4;i++)
{
posI = SelectServo(7); //El servo conectado a RB7
posF = 106.66 * posicion[i] + 8399;

if(posF>posI){
vueltas = posF - posI;
vueltas = vueltas / vel;
DerIzq = 1;
}
else
{
vueltas = posI - posF;
vueltas = vueltas/ vel;
DerIzq = 0;
}

if(DerIzq)
{
turnPlus(vueltas,vel,7);
}
else
{
turnMinus(vueltas,vel,7);
}
delay_ms(10);
}

}

//Funcion para cargar el timer1 con valor dado por el usuario
void Tmr1Carga(unsigned char tempoH,unsigned char tempoL)
{
TMR1H=tempoH;
TMR1L=tempoL;
}


//Función para elegir el valor de tiempo que tiene un servo

unsigned int SelectServo(unsigned char Servo)
{
tempoh = Servo_PWMH[Servo];
tempo = tempoh << 8;
return (tempo | Servo_PWML[Servo]);
}


//Funcion para dar un valor incremental a la posición de un servo determinado
void turnPlus(int vueltas, unsigned char vel, unsigned char Servo)
{
int i=0;

for(i=0;i> 8;
Servo_PWMH[Servo] = tempoh;
delay_us(100);
}
}

//Funcion para dar un valor decremental a la posicion de un servo determinado
void turnMinus(int vueltas, unsigned char vel, unsigned char Servo)
{
int i=0;

for(i=0;i> 8;
Servo_PWMH[Servo] = tempoh;
delay_us(100);
}
}