Vai al contenuto
PLC Forum


Divisore Di Frequenza


MrCamarium

Messaggi consigliati

Mi sto inoltrando nel mondo del pic ma di linguaggio ne capisco poco, ho il programmatore e un pic12f675 ho scaricato e installato mikroC ho smanettato un po e ho capito come funziona. adesso vorrei passare nel realizzare un mio progetto un divisore di frequenza vorrei che la frequenza sul piedino 5 potesse uscire 1000 volte divisa dal piedino 2 fino adesso ho fatto solo questo:


void main() {

CMCON= 7; // Disabilita Comparatore.

ADCON0= 0; // Disabilita convertitore A/D

ANSEL= 0b00000000; //Tutte le porte in digitale

TRISIO= 0b00000100; //Tutti i pin in OUT tranne per il 5

//Impostazione del registro OPTION

OPTION_REG= 0b11111111;

//bit 0 -> Prescaler Rate Select bit 1

//bit 1 -> Prescaler Rate Select bit 1

//bit 2 -> Prescaler Rate Select bit 1 (1:256)

//bit 3 -> Prescaler assegnato GP2/T0CKI pin

//bit 4 -> Incrementa il alto al più basso transizione sulla GP2/T0CKI pin

//bit 5 -> Clock Transizione sulla GP2/T0CKI pin

//bit 6 -> Interrupt sul fronte di salita del pin GP2/INT

//bit 7 -> Resistenze di pull-up Disabilitate

//Impostazione Interrupt

INTCON= 0b10010011;

//bit 0 -> When at least one of the GP5:GP0 pins changed state (must be cleared in software)

//bit 1 -> The GP2/INT external interrupt occurred (must be cleared in software)

//bit 2 -> TMR0 register did not overflow

//bit 3 -> Disables the GPIO port change interrupt

//bit 4 -> Enables the GP2/INT external interrupt

//bit 5 -> Disables the TMR0 interrupt

//bit 6 -> PEIE, Disables all peripheral interrupts

//bit 7 -> GIE, Enables all unmasked interrupts

}

Qualcuno mi ha suggerito di fare cosi:

0 - Imposti GP2 come ingresso e GP5 come uscita (Fatto)

1 - crei un contatore e lo azzeri

2 - verifichi il livello di GP4 e quando cambia stato, sommi 1 al contatore

3 - quando il contatore è a 500, inverti lo stato di GP5

4 - azzeri il contatore

5 - riprendi dal punto 2

Come si fa a creare un contatore?

Link al commento
Condividi su altri siti


Come si fa a creare un contatore?


int cont = 0;  //dichiaro la variabile cont(atore) intero e la azzero

..............................

{

................

	 cont++;   //incremento contatore

	 if cont (>= 500)

		 {

			 cont = 0;

			 RB5 = !=RB5;   //nego RB5

		  }

.................

}

//bit 6 -> Interrupt sul fronte di salita del pin GP2/INT

Se usi l'interrupt sul front di salita il codice lo inserisci così com'è nella sub di servizio all'interrupt. Non hai bisogno di verificare alcun cambiamento di stato.

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

Ho corretto e ho fatto cosi:


int cont= 0;  //dichiaro la variabile cont(atore) intero e la azzero

void main() {

CMCON= 7; // Disabilita Comparatore.

ADCON0= 0; // Disabilita convertitore A/D

ANSEL= 0b00000000; //Tutte le porte in digitale

TRISIO= 0b00000100; //Tutti i pin in OUT tranne per il 5

//Impostazione del registro OPTION

OPTION_REG= 0b11111111;

//bit 0 -> Prescaler Rate Select bit 1

//bit 1 -> Prescaler Rate Select bit 1

//bit 2 -> Prescaler Rate Select bit 1 (1:256)

//bit 3 -> Prescaler assegnato GP2/T0CKI pin

//bit 4 -> Incrementa il alto al più basso transizione sulla GP2/T0CKI pin

//bit 5 -> Clock Transizione sulla GP2/T0CKI pin

//bit 6 -> Interrupt sul fronte di salita del pin GP2/INT

//bit 7 -> Resistenze di pull-up Disabilitate

//Impostazione Interrupt

INTCON= 0b10010011;

//bit 0 -> When at least one of the GP5:GP0 pins changed state (must be cleared in software)

//bit 1 -> The GP2/INT external interrupt occurred (must be cleared in software)

//bit 2 -> TMR0 register did not overflow

//bit 3 -> Disables the GPIO port change interrupt

//bit 4 -> Enables the GP2/INT external interrupt

//bit 5 -> Disables the TMR0 interrupt

//bit 6 -> PEIE, Disables all peripheral interrupts

//bit 7 -> GIE, Enables all unmasked interrupts

cont++;   //incremento contatore

if cont (>= 500) //Conta fino a 500

{

cont= 0; //Azzera il contatore

GP5= !=GP5;   //nego GP5

}

}

Ma mi da questo errore: 28 405 '(' expected, but 'cont' found Divisore Di Frequenza.c 28 315 Invalid expression Divisore Di Frequenza.c 28 406 ')' expected, but '{' found Divisore Di Frequenza.c La riga 28 sarebbe questa:

if cont (>= 500) //Conta fino a 500

come compilatore sto usando mikroC Pro, ho provato a eliminare le parentisi ma mi da lo stesso errore.

Link al commento
Condividi su altri siti

if cont (>= 500) //Conta fino a 500

Sorge spontanea una domanda: ma tu il "C" lo conosci, almeno nei suoi rudumenti fondamentali?

Io ho fatto un'errore di battitura e d ho scritto:


if cont (>= 500) //Conta fino a 500 in luogo di

if (cont >= 500) //Conta fino a 500

perbacco però alla segnalazione di errore del compilatore questo errore è di evidenza solare!

Poi dove hai dichiarato al variabile "cont"? Io ti ho messo la dichiarazione nel primo statemet!

Se non conosci almeno decentemente il "C", comicia con il fare esercizietti molto più semplici come leggere un ingresso scrivere un'uscita, fare un dei semplici test, facendo programmini di poche righe, magari seguendo un testo sacro come il Ritchie & Kernigam

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

scusa hai ragione ma di solito io faccio delphi che si programma ad oggetti e per me è più facile. adesso sto cominciando il c ma solo per i pic.


void main() {

int cont= 0;  //dichiaro la variabile cont(atore) intero e la azzero

CMCON= 7; // Disabilita Comparatore.

ADCON0= 0; // Disabilita convertitore A/D

ANSEL= 0b00000000; //Tutte le porte in digitale

TRISIO= 0b00000100; //Tutti i pin in OUT tranne per il 5

//Impostazione del registro OPTION

OPTION_REG= 0b11111111;

//bit 0 -> Prescaler Rate Select bit 1

//bit 1 -> Prescaler Rate Select bit 1

//bit 2 -> Prescaler Rate Select bit 1 (1:256)

//bit 3 -> Prescaler assegnato GP2/T0CKI pin

//bit 4 -> Incrementa il alto al più basso transizione sulla GP2/T0CKI pin

//bit 5 -> Clock Transizione sulla GP2/T0CKI pin

//bit 6 -> Interrupt sul fronte di salita del pin GP2/INT

//bit 7 -> Resistenze di pull-up Disabilitate

//Impostazione Interrupt

INTCON= 0b10010011;

//bit 0 -> When at least one of the GP5:GP0 pins changed state (must be cleared in software)

//bit 1 -> The GP2/INT external interrupt occurred (must be cleared in software)

//bit 2 -> TMR0 register did not overflow

//bit 3 -> Disables the GPIO port change interrupt

//bit 4 -> Enables the GP2/INT external interrupt

//bit 5 -> Disables the TMR0 interrupt

//bit 6 -> PEIE, Disables all peripheral interrupts

//bit 7 -> GIE, Enables all unmasked interrupts

cont++;   //incremento contatore

if (cont >= 500) //Conta fino a 500

{

cont= 0; //Azzera il contatore

GP5= !=GP5;   //nego GP5

}

}

mi da questo errore: 31 315 Invalid expression Divisore Di Frequenza.c 31 318 Assigning to non-lvalue 'GP5' Divisore Di Frequenza.c la riga 31 è:

GP5= !=GP5;   //nego GP5

per caso la devo dichiarare?

Link al commento
Condividi su altri siti

Io ti ho fornito il codice in un compilatore che non è microC, in microC l'operatore not ha una scrittura differente.

Invece di chiedere la forum faresti molto prima e molto meglio a leggerti il manuale.

Se poi consideriamo che stai chedendo le stesse cose in più forum viene anche la voglia di.............lasciamo perdere. :senzasperanza:

Link al commento
Condividi su altri siti

hai ragione ho sbagliato il fatto è che non molti rispondono alle mie domande come te, in molti forum mi hanno mai risposto con inserimenti multipli speravo che qualcuno mi rispondesse, tu sei molto professionale e ti ringrazio.


void main() {

int cont= 0;  //dichiaro la variabile cont(atore) intero e la azzero

CMCON= 7; // Disabilita Comparatore.

ADCON0= 0; // Disabilita convertitore A/D

ANSEL= 0b00000000; //Tutte le porte in digitale

TRISIO= 0b00000100; //Tutti i pin in OUT tranne per il GP2

#define	    GP5	    GP5 // invece di scrivere RD0, scriverò LED, così mi è più facile ricordare

//Impostazione del registro OPTION

OPTION_REG= 0b11111111;

//bit 0 -> Prescaler Rate Select bit 1

//bit 1 -> Prescaler Rate Select bit 1

//bit 2 -> Prescaler Rate Select bit 1 (1:256)

//bit 3 -> Prescaler assegnato GP2/T0CKI pin

//bit 4 -> Incrementa il alto al più basso transizione sulla GP2/T0CKI pin

//bit 5 -> Clock Transizione sulla GP2/T0CKI pin

//bit 6 -> Interrupt sul fronte di salita del pin GP2/INT

//bit 7 -> Resistenze di pull-up Disabilitate

//Impostazione Interrupt

INTCON= 0b10010011;

//bit 0 -> When at least one of the GP5:GP0 pins changed state (must be cleared in software)

//bit 1 -> The GP2/INT external interrupt occurred (must be cleared in software)

//bit 2 -> TMR0 register did not overflow

//bit 3 -> Disables the GPIO port change interrupt

//bit 4 -> Enables the GP2/INT external interrupt

//bit 5 -> Disables the TMR0 interrupt

//bit 6 -> PEIE, Disables all peripheral interrupts

//bit 7 -> GIE, Enables all unmasked interrupts

cont++;   //incremento contatore

if (cont >= 500) //Conta fino a 500

{

cont= 0; //Azzera il contatore

GP5= 0 - GP5;   //nego GP5

}

}

mi spiegheresti perchè mi da questo errore?: 32 318 Assigning to non-lvalue 'GP5' Divisore Di Frequenza.c sarebbe questa la riga:

GP5= 0 - GP5;   //nego GP5

Link al commento
Condividi su altri siti

Percè GP5 è dichiarato booleano, inoltre l'inversione non si realizza inquesto modo.

ma perchè non tidecidi a studiare il "C" ed il manuale del microC? :wallbash:

Link al commento
Condividi su altri siti


GP5= GP5^1;   //Inverto GP5

quello era un errore di battitura, l'inversione si può fare anche cosi, ma il problema non è questo non capisco come poter risolvere il problema del GP5

Link al commento
Condividi su altri siti


void main() {

#define OUT GP5_bit; // invece di scrivere GP5, scriverò LED, così mi è più facile ricordare

int cont= 0;  //dichiaro la variabile cont(atore) intero e la azzero

CMCON= 7; // Disabilita Comparatore.

ADCON0= 0; // Disabilita convertitore A/D

ANSEL= 0b00000000; //Tutte le porte in digitale

TRISIO= 0b00000100; //Tutti i pin in OUT tranne per il GP2

//Impostazione del registro OPTION

OPTION_REG= 0b11111111;

//bit 0 -> Prescaler Rate Select bit 1

//bit 1 -> Prescaler Rate Select bit 1

//bit 2 -> Prescaler Rate Select bit 1 (1:256)

//bit 3 -> Prescaler assegnato GP2/T0CKI pin

//bit 4 -> Incrementa il alto al più basso transizione sulla GP2/T0CKI pin

//bit 5 -> Clock Transizione sulla GP2/T0CKI pin

//bit 6 -> Interrupt sul fronte di salita del pin GP2/INT

//bit 7 -> Resistenze di pull-up Disabilitate

//Impostazione Interrupt

INTCON= 0b10010011;

//bit 0 -> When at least one of the GP5:GP0 pins changed state (must be cleared in software)

//bit 1 -> The GP2/INT external interrupt occurred (must be cleared in software)

//bit 2 -> TMR0 register did not overflow

//bit 3 -> Disables the GPIO port change interrupt

//bit 4 -> Enables the GP2/INT external interrupt

//bit 5 -> Disables the TMR0 interrupt

//bit 6 -> PEIE, Disables all peripheral interrupts

//bit 7 -> GIE, Enables all unmasked interrupts

cont++;   //incremento contatore

if (cont >= 500) //Conta fino a 500

{

cont= 0; //Azzera il contatore

OUT= !OUT;   //Inverto GP5

}

}

adesso va ma mi dice che:

32 315 Invalid expression Divisore Di Frequenza.c

OUT= !OUT; //Inverto GP5

Link al commento
Condividi su altri siti

Finalmente ho risolto:


void main() {

int cont= 0;  //dichiaro la variabile cont(atore) intero e la azzero

CMCON= 7; // Disabilita Comparatore.

ADCON0= 0; // Disabilita convertitore A/D

ANSEL= 0b00000000; //Tutte le porte in digitale

TRISIO= 0b00000100; //Tutti i pin in OUT tranne per il GP2

//Impostazione del registro OPTION

OPTION_REG= 0b11111111;

//bit 0 -> Prescaler Rate Select bit 1

//bit 1 -> Prescaler Rate Select bit 1

//bit 2 -> Prescaler Rate Select bit 1 (1:256)

//bit 3 -> Prescaler assegnato GP2/T0CKI pin

//bit 4 -> Incrementa il alto al più basso transizione sulla GP2/T0CKI pin

//bit 5 -> Clock Transizione sulla GP2/T0CKI pin

//bit 6 -> Interrupt sul fronte di salita del pin GP2/INT

//bit 7 -> Resistenze di pull-up Disabilitate

//Impostazione Interrupt

INTCON= 0b10010011;

//bit 0 -> When at least one of the GP5:GP0 pins changed state (must be cleared in software)

//bit 1 -> The GP2/INT external interrupt occurred (must be cleared in software)

//bit 2 -> TMR0 register did not overflow

//bit 3 -> Disables the GPIO port change interrupt

//bit 4 -> Enables the GP2/INT external interrupt

//bit 5 -> Disables the TMR0 interrupt

//bit 6 -> PEIE, Disables all peripheral interrupts

//bit 7 -> GIE, Enables all unmasked interrupts

cont++;   //incremento contatore

if (cont >= 500) //Conta fino a 500

{

cont= 0; //Azzera il contatore

TRISIO= !GP5;   //Inverto GP5

}

}

Ho capito dove sbagliavo adesso lo compila bene. Passo alla simulazione, in pratica l'erroe non era nel linguaggio ma nella sintesi perchè con il compilatore HitecC dopo aver definito la porta:

#define	    led	    GP5 // invece di scrivere GP5, scriverò LED, così mi è più facile ricordare

se srvivo:

led = !led

me lo compila invece il compilatore mikroC non lo fa. Ragionadoci un po su su un codice di esempio che usciva in miKroC ho capito come dovevo procedere.

Ti ringrazio mi sono divertito a scogliere quello che per me era un nodo. Buon lavoro!

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...