programa para 89C51 en sdcc no funciona como deberia

¿Como están? Miren necesito ayuda con un problema que se me esta presentando, siempre he programado en pic en ccs y en estos días me pusieron un trabajo en el cual tengo que programar un 89c51 en SDCC para eso utilizamos el IDE M-IDE MCS-51. El ejercicio es el siguiente.

1. Cuando la entrada HABILITA esta desactivada, la salida ALARMA se apaga.
2. Cuando la entrada HABILITA esta activada, la salida ALARMA depende de la entrada PULSO.
3. Cuando la entrada PULSO se activa con un período menor a 1s, la salida ALARMA se enciende. En caso contrarío se apaga.

en el programa a continuación hay un while (2) con el cual cuento los ciclos y ahí aproximo a lo que debería ser el segundo. pero parece que no hiciera la comparación con 1millon (0xF4240). alguien me puede dar una mano?

adjunto el proteus

Código:
//inclusion de librerias
#include <C:\MIDE\sdcc\include\asm\mcs51\features.h>
#include <C:\MIDE\sdcc\include\math.h>
#include <C:\MIDE\sdcc\include\stdint.h>
#include <C:\MIDE\sdcc\include\stdio.h>
#include <C:\MIDE\sdcc\include\stdlib.h>

//declaracion de variables globales
__sbit __at 0xB3 HAB;    //PORT 3 BIT 3
__sbit __at 0xB2 PUL;    //PORT 3 BIT 2
__sbit __at 0xB7 alarma;//PORT 3 BIT 7
__sfr __at 0xB0 P3;      //PORT 3
__sfr __at 0xA0 P2;      //PORT 3

//funcion principal
void main() 
{     

__bit PULSADOR = 1;
unsigned long cnt = 0; //4294967295
alarma = 1;

    while(1){ //while 1
    
        if(HAB == 1){
        alarma = 1;
        cnt = 0;
        }
        else{ //else 1
        
        PULSADOR = PUL;
        
            if(PULSADOR == 0){
            
            PULSADOR = PUL;            
            
                while(PULSADOR == 0){ //while 2
                    cnt++;
                    PULSADOR = PUL;
                } // while 2
                
                if(PUL == 1){
                
                    if(cnt < 0xF4240){
                        alarma = 0;
                        cnt = 0;
                    }
                    else{
                        alarma = 1;
                        cnt = 0;    
                    }
                }
            }
        } //end else 1
    }    //end while 1    
} //end void
 

Adjuntos

  • asignacion1.zip
    9 KB · Visitas: 3
Última edición por un moderador:
les cuento que hice el programa igual pero para un pic16f887 y tengo un problema simulando en isis proteus parece que este pic no acepta declarar variables de 32bit (int32) hice un for

long long cnt = 0;

for (cnt=0;cnt<4294967295;cnt++){
}

y solo me cuenta hasta 65535
 
Atrás
Arriba