Pregunta

Entonces, tengo que hacer este desafío, que es implementar un sistema de vigilancia de la cámara para un microcontrolador 8051.

Estas son las especificaciones:

  1. Cada cámara está relacionada con un sensor de movimiento, y cada vez que detecta un movimiento, la grabación de esta cámara estará entre las que se registrarán y guardarán. Si el sensor no captura ningún movimiento durante más de 5 segundos, esta cámara ya no se grabará;

  2. Si no hay cámara, la grabadora de video debe estar en "pausa";

  3. Si se enciende más de una cámara, se debe usar un multiplexor (MUX) para seleccionar las señales de la cámara de manera que cada cámara esté grabada durante 3 segundos. De esta manera, todas las cámaras activas deben registrarse durante 3 segundos. Si solo una cámara está activa, su señal debe ser la única en el MUX.

  4. Esto ya he logrado en el código a continuación. Y lo que tenemos que hacer ahora es optimizar el tamaño del código sin las optimizaciones del compilador. El código es de 198 bytes por ahora, pero estoy tratando de obtener menos de 180 bytes.

    ¿Es posible? Ya intenté hacer los cálculos de la #define, pero el compilador ya optimiza eso para mí.

    #include <REG51F.h>
    
    #define TIMEOUT 50
    #define TIMEOUT_REC 30
    
    #define FrClk 12000000
    #define FreqTimer0_emHz 10
    #define VALOR_TH0 ((65536 - (FrClk /(12 * FreqTimer0_emHz ))) >> 8)
    #define VALOR_TL0 ((65536 - (FrClk /(12 * FreqTimer0_emHz ))) & 0xFF)
    
    
    data bit PAUSE_INT;
    data bit PAUSE_TMP;
    sbit PAUSE = P0^0;
    sbit SENSOR1 = P0^1;
    sbit SENSOR2 = P0^2;
    sbit SENSOR3 = P0^3;
    sbit SENSOR4 = P0^4;
    sbit MUX0 = P0^5;
    sbit MUX1 = P0^6;
    
    data unsigned char CAM[4];
    data unsigned char REC;
    data unsigned char index;
    data unsigned char count;
    
    void timer0_int (void) interrupt 1 using 2 {
        for (index = 0; index < 4; index++)
            if(CAM[index])
            CAM[index]--;
    
        if (!PAUSE_INT && REC)
            REC--;
        else
        { 
             REC = TIMEOUT_REC;
             index = (index + 1) & 0x03;
             for (count = 0; !CAM[index] && count < 4; index = (index + 1) & 0x03, count++);
    
             MUX0 = index & 0x1;
             MUX1 = index & 0x2;
    
    
             PAUSE_INT = 0;
        }   
    }
    
    int main(void)
    {
    
        PAUSE_TMP = 1;
        PAUSE_INT = 0;
    
        index = 0;
    
        //timer0_init
        EA = 1;
        TR0 = 0;              
        TMOD = (TMOD & 0xF0) | 0x01;  
        TH0 = VALOR_TH0;  
        TL0 = VALOR_TL0;
        ET0 = 1;     
        TR0 = 1;     
    
        while(1) {
    
            if (SENSOR1)
            {
                    CAM[0] = TIMEOUT;
            }
    
            if (SENSOR2)
            {
                    CAM[1] = TIMEOUT;
            }
    
            if (SENSOR3)
            {
                    CAM[2] = TIMEOUT;
            }
    
            if (SENSOR4)
            {
                    CAM[3] = TIMEOUT;
            }
    
            if (CAM[0] || CAM[1] || CAM[2] || CAM[3])
            {
                    if (PAUSE_TMP)
                            PAUSE_INT = 1;
                    PAUSE_TMP = 0;
            }
            else {
                    PAUSE_TMP = 1;
            }
    
                PAUSE = PAUSE_TMP;
        }
    
    
    }
    

¿Fue útil?

Solución

Probablemente tendrá que mirar el código de ensamblaje generado para esto para escurrir los últimos bytes fuera de él.Probablemente sea posible afeitarse unos pocos aquí y al reutilizar una variable o combinar operaciones.El código resultante no será bonito, o se puede mantener, pero podría llevarlo debajo de su corte.

Otros consejos

Creo que un caso de conmutación en lugar de si (Sensor1,2,3,4) podría ayudar a algunos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top