Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

08/11/2012 #1


Problema con while (1)
Hola, he hecho un programa muy simple para aprender, consiste en un contador ascedente 0-9 y descendente 9-0 mientras se pulsa un botón. Uso un 7 segmentos de ánodo común.

Voy guiándome con algunos ejercicios ya resueltos.

El problema está en que me gusta más poner el loop infinito while de manera que en su interior se encuentre el código a repetir y no al final como algunos hacen. Así que después de comprobar que el programa funciona he querido poner el "while(1)" a mi gusto.
Pero al compilar me da error.

Alguien podría decirme porque??

Adjunto programa funcionando Ok:


Código PHP:
/* 
 * File:   main.c
 * Author: nimio
 *
 * 16F84A
 * 
 * Programa contador en display 7 segmentos. de 0-9 y 9-0
 * con pulsador. Según la posición del pulsador contará ascendente o descendentemente.
 * 
 * DISPLAY 7 SEGMENTOS DE ÁNODO COMÚN.
 * 
 * Created on 8 de noviembre de 2012, 18:13
 */

#include <xc.h>

#define _XTAL_FREQ 4000000

#pragma config FOSC=XT, WDTE=OFF, PWRTE=ON, CP=OFF


//DECLARACIÓN DE VARIABLES GLOBALES:

int contador//Variable contador que se irá incrementando o decrementando según el pulsador
    
int tabla7seg [10]={0xC00xF90xA40xB00x990x920x820xF80x800x98}; //Vector de
                                                                                 //10 posiciones
                                                                                 //con los números
                                                                                 //de 0-9 en HEX.
//DECLARACIÓN DE FUNCIONES:

void up (void) {

    if (
contador<9) {

        
contador++;
    }
}

void down (void) {

    if (
contador>0) {

        
contador--;
    }
}


//PROGRAMA PRINCIPAL:

void main(void) {
    
    
    
TRISAbits.TRISA0=1// Pin 0 Puerto A definido como entrada.
    
TRISB=0;
    
PORTB=0;
    
        if (
RA0=1) {    //Pulsador en RA0 = 1 lógico (sin pulsar pulsador).

            
contador=-1//Contador para modo ascendente.
                         //Se pone a -1 (más bajo de 0) para que visualice el 0.
        
}

        else {           
//Pulsador pulsado (0 lógico).

            
contador=10//Contador para modo descendente.
        
}
                do {
                    if (
RA0=1) {
                        
up();
                    }
                    else {
                        
down();
                    }
                    
PORTB=tabla7seg[contador];
                    
__delay_ms(1000);
                }
    while(
1);
   } 

Y el programa con el "while (1)" donde yo quiero ponerlo:


Código PHP:
/* 
 * File:   main.c
 * Author: nimio
 *
 * 16F84A
 * 
 * Programa contador en display 7 segmentos. de 0-9 y 9-0
 * con pulsador. Según la posición del pulsador contará ascendente o descendentemente.
 * 
 * DISPLAY 7 SEGMENTOS DE ÁNODO COMÚN.
 * 
 * Created on 8 de noviembre de 2012, 18:13
 */

#include <xc.h>

#define _XTAL_FREQ 4000000

#pragma config FOSC=XT, WDTE=OFF, PWRTE=ON, CP=OFF


//DECLARACIÓN DE VARIABLES GLOBALES:

int contador//Variable contador que se irá incrementando o decrementando según el pulsador
    
int tabla7seg [10]={0xC00xF90xA40xB00x990x920x820xF80x800x98}; //Vector de
                                                                                 //10 posiciones
                                                                                 //con los números
                                                                                 //de 0-9 en HEX.
//DECLARACIÓN DE FUNCIONES:

void up (void) {

    if (
contador<9) {

        
contador++;
    }
}

void down (void) {

    if (
contador>0) {

        
contador--;
    }
}


//PROGRAMA PRINCIPAL:

void main(void) {
    
    
    
TRISAbits.TRISA0=1// Pin 0 Puerto A definido como entrada.
    
TRISB=0;
    
PORTB=0;
    
    while (
1) {

        if (
RA0=1) {    //Pulsador en RA0 = 1 lógico (sin pulsar pulsador).

            
contador=-1//Contador para modo ascendente.
                         //Se pone a -1 (más bajo de 0) para que visualice el 0.
        
}

        else {           
//Pulsador pulsado (0 lógico).

            
contador=10//Contador para modo descendente.
        
}
                do {
                    if (
RA0=1) {
                        
up();
                    }
                    else {
                        
down();
                    }
                    
PORTB=tabla7seg[contador];
                    
__delay_ms(1000);
                }
         } 
// Cierro llave de While (1)
   

En este segundo programa me da error en la llave de cierre del while.

Porqué??

Saludos
08/11/2012 #2

Avatar de Dr. Zoidberg

Y claro que te va a dar un error!!! Has abierto un do...while dentro del while(1), pero no lo has cerrado.
En fin...que se supone que intenta hacer el do dentro del while???? Por que esa es la causa del error.
08/11/2012 #3


ezavalla gracias por responder.

A que te refieres con que no lo he cerrado?? creo que todas las llaves están cerradas "}".

Por lo que dices entiendo que un "do" no puede ir nunca dentro de un while??

Saludos
08/11/2012 #4

Avatar de ByAxel

Hola:
La sintaxis es...

Para While, se compara al ínicio del bucle:

Código:
while(1){

}
Para Do, se compara al final del bucle:

Código:
do{

}while(1);
En el código te falta agregar el while(1); al final del bucle "do".

Saludos.
08/11/2012 #5


ByAxel aha...

Ok, entonces ahora me queda más claro. Ya entiendo el porqué.

Muchas gracias a los dos por el interés.

Saludos
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.