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