código que no sigue el procedimiento

0

Actualmente estoy trabajando con ATTiny1634, ejecutando el siguiente código

Después de ejecutar la instrucción break, el programa no sale del bucle while interno al bucle while externo; En cambio, salta a la función principal.

Para probar, eliminé todas las funciones USART uart_init , writecommand , transmit , después de eliminar todo este código de función funciona perfectamente.

El código funciona con ATMega16A, pero tiene un problema en ATTiny1634. ¿Por qué?

int main()
{   
    DDRC=1<<DDRC0;
    DDRA|= 1<<PORTA3;
    uart_init();
    sei();  
    writecommand("AT");

    writecommand("ATE0");
while (1)

  {
    int8_t t;
    PORTA=1<<PORTA3;
    // controller sleep mode
        if(MCUSR & (1<<WDRF))
        {
            MCUSR&= ~(1<<WDRF);
            WDTCSR|= 1<<WDE;
            WDTCSR= 0x00;
        }
        PORTA=0<<PORTA3;
        set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode selected
            //PRR=0X75;
            wdt_reset();
            WDTCSR |= 1<<WDE;           
            WDTCSR |= (1<<WDIE|1<<WDP3 |1<<WDP0); // ENABLE WATCH DOG TIMER INTERRUPT WITH 8S TIME OUT          
        sleep_enable();  //set SE bit   
        sei();  
        sleep_cpu(); //sleep mode activated

      while (1)
        {
         if(count >=2) // 80S DELAY
           {
            count=0;
            sleep_disable();   // SE bit reset
            WDTCSR|=0<<WDE|0<<WDIE; // disable watch dog timer
            transmit("AT+CFUN=1\r\n");
            _delay_ms(2000);            
            clearbuffer(buff);
            clearbuffer(temp_buff);
            _delay_ms(2000);
            break;
           }
         else
          {
            WDTCSR|=1<<WDIE;
            sleep_cpu();
          }         
        }

    }    

} 

El código para writecommand :     void writecommand (char * q)     {

    char str[3]="OK";
    char str1[50];
    do
    {
        clearbuffer(str1);
        strcpy(str1,q);

        i=0;
        _delay_ms(10);
        clearbuffer(buff);
        clearbuffer(temp_buff);
        transmit(str1);
        transmit("\r\n");
        _delay_ms(200);
        for(j=10;j>0;j--)
        _delay_ms(10);
        logic();   // my me
        clearbuffer(buff);        

    }while(strcmp(str3,str)!=0);    

Estoy usando el oscilador interno de 8 MHz y la velocidad de transmisión en USART es 9600. Otras funciones son:

void uart_init()
{
    UCSR0B=(1<<TXEN0)|(1<<RXEN0)|(1<<RXCIE0); //transmitter enable,receiver enable,receive complete interrupt enable
    UCSR0C=(1<<UCSZ01)|(1<<UCSZ00);//8 bit data bits  
    UBRR0L=51; // baud rate 9600
}
void uart_send(unsigned char ch)
{
    while(!(UCSR0A &(1<<UDRE0)));
    UDR0=ch;
}
void transmit(char *p)
{
    i=0;
    while(*p!='
int main()
{   
    DDRC=1<<DDRC0;
    DDRA|= 1<<PORTA3;
    uart_init();
    sei();  
    writecommand("AT");

    writecommand("ATE0");
while (1)

  {
    int8_t t;
    PORTA=1<<PORTA3;
    // controller sleep mode
        if(MCUSR & (1<<WDRF))
        {
            MCUSR&= ~(1<<WDRF);
            WDTCSR|= 1<<WDE;
            WDTCSR= 0x00;
        }
        PORTA=0<<PORTA3;
        set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode selected
            //PRR=0X75;
            wdt_reset();
            WDTCSR |= 1<<WDE;           
            WDTCSR |= (1<<WDIE|1<<WDP3 |1<<WDP0); // ENABLE WATCH DOG TIMER INTERRUPT WITH 8S TIME OUT          
        sleep_enable();  //set SE bit   
        sei();  
        sleep_cpu(); //sleep mode activated

      while (1)
        {
         if(count >=2) // 80S DELAY
           {
            count=0;
            sleep_disable();   // SE bit reset
            WDTCSR|=0<<WDE|0<<WDIE; // disable watch dog timer
            transmit("AT+CFUN=1\r\n");
            _delay_ms(2000);            
            clearbuffer(buff);
            clearbuffer(temp_buff);
            _delay_ms(2000);
            break;
           }
         else
          {
            WDTCSR|=1<<WDIE;
            sleep_cpu();
          }         
        }

    }    

} 
') { uart_send(*p); p++; } } void clearbuffer(char *p) { while(*p!=0) { *p=' '; p++; } }
    
pregunta pranjal khanduri

1 respuesta

0

Cada vez que cambie de un procesador a otro, es necesario volver a examinar la referencia a un periférico de TODOS > . Su código es un ejemplo de perfecto : está lleno de código específico de Watchdog, y cualquier cambio podría hacer que el nuevo procesador se comporte de forma extraña.

¿Sabes lo que es un temporizador de vigilancia? Está dentro del controlador, y su propósito sole es restablecer el microcontrolador al principio de main() . Eso es todo lo que hace, y lo único que puede detenerlo es si el código "da palmaditas" al Watchdog antes de que se agote. La idea es que estructure cuidadosamente su programa para que "acaricie" al Watchdog de vez en cuando; si no lo hace, entonces el código es incorrecto y el microcontrolador se reinicia.

El código dado incluso tiene un error en su interior:

    WDTCSR|= 1<<WDE;
    WDTCSR= 0x00;

Este código configura cuidadosamente los bits dentro de " W atch D og T imer C ontrol / < strong> S tatus R egister ( WDTCSR ) "- luego lo pone a cero. Ummm ... ¿qué?

En resumen, es difícil tomar el código existente para un procesador y simplemente ejecutarlo en otro diferente y esperar que funcione. Hasta que lo hagas, te recomendaría comentar el código ALL que hace referencia al Watchdog, hasta que el resto del código funcione.

    
respondido por el John Burger

Lea otras preguntas en las etiquetas