Home
Accesso / Registrazione
 di 

istruzione RESET

2 risposte [Ultimo post]
ritratto di OPGUIDO
Offline
Titolo: User++
Utente++
Ultima visita:
1 anno 35 settimane fa
Utente dal: 11/06/2011
Messaggi: 58

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

ritratto di Emanuele
Offline
Titolo: Moderator
Moderatore
Ultima visita:
1 ora 14 min fa
Utente dal: 28/07/2007
Messaggi: 1019
Utente PREMIUM
RESET in C

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

ritratto di OPGUIDO
Offline
Titolo: User++
Utente++
Ultima visita:
1 anno 35 settimane fa
Utente dal: 11/06/2011
Messaggi: 58
Ciao, mi spiegate come si

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

 

 

Login   
 Twitter Facebook LinkedIn Youtube Google RSS

Chi è online

Ci sono attualmente 5 utenti e 61 visitatori collegati.

Ultimi Commenti