Home Forum MICROCONTROLLORI istruzione RESET

Questo argomento contiene 2 risposte, ha 2 partecipanti, ed è stato aggiornato da  OPGUIDO 2 anni, 9 mesi fa.

Stai vedendo 3 articoli - dal 1 a 3 (di 3 totali)
  • Autore
    Articoli
  • #58716

    OPGUIDO
    Membro

    Ciao, ho notato che dopo che ho tralasciato il pulsante BT0 (ne voglio mettere uno per ogni D) la frequenza sui PORT RB continua a uscire se li premo, ma se schiaccio il pulsante di reset cessa (purtroppo se continuo a premere velocemente i pulsanti RB ricomincia a suonare), vorrei mettere l’istruzione RESET al ELSE BT0 per , come si scrive inC?
    Grazie
    Codice:

    #include

    #include #include
    #include

    //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 D1 400
    #define BT2 PORTAbits.RA2
    #define D2 700
    #define BT3 PORTAbits.RA3
    #define D3 1500
    #define BT4 PORTAbits.RA4
    #define D4 3000
    #define BT5 PORTAbits.RA5
    #define D5 4000

    #pragma config FOSC = HS
    #pragma config WDT = OFF
    #pragma config LVP = OFF
    #pragma config PBADEN = OFF
    #pragma config CCP2MX = ON

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

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

    void main (void) {
    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

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

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

    unsigned char period; //Periodo del segnale pwm

    //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

    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 (PORTBbits.RB0 == 0) { //Controllo la pressione di RB
    for (i=0; i }
    period = 237; // (232 prova) Imposto una frequenza di 262Hz DO centrale

    if (PORTBbits.RB0 == 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
    }
    }

    if (PORTBbits.RB1 == 0) { //Controllo la pressione di RB
    for (i=0; i }
    period = 224; // (222) Imposto una frequenza di 277Hz DO #

    if (PORTBbits.RB1 == 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
    }
    }

    if (PORTBbits.RB2 == 0) { //Controllo la pressione di RB
    for (i=0; i }
    period = 212; // Imposto una frequenza di 294Hz RE centrale

    if (PORTBbits.RB2 == 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
    }

    }

    if (PORTBbits.RB3 == 0) { //Controllo la pressione di RB
    for (i=0; i }
    period = 201; // Imposto una frequenza di 311Hz RE#

    if (PORTBbits.RB3 == 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;
    //ClosePWM2 () ; // Chiudo il modulo pwm
    }
    }// if del BT0

    } //While
    }//main

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

    #71241

    Emanuele
    Keymaster

    Non ho ben capito la domanda…. comunque in C puoi inserire tranquillamente istruzioni assembler con _asm _endasm (quest’ultime dipendono dal compilatore)

    #71252

    OPGUIDO
    Membro

    Ciao, mi spiegate come si scrive il codice in C per resettare (istruzione di RESET, presente nel datascheet del pic 18f4550) il pic in automatico?
    Grazie

Stai vedendo 3 articoli - dal 1 a 3 (di 3 totali)

Devi aver eseguito l’accesso per poter rispondere a questa discussione.