TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: wofer en 14 de Marzo de 2004, 13:00:00
-
si pongo esto:
#include <16f870.h>
#use delay(clock=8000000)
#fuses HS,NOWDT,NOPROTECT
#byte PORTC = 0x07
#byte SUMA = 0x20 **********************
#bit LED_AZUL = PORTC.5
#bit LED_ROJO = PORTC.3
#bit LED_VERDE = PORTC.4
MAIN() {
SET_TRIS_A (0b00000000);
SET_TRIS_B (0b00000000);
SET_TRIS_C (0b00000000);
SUMA = 0;
START:
if (suma == 2){
led_verde = true;
}
suma +=1;
delay_ms(1000);
goto start;
}
........porke nunca me enciende el led_verde????sin embargo si cambio el:
#byte SUMA = 0x20
por el :
static byte SUMA = 0x20; .........asi si ke me funciona bien.
No lo entiendo!!! Estoy intentando cambiar el "pic basic" por el "c" y me esta volviendo loko!!!.....es como si al ponerle #byte...
no hiciese la suma correspondiente...........¿me podeis echar una mano???
Saludos!
-
para definir una variable debes hacerlo de esta forma:
int8 suma;
de esta forma suma es un byte...si quieres una word:
int16 suma;
si quieres para encender y apagar el led puedes usar las funciones de C output_high( PORTC.4) y output_low( PORTC.4).
saludos.
-
gracias por tu respuesta,pacalaconcurso!Pero una cosilla?...en cuanto a lo de usar el "output_high(pin_c4)" ,se puede sustituir el "(pin_c4)" por algun alias como "led_verde"???lo he intentado de mil formas y no lo he conseguido,por eso uso en "led_verde = true;"para no tener ke estar mirando constantemente los pines del pic.....pero de esta forma se ve ke no funciona muy bien porke si pongo :
#byte PORTC = 0x07
#bit LED_AZUL = PORTC.5
#bit LED_ROJO = PORTC.3
#bit LED_VERDE = PORTC.0
for (i=0;i<8;++i){
LED_ROJO = true;
LED_AZUL = true;
led_verde = true;
DELAY_MS(90);
LED_ROJO = false;
led_verde = false;
LED_AZUL = false;
DELAY_MS(90);
}
el led_verde se ralla y no hace lo ke le toca.....por lo menos simulado en proteus.
saludos!!!
-
para definir un alias a una variable prueba:
#definine LED_ROJO PORTC.3
de esta forma al compilar el compilador simplemente cambia LED_ROJO por PORTC.3 y asi puedes hacerlo tal y como quieres.
espero que te funcione.
-
Teóricamente con definiciones de #byte y #bit también debiera de funcionar. Esta es una forma de asignar variables a posiciones definidas por el usuario y no dejar que sea el compilador quien asigne esas posiciones. De todas formas lo más cómodo es hacer que sea el compilador quien se encargue y eso se hace como te decía Félix, definiendo en el main las variables como int1, int8, int16.
Este es tu programa, con algunas modificaciones, funcionando correctamente en PROTEUS:
#include <16f870.h>
#use delay(clock=8000000)
#fuses HS,NOWDT,NOPROTECT
#byte PORTC = 0x07
#bit LED_AZUL = PORTC.5
#bit LED_ROJO = PORTC.3
#bit LED_VERDE = PORTC.0
MAIN() {
int i;
SET_TRIS_A (0b00000000);
SET_TRIS_B (0b00000000);
SET_TRIS_C (0b00000000);
portc=0;
for (i=0;i<8;++i){ //parpadeo 8 veces
LED_ROJO = true;
LED_AZUL = true;
led_verde = true;
DELAY_MS(1000); //mejor visualizacion
LED_ROJO = false;
led_verde = false;
LED_AZUL = false;
DELAY_MS(1000);
}
}
Un saludo
-
primero que nada, que es lo que quieres hacer,
en tu programa original, para que entre por lo menos una vez en el if(), el valor de suma tiene que valer 2 en algun momento!!!.
Te recomiendo que el goto lo pongas fuera del if para que por lo menos vuelva a chequear, si no el if es verificado solo una vez.
Luego al menos deberia haber alguna condicion de cambio en la variable SUMA.
int contador;
contador=0;
SUMA=0;
START
contador++;
if(led_verde)
{
output_A(led_verde);
delay_ms(10);
led_verde=0;
}
if(SUMA==2)
{led_verde = true;
contador=0;
SUMA=0;
delay_ms(1000);
}
//a esto le llamaria una condicion de cambio
if(contador==1000)
{SUMA=2;}
GOTO START
Espero que te sirva
-
Ya esta claro!!lo ke me pasaba de la "suma" ke no incrementaba es debido(segun supongo yo) a ke el propio ccs reserva palabras para su propio uso,como el basic,pero el ccs se ve ke reserva las primeras y yo al xafar una de ellas(0x20) nunca tenia el valor ke keria.Si pongo "#byte suma = 0x40" si ke funciona.
El otro tema de setear los bits del puerto c poniendo:
LED_VERDE = false;
LED_AMARILLO = true;
LED_ROJO = false;
tambien me funciona,pero solo cuando lo pruebo en una placa board.Si lo simulo en proteus me va mal,se encienden solo el verde y el rojo,el amarillo no.¿Sabeis por ke me puede pasar esto?
Alomejor es algun tema de configuracion de proteus ya ke este sera 100% fiable,no?
................iba a poner los fixeros adjuntos pero no me ha dejado por falta de espacio.Pongo aki el programa completo para ke lo veais y haber si le podeis encontrar explicacion de porke en proteus no me va:
#include <16f870.h>
#use delay(clock=20000000)
#fuses HS,NOWDT,NOPROTECT
#byte PORTC = 0x07
#bit LED_VERDE = PORTC.4
#bit LED_AMARILLO = PORTC.5
#bit LED_ROJO = PORTC.6
MAIN() {
SET_TRIS_A (0b000001);
SET_TRIS_B (0b00000000);
SET_TRIS_C (0b00000000);
PORTA = 0;
PORTB = 0;
PORTC = 0;
INICIO:
// portc = 0b00010000;
LED_VERDE = true;
LED_AMARILLO = false;
LED_ROJO = false;
delay_ms(1000);
// rotate_left( &PORTC, 1); **si activo de esta forma las
//salidas,si ke me funciona bien...¿?
LED_VERDE = false;
LED_AMARILLO = true;
LED_ROJO = false;
delay_ms(1000);
// rotate_left( &PORTC, 1);
LED_VERDE = false;
LED_AMARILLO = false;
LED_ROJO = true;
delay_ms(1000);
GOTO INICIO;
}
Saludos!!
-
- El programa funciona bien en PROTEUS (he puesto comentarios a las líneas PORTA=0 y PORTB=0 ya que no tenías definidos estos puertos).
- El PROTEUS no funciona bien al 100 por 100, tiene cosas que no van bien, pero no por eso deja de ser el mejor programa de simulación que hay para PICs.
- Te recomiendo que no uses el GOTO en C, usa en su lugar un bucle while(1).
- Te recomiendo que para activar-desactivar bits uses output_bit(pin,value) y otras.
- Te recomiendo que te bajes el manual de CCS en español y hagas los programas desde el punto de vista del C, sin pensar en basic.
Un saludo
-
Eso es lo ke intento,pocher,acabar programando todo en c,pero eske este es bastante complicadillo y este lenguaje es totalmente
desconocido para mi.....pero bueno,tiempo al tiempo.
He vuelto a probar el programa siguiendo tus consejos pero tampoco me funciona bien,el led_amarillo sigue sin encenderse.Sera ke la version de proteus ke tengo estara anticuada o algo por el estilo.
Saludos!
-
No creo que sea eso.
Qué versión tienes? ... y miro de enviarte todos los ficheros
-
En el acceso directo de ISIS pone "ISIS 6 Professional",pero en el programa intall ke me baje solo pone "ProSis.exe".Este me lo baje de una web recomendada por un compañero de este foro.
Tambien del emule me baje uno ke pone "Proteus_6.3_SP1.exe".Este ultimo no lo he probado porke al intentar instalarlo tiene pinta de ser mas antiguo.
¿El ke tu tienes ke version es?¿Esta mas actualizada ke estos?
Saludos!!!
-
Yo todavía tengo la 6.2 SP4 y el programa lo prové con esta versión. Dame un correo y te envio los archivos. En la que tú tienes tiene también que funcionar.
Un saludo
-
Pues me haces un gran favor pocher,te lo agradezco.Probare haber con esa version haber si es eso o eske tengo algo mal por ahi.La direccion es la siguiente:
molanomola@msn.com
Yo tengo las versiones ke te he comentado antes,osea,ke si kieres alguna dimelo y te la envio.
Saludos!!!!!!!!