Question

Donc, je dois faire ce défi, qui consiste à mettre en place un système de surveillance de la caméra pour un microcontrôleur 8051.

Ce sont les spécifications:

  1. Chaque caméra est liée à un capteur de mouvement, et chaque fois qu'il détecte un mouvement, l'enregistrement de cette caméra sera parmi ceux qui seront enregistrés et enregistrés. Si le capteur ne capture aucun mouvement pendant plus de 5 secondes, cette caméra ne sera plus enregistrée;

  2. S'il n'y a pas d'appareil photo sur, l'enregistreur vidéo doit être sur "Pause";

  3. Si plusieurs caméras sont activées, un multiplexeur (mux) doit être utilisé pour sélectionner les signaux de la caméra d'une manière afin que chaque caméra soit enregistrée pendant 3 secondes. De cette façon, toutes les caméras actives doivent être enregistrées pendant 3 secondes. Si une seule caméra est active, son signal doit être le seul au MUX.

  4. Ce que j'ai déjà accompli dans le code ci-dessous. Et ce que nous devons faire maintenant, c'est d'optimiser la taille du code sans optimisations du compilateur. Le code est de 198 octets d'ici maintenant, mais j'essaie d'obtenir en dessous de 180 octets.

    est-ce possible? J'ai déjà essayé de faire les calculs du #define, mais le compilateur optimise déjà cela pour moi.

    #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;
        }
    
    
    }
    

Était-ce utile?

La solution

Vous allez probablement devoir regarder le code de montage généré pour cela afin de tordre les derniers octets de celui-ci.Il est probablement possible de raser quelques-uns ici et là en réutilisant une variable ou une combinaison d'opérations.Le code résultant ne sera pas jolie - ou de maintenir - mais cela pourrait simplement vous mettre au-dessous de votre coupure.

Autres conseils

Je pense qu'un étui de commutation au lieu de si (capteur1,2,3,4) pourrait aider certains.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top