Как использовать прерывание для сброса моей программы или go назад к основному во время вызова функции - PullRequest
0 голосов
/ 03 мая 2020

Я перепробовал все, и мне известно о (void (code *) (void)) 0) ();, но, как вы знаете, если вы используете его, не удаляет прерывания, и вы можете ' Не используй это снова. Что такое обходной путь, и я должен использовать внешнее прерывание на основе моего HW. Я исследовал бесчисленные часы и просмотрел несколько моих книг. Я начинаю верить, что это не возможно? Код:

#include <reg51.h>
void delay();
int i,a;
sbit btn=P3^2;
sbit sw1=P0^1;
void mode1();
void reset (void);

void main()
{
    EA=1;
    EX0=1;
    ET0=1;
    EX1=1;

while(1){
    EA=1;
    EX0=1;
    ET0=1;
    EX1=1;
        if(sw1){
            mode1();
        }
        P1=0x01;
    }
}

void ex0() interrupt 0{
    if(!btn){
        //reset();
        Enable_Watchdog(); 
    }
}
/*
void reset (void){
(//(void (code *) (void)) 0x0000) ();
    (void (code *)(void)) 0) ();
}
    */

void mode1(){

    unsigned char repeat1 = 0x80;
    unsigned char repeat0 = 0x01;
    int g=0;
    int i =0;
    int j=0;
    EA=1;
    EX0=1;
    ET0=1;
    EX1=1;
        //how many leds it must go accross minus 1 since repeat 1 and 0

        while(sw1){
        EA=1;
        EX0=1;
        ET0=1;
        EX1=1;
        for(i =0; i <7; i++){
                P1=repeat1 >> i;
                delay();
            }
        for(j=0; j<7; j++){
            P1=repeat0 << j;
            delay();
        }
    }
}


void delay(){
    int k, j;
    for(k=0; k<0xff; k++)
        for(j=0;j<0xff;j++);

}



1 Ответ

0 голосов
/ 03 мая 2020

Что не так с сторожевым таймером, который у вас уже есть в коде вопроса? Это будет работать, но нужно потратить деньги:

void ex0() interrupt 0
{
    if(!btn)
    {
        EA = 0;   // Disable interrupts

        // Set watchdog counter and timeout 
        // to zero for immediate reset
        PCA0L    = 0x00;
        PCA0H    = 0x00;
        PCA0CPL2 = 0x00; 

        // Enable watchdog
        PCA0MD  |= 0x40;

        for(;;);  // Wait for reset
    }
}

Лучшее решение, если вы можете, - это подключить GPIO к выводу сброса (с подтягиванием) и сбросить его напрямую. При сбросе GPIO будет в трех состояниях, поэтому сбросьте сброс - благодаря подтягиванию. При инициализации GPIO вам необходимо позаботиться о том, чтобы вы не сразу понизили его. Вероятно, лучше оставить его как триединый вход, пока вы на самом деле не захотите выполнить сброс.

...