As vezes desejamos pular de um ponto a outro no programa dai usa-se um comando(herança do assembly) "goto" para isso, aqui vou demonstrar como resetar o chip com esse pequeno programa:
/*
* Exemplo de reset do microcontrolador usando o comando "goto"
*
* Compilador : MPlabXC8
* Microcontrolador: 16F648A
* Autor: aguivone
* Versão: 1
* Data : 13 de setembro de 2013
*/
#include <stdio.h>
#include <stdlib.h>
#define _XTAL_FREQ 4000000 //vou usar o oscilador interno
#include <xc.h>
/////////////////////////////////////////////////////////configuraçôes//////////////////////////////////////////////////
#pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTOSC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
//#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
#pragma config BOREN = OFF // Brown-out Detect Enable bit (BOD disabled)
#pragma config LVP = OFF // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#define reseta_chip PORTBbits.RB0
#define led PORTBbits.RB2
void delay_ms(long valor)
{
while(valor>0)
{//aproximadamente 1ms
long useg=0;
while(useg>999)
{
useg++;//como esta usando o oscilado interno então cada ciclo leva 1uS
}
valor--;
}
}
void main(void)
{
INICIO:
TRISB = 0X01;//configura portB como saida(exceto pino B0)
TRISA = 0X00;//configura portA como saida
PORTB = 0; // limpar as portas que estão configuradas como saidas
CMCON = 7;//desliga modulo comparador
led =1;//liga led
delay_ms(1000);//espera 1 segundo
led =0;//desliga led
delay_ms(1000);//espera 1 segundo
for(;;)
{
if(reseta_chip == 0)
{
goto INICIO;
}
}//laço infinito
}
veja que se o botão estiver pressionado o comando não é executado, mas se o botão estiver liberado ele fica reiniciando o programa o tempo todo fazendo o LED piscar.
Nenhum comentário :
Postar um comentário
olá,digite aqui seu comentário!