Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Comando RESET nei PIC18f4550

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Comando RESET nei PIC18f4550

Messaggioda Foto Utenteguidonetto » 18 mar 2012, 14:29

Ciao, mi serve che al premere dei pulsanti BT0 e BT1 il PIC si resetti in automatico, mi spiegate come scrivere il codice in C del comando RESET?
Inoltre con l'interrupt posso usare solo da RB4 a RB7, ho bisogno di usare anche gli ingressi su PORTD E PORTC, come posso modificare il codice per mantenere l'interrupt e far vedere più ingrssi?
Grazie.

Codice: Seleziona tutto
#include <p18f4550.h>

#include <PWM.h>
#include <timers.h>
#include <portb.h>

//Variabili usate per definire i pulsanti e la freq. dei for dei pulsanti
#define BT0 PORTAbits.RA0
#define D0 300
#define BT1 PORTAbits.RA1
#define D5 4000

#pragma config FOSC = HS      //OSC = HS Impostato per lavorare ad alta frequenza
#pragma config WDT = OFF      //WDT = OFF Disabilitato il Watchdog Timer
#pragma config LVP = OFF      //LVT = OFF Disabilitato programmazione LVT
#pragma config PBADEN = OFF   //PBADEN = OFF Disabilitato gli ingrassi analogici
#pragma config CCP2MX = ON    //CCP2MX = ON il modulo CCP è posto su RC1


void pulsante0 (void); // Dichiaro la funzione del BT0

void pulsante1 (void); // Dichiaro la funzione del BT1

void High_Int_Event (void); //Dichiaro l'istruzione Interrupt

void set_duty_cycle (int duty_cycle); //void set_duty_cycle (int duty_cycle);

int sine[] = {250,299,346,389,427,458,481,495,500,495,481,458,427,389,346,299,250,201,154,111,73,42,19,5,0,5,19,42,73,111,154,201};
// Repeat the sample for x time
// sampling frequency must be changed to keep analog signal frequency costnat
const unsigned char REPEATING_FACTOR = 1;//3 numero ripetizioni standard

int i; //Variabile usata per creare un conteggio fittizio di pausa

    unsigned char period;  //Periodo del segnale PWM

    static unsigned char sample = 0;
    static unsigned char repeat = 0;

void main (void) {

   //Imposto PORTA tutti ingrrssi

   LATA = 0x00;
   TRISA = 0xFF;
        ADCON1 = 0x0F; // Imposto PORTA come I/O

   //Imposto PORTB tutti ingrrssi

   LATB = 0x00;
   TRISB = 0xFF;

   //Imposto PORTC tutti ingressi ad RC1 come uscita

   LATC = 0x00;
   TRISC = 0b11111101;

   //Imposto PORTD tutte uscite

   LATD = 0x00;
   TRISD = 0x00;

   //Imposto PORTE tutti ingrrssi

   LATE = 0x00;
   TRISE = 0xFF;

EnablePullups ();  //Abilito resistori di pullups

OpenTimer2 (TIMER_INT_OFF & T2_PS_1_16 & T2_POST_1_16 ); //Apro il timer2 per il PWM

while (1) { //Ciclo infinito (Va messo nel main davanti alle funzioni, il programma gira).


        INTCONbits.RBIE = 1; // Abilito le interruzioni su PORTB
       
   RCONbits.IPEN = 0; // Abilito modalità standard

   INTCONbits.GIE = 1; // Abilito interrupt globale

   INTCONbits.PEIE = 1 ; //Abilito Interrupt per periferiche       
 
  }//While
        }//main

#pragma code high_vector = 0x08

void high_interrupt (void) {
   // go to the interrupt handler
   _asm GOTO High_Int_Event _endasm
}

#pragma code

#pragma interrupt High_Int_Event

void High_Int_Event (void){

   pulsante0 (); //Richiama nel main la funzione pulsante0

   pulsante1 (); //Richiama nel main la funzione pulsante1

   }//Interrupt

void pulsante0 (void) { //Funzione del BT0

if (repeat == REPEATING_FACTOR) {
         repeat = 0;
         sample++;
                }
         if (sample > 31) {
            sample = 0;
         }

if (BT0 == 0){  //Controllo la pressione per assegnare il valore di D0

if (( INTCONbits.RBIF == 1) && (PORTBbits.RB4 == 0))    {  //Controllo la pressione di RB0 + Interrupt

   for (i=0; i<D0; i++) {  //Pausa filtraggio spike (10000 conteggio standard)
     }
        period = 237; // (232 prova) Imposto una frequenza di 262Hz DO centrale

if (PORTBbits.RB4 == 0)    {  //Controllo la pressione di RB

      OpenPWM2(period) ; //Apro il modulo PWM
      set_duty_cycle (sine[sample]);

      repeat++;

   LATCbits.LATC1 =  0x01 ; //Accendo il Led 1
     }
   else {

   LATCbits.LATC1 = 0x00 ;

   ClosePWM2 () ; //  Chiudo il modulo PWM
   }
}
else{
    BT0 = 0;
    }

INTCONbits.RBIF = 0; //Resetto il flag

}// if del BT0

}//Pulsante0

void pulsante1 (void) { //Funzione del BT1

if (repeat == REPEATING_FACTOR) {
         repeat = 0;
         sample++;
                }
         if (sample > 31) {
            sample = 0;
         }

if (BT1 == 0){  //Controllo la pressione per assegnare il valore di D0

if ((INTCONbits.RBIF == 1) && (PORTBbits.RB4 == 0))     {  //Controllo la pressione di RB0 + Interrupt

   for (i=0; i<D5; i++) {  //Pausa filtraggio spike (10000 conteggio standard)
     }
        period = 237; // (232 prova) Imposto una frequenza di 262Hz DO centrale

if (PORTBbits.RB4 == 0)    {  //Controllo la pressione di RB

      OpenPWM2(period) ; //Apro il modulo PWM
      set_duty_cycle (sine[sample]);

      repeat++;

   LATCbits.LATC1 =  0x01 ; //Accendo il Led 1
     }
   else {

   LATCbits.LATC1 = 0x00 ;

   ClosePWM2 () ; //  Chiudo il modulo PWM
   }
}
else{
    BT1 = 0;
    }

INTCONbits.RBIF = 0; //Resetto il flag

}// if del BT1

}//Pulsante1

void set_duty_cycle (int duty_cycle) {

   CCPR2L = (unsigned char) (duty_cycle >> 2);

   if (duty_cycle & 0x0001)
      CCP2CONbits.DC2B0 = 0x0001;
   else
      CCP2CONbits.DC2B0 = 0x0000;

   if (duty_cycle & 0x0002)
      CCP2CONbits.DC2B1 = 0x0001;
   else
      CCP2CONbits.DC2B1 = 0x0000;
Avatar utente
Foto Utenteguidonetto
13 1 5
Frequentatore
Frequentatore
 
Messaggi: 124
Iscritto il: 8 mag 2011, 21:08

0
voti

[2] Re: Comando RESET nei PIC18f4550

Messaggioda Foto Utentesimo85 » 18 mar 2012, 14:39

Se quando premi lo switch hai uno 0 logico, colleghi una OR con gli ingressi dei pulsanti ai suoi ingressi e l'output sul MR, così non devi scrivere il codice C. :mrgreen:
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[3] Re: Comando RESET nei PIC18f4550

Messaggioda Foto Utenteguidonetto » 18 mar 2012, 21:39

Ciao, non ti seguo, ho bisogno che il Reset avvenga dopo che ha eseguito il codice per es. all'interno di BT0, io premo il pulsante BT1 e si resetta il PIC, per poi eseguire il codice all'interno di BT1 e viceversa.
Avatar utente
Foto Utenteguidonetto
13 1 5
Frequentatore
Frequentatore
 
Messaggi: 124
Iscritto il: 8 mag 2011, 21:08

0
voti

[4] Re: Comando RESET nei PIC18f4550

Messaggioda Foto Utentesimo85 » 18 mar 2012, 21:47

La mia prima risposta era più che altro scherzosa. Penso che tu possa usare il WDT, però dovresti fare un polling o in alternativa settare il Program Counter a 0x0000, si potrebbe provare ma è qualcosa che per il momento non ho ancora fatto.. Forse Foto UtenteTardoFreak e Foto UtentePaolino conoscono una soluzione migliore.
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[5] Re: Comando RESET nei PIC18f4550

Messaggioda Foto UtenteRobert8 » 19 mar 2012, 0:54

Se non c'è una specifica istruzione C per il reset puoi sempre invocare il RESET assembly.
Avatar utente
Foto UtenteRobert8
3.449 2 8 13
Master EY
Master EY
 
Messaggi: 373
Iscritto il: 15 giu 2011, 16:30

0
voti

[6] Re: Comando RESET nei PIC18f4550

Messaggioda Foto UtentePaolino » 19 mar 2012, 9:05

Esatto, con una chiamatata RESET, il PIC si riavvia.

Ciao.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[7] Re: Comando RESET nei PIC18f4550

Messaggioda Foto Utenteguidonetto » 19 mar 2012, 21:22

Ciao, purtroppo non conosco l'assembler, come si scive tale comando e come lo faccio a far riconoscere al C?
Grazie
Avatar utente
Foto Utenteguidonetto
13 1 5
Frequentatore
Frequentatore
 
Messaggi: 124
Iscritto il: 8 mag 2011, 21:08

0
voti

[8] Re: Comando RESET nei PIC18f4550

Messaggioda Foto UtentePaolino » 19 mar 2012, 22:06

Prova con:
Codice: Seleziona tutto
void MyReset(void)
{
   _asm RESET _endasm
}


Ciao.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti