/* * usando watchdog * * Compilador : MPlabXC8 * Microcontrolador: 16F877A * Autor: aguivone * Versão: 1 * Data : 27/10/2014 */ #include <stdio.h> #include <stdlib.h> #include <string.h> //para usar funçoes de string deve se adicionar este header #include <xc.h> #define _XTAL_FREQ 16000000//usado para rotinas de delays // CONFIG #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = ON // Watchdog Timer Enable bit (WDT habilitado) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) //=================================================================================== //Função: _inicializa_RS232 //Parâmetros: unsigned long ulVelocidade // : unsigned int uiModo //Retorno: não tem retorno. //Descrição: usada para iniciar a porta serial. //=================================================================================== void inicializa_RS232(unsigned long ulVelocidade,unsigned int uiModo) {//// por padrão é usado o modo 8 bits e sem paridade, mas se necessario ajuste aqui a configuração desejada. // verifique datasheet para ver a porcentagem de erro e se a velocidade é possivel para o cristal utilizado. RCSTA = 0X90;//habilita porta serial,recepção de 8 bit em modo continuo,assincrono. int valor; if(uiModo == 1) {//modo = 1 ,modo alta velocidade TXSTA = 0X24;//modo assincrono,trasmissao 8 bits. valor =(int)(((_XTAL_FREQ/ulVelocidade)-16)/16);//calculo do valor do gerador de baud rate } else {//modo = 0 ,modo baixa velocidade TXSTA = 0X20;//modo assincrono,trasmissao 8 bits. valor =(int)(((_XTAL_FREQ/ulVelocidade)-64)/64);//calculo do valor do gerador de baud rate } SPBRG = valor; // PIE1 = 0X20; RCIE = 1;//habilita interrupção de recepção TXIE = 0;//deixa interrupção de transmissão desligado(pois corre se o risco de ter uma interrupção escrita e leitura ao mesmo tempo) } //=================================================================================== //Função: _escreve_RS232 //Parâmetros: char cValor //Retorno: não tem retorno. //Descrição: usada para escrever 1 caracter. //=================================================================================== void escreve_RS232(char cValor) { TXIF = 0;//limpa flag que sinaliza envio completo. TXREG = cValor; while(TXIF ==0);//espera enviar caracter } //=================================================================================== //Função: _imprime_RS232 //Parâmetros: const char ccFrase[] //Retorno: não tem retorno. //Descrição: usada para escrever uma string(vetor de caracteres). //=================================================================================== void imprime_RS232(const char ccFrase[]) { unsigned char indice = 0; unsigned char tamanho = strlen(ccFrase); while(indice < tamanho ) ///veja que o programa pode travar se aqui não tiver as duas aspas { escreve_RS232(ccFrase[indice]); indice++; } } //*******************************Rotina principal*********************************************/ void main(void) { TRISA = 0XFE; TRISB = 0X00;//configura portB como saida TRISD = 0X00;//todas são saidas TRISC = 0X80;//todas são saidas exceto C7(pino RX) TRISE = 0X00;//todas são saidas PORTA = 0X00; PORTB = 0; // limpar as portas que estão configuradas como saidas PORTC = 0; PORTD = 0; PORTE = 0; inicializa_RS232(9600,1);//modo de alta velocidade PEIE = 1;//habilita interrupção de perifericos do pic GIE = 1; //GIE: Global Interrupt Enable bit ADCON0 = 0X00;//desabilita modulo ADC ADCON1 = 0X07;//desliga portas analogicas OPTION_REG = 0X0F;//habilita WDT e configura ele pra 1:128 if((STATUS & 0X10) > 0)//verifica se watchdog já resetou alguma vez { imprime_RS232("Programa watchdog iniciado \n\r");//nunca resetou } else { imprime_RS232("houve um estouro de watchdog \n\r");//já resetou } for(;;) { //faz nada! //para não deixar o watchdog estourar é so colocar a linha abaixo //no local que se deseja monitorar // CLRWDT();//limpa WDT } }
A simulação:
Nenhum comentário :
Postar um comentário
olá,digite aqui seu comentário!