Vai Indietro   PcTuner Forum > Sezione Hardware > Programmazione PIC
Arcade Registrazione Blogs Regolamento Feedback FAQ Lista Utenti Calendario Segna come Letti

Ultimi 5 blog pubblicati su PcTuner Blog
Data Titolo

Rispondi
 
Strumenti Discussione Modalità Visualizzazione
Vecchio 09-09-2012, 18.35.33   #1
Registered User
 
L'avatar di  mrcamarium
 

Iscritto da: 29-11-2011
Messaggi: 18
Feedback: (0)
Incrementare Frequenza (PIC in C)

Codice:
#define _XTAL_FREQ 4000000
#include <pic.h>
#include <delay.c>

// configurazione
__CONFIG (FOSC_INTOSCIO & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_OFF & IESO_OFF & FCMEN_OFF);

// Connessioni
#define Led1		GP2		// GP2 -> SIN
#define Led2		GP1		// GP1 -> LAT
#define Led3		GP0		// GP0 -> CLK
#define Led4		GP3		// GP0 -> CLK
#define OUT 		GP4		// GP0 -> CLK

// funzioni
void main(void)
        {
		while(!HTS); // Stabilizza oscilatore interno
		CMCON=7; // Disabilita Comparatore.
		ADCON0 = 0; // Disabilita convertitore A/D
		TRISIO = 0b00000000; // Tutti i pin in out
		{
// Programma
		int indice = 0;
        while(1) (indice <10)
        {
       LED=1;
       indice++;
       DelayMs(0,0625); // 16-27KHz
	   LED=0;
        }
		}
		} // \main
con questo codice sto provando a realizzare un scaccia topo, volevo fare in modo che dopo 10 cicli il valore di delay venisse incrementato come posso fare?
__________________
mrcamarium Non in Linea   Rispondi Citando
Vecchio 11-09-2012, 10.39.36   #2
Registered User
 
L'avatar di  Camillo
 

Iscritto da: 31-01-2006
Locazione: Genova
Messaggi: 1,471
Feedback: (0)
Alla function invece di passare una costante passi una variabile che verrà modificata dopo 10 cicli.
Ci sono anche delle graffe di troppo e non capisco il significato di questo:
Codice:
        while(1) (indice <10)
        {
__________________
Camillo

Internet ti fa vedere tutto ma non ti fa toccare niente. (Camillo Ferrari)
Camillo Non in Linea   Rispondi Citando
Vecchio 12-09-2012, 11.37.18   #3
Registered User
 
L'avatar di  mrcamarium
 

Iscritto da: 29-11-2011
Messaggi: 18
Feedback: (0)
Quote:
Originariamente inviato da Camillo Visualizza Messaggio
Alla function invece di passare una costante passi una variabile che verrà modificata dopo 10 cicli.
Ci sono anche delle graffe di troppo e non capisco il significato di questo:
Codice:
        while(1) (indice <10)
        {
in pratica sto costruendo un multyivibratore che ogni 10 cicli deve aumentare la frequenza, come posso procedere?
__________________
mrcamarium Non in Linea   Rispondi Citando
Vecchio 12-09-2012, 17.36.35   #4
Registered User
 
L'avatar di  mrcamarium
 

Iscritto da: 29-11-2011
Messaggi: 18
Feedback: (0)
Codice:
#define _XTAL_FREQ 4000000
#include <pic.h>
#include <delay.c>

// configurazione
__CONFIG (FOSC_INTOSCIO & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_OFF & IESO_OFF & FCMEN_OFF);

// Connessioni
#define Led1		GP2		// GP2 -> SIN
#define Led2		GP1		// GP1 -> LAT
#define Led3		GP0		// GP0 -> CLK
#define Led4		GP3		// GP0 -> CLK
#define OUT 		GP4		// GP0 -> CLK

// funzioni
void main(void)
        {
		while(!HTS); // Stabilizza oscilatore interno
		CMCON=7; // Disabilita Comparatore.
		ADCON0 = 0; // Disabilita convertitore A/D
		TRISIO = 0b00000000; // Tutti i pin in out
		while(1) // eseguo un ciclo infinito
       {
      OUT=1;
      DelayMs(0,0625); // 16-27KHz
	  OUT=0;
      }// Fine ciclo continuo
 
      } // Fine main
ricominciamo da capo posto di nuovo il codice.
allora il valore di delayMs vorrei incrementarlo dopo circa 2 secondi che secindo me dopo un ciclo di 100 dovrebbe essere sufficiente. come procedo?
__________________
mrcamarium Non in Linea   Rispondi Citando
Vecchio 13-09-2012, 10.45.34   #5
Registered User
 
L'avatar di  Camillo
 

Iscritto da: 31-01-2006
Locazione: Genova
Messaggi: 1,471
Feedback: (0)
Quote:
Originariamente inviato da mrcamarium Visualizza Messaggio
Codice:
#define _XTAL_FREQ 4000000
#include <pic.h>
#include <delay.c>

// configurazione
__CONFIG (FOSC_INTOSCIO & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_OFF & IESO_OFF & FCMEN_OFF);

// Connessioni
#define Led1		GP2		// GP2 -> SIN
#define Led2		GP1		// GP1 -> LAT
#define Led3		GP0		// GP0 -> CLK
#define Led4		GP3		// GP0 -> CLK
#define OUT 		GP4		// GP0 -> CLK

// funzioni
void main(void)
        {
		while(!HTS); // Stabilizza oscilatore interno
		CMCON=7; // Disabilita Comparatore.
		ADCON0 = 0; // Disabilita convertitore A/D
		TRISIO = 0b00000000; // Tutti i pin in out
		while(1) // eseguo un ciclo infinito
       {
      OUT=1;
      DelayMs(0,0625); // 16-27KHz
	  OUT=0;
      }// Fine ciclo continuo
 
      } // Fine main
ricominciamo da capo posto di nuovo il codice.
allora il valore di delayMs vorrei incrementarlo dopo circa 2 secondi che secindo me dopo un ciclo di 100 dovrebbe essere sufficiente. come procedo?
E' nota la mia avversione per le routine di delay questa DelayMs poi non la capisco proprio. In C il passaggio di parametri avviene con il separatore ',' (virgola) per cui tu passi 0 e 0625 che cosa significa?
Sorvolo sulla cosa visto che non sai fare una banalità come un incremento ogni tot cicli è impensabile che tu riesca a gestire un system tick.

Io non so come funziona uno scacciatopo ma la cosa ha poca importanza.
Descrivi cosa vuoi ottenere.
Tieni conto che io non conosco il C da te usato e tanto meno la sua libreria, per me DelayMs è un'emerito sconosciuto.
__________________
Camillo

Internet ti fa vedere tutto ma non ti fa toccare niente. (Camillo Ferrari)
Camillo Non in Linea   Rispondi Citando
Vecchio 13-09-2012, 12.13.20   #6
Credendo Vites
 
L'avatar di  SoldatoSemplice
 

Iscritto da: 17-11-2005
Locazione: Roma
Messaggi: 1,535
Feedback: (0)
Io ho idea che il nostro amico volesse passare 0,0625 mS di ritardo, nel senso che voleva usare la routine DelayMs per far passare 62 uS, in realtà però questa routine accetta come parametri solo costanti intere, e mi stupisco che non ti abbia dato errore.

Se vuoi far passare 62 uS di ritardo devi usare immagino la DelayUs (sempre se esiste( e passargli come parametro come costante intera il tuo 62.

Resta comunque il fatto che se hai bisogno di risoluzioni cosi fini, dubito che potrai ottenerle in maniera precisa attraverso questi tipi di routine annidate.

Ho idea che dovrai impararti ad usare i timers e gestire il system tick appunto.

Ciao
__________________
Il tempo è il miglior maestro, purtroppo uccide tutti i suoi allievi.
SoldatoSemplice Non in Linea   Rispondi Citando
Vecchio 13-09-2012, 15.17.33   #7
Registered User
 
L'avatar di  mrcamarium
 

Iscritto da: 29-11-2011
Messaggi: 18
Feedback: (0)
Quote:
Originariamente inviato da Camillo Visualizza Messaggio
E' nota la mia avversione per le routine di delay questa DelayMs poi non la capisco proprio. In C il passaggio di parametri avviene con il separatore ',' (virgola) per cui tu passi 0 e 0625 che cosa significa?
Sorvolo sulla cosa visto che non sai fare una banalità come un incremento ogni tot cicli è impensabile che tu riesca a gestire un system tick.

Io non so come funziona uno scacciatopo ma la cosa ha poca importanza.
Descrivi cosa vuoi ottenere.
Tieni conto che io non conosco il C da te usato e tanto meno la sua libreria, per me DelayMs è un'emerito sconosciuto.
si trova nella libreria delay.c
__________________
mrcamarium Non in Linea   Rispondi Citando
Vecchio 14-09-2012, 10.15.44   #8
Registered User
 
L'avatar di  Camillo
 

Iscritto da: 31-01-2006
Locazione: Genova
Messaggi: 1,471
Feedback: (0)
Quote:
Originariamente inviato da mrcamarium Visualizza Messaggio
si trova nella libreria delay.c
Me l'immagino ma ogni implementazione di linguaggio fa una sua libreria con delle sue caratteristiche.
Io uso solo il C18, ma non ne uso le librerie, per i PIC più piccoli uso esclusivamente assembly.
Il C classico (vedi K&R) non prevede nessuna libreria anche se poi vi sono delle function standard (la atoi() ne è un'esempio.
Per cui se vuoi farmi capire qualcosa scrivimi il suo prototipo e la sua descrizione.
__________________
Camillo

Internet ti fa vedere tutto ma non ti fa toccare niente. (Camillo Ferrari)
Camillo Non in Linea   Rispondi Citando
Vecchio 14-09-2012, 23.25.39   #9
Registered User
 
L'avatar di  mrcamarium
 

Iscritto da: 29-11-2011
Messaggi: 18
Feedback: (0)
Quote:
Originariamente inviato da Camillo Visualizza Messaggio
Me l'immagino ma ogni implementazione di linguaggio fa una sua libreria con delle sue caratteristiche.
Io uso solo il C18, ma non ne uso le librerie, per i PIC più piccoli uso esclusivamente assembly.
Il C classico (vedi K&R) non prevede nessuna libreria anche se poi vi sono delle function standard (la atoi() ne è un'esempio.
Per cui se vuoi farmi capire qualcosa scrivimi il suo prototipo e la sua descrizione.
ecco il codice proposto per la mia neccesità
Codice:
Leggermente ottimizzato:

void main(void)
{
        unsigned short count = 0;
        unsigned short val = 32;
        while(!HTS); // Stabilizza oscilatore interno
        CMCON=0x07; // Disabilita Comparatore.
        ADCON0 = 0x00; // Disabilita convertitore A/D
        TRISIO = 0b00000000; // Tutti i pin in out
        while(1) // eseguo un ciclo infinito
        {
                while(count < 200)
                {
                        OUT^=1;
                        DelayUs(val); // 16-27KHz
                        count++;
                }
                count = 0;
                // da 16KHz arriva a 27KHz e poi torna a 16KHz
                val = (val - 1 >= 18) ? (val - 1) : 32;
        }// Fine ciclo continuo
} // Fine main


Attenzione!!!

In HI-TECH C versione free, il file "delay.c" non è ottimizzato, la routine DelayUs accetta valori come unsigned char ovvero da 0 a 255, quindi se si vogliono ritardi maggiori bisogna concatenare manualmente più istruzioni, impensable invece utilizzare un float come parametro, purtroppo _delay(us) accetta solo costanti e nel tuo caso non va bene...

Messaggio modificato da GiRock il Ieri, 17:33
Gio...
__________________
mrcamarium Non in Linea   Rispondi Citando
Rispondi Per le vostre immagini su questo forum potete usare PcTunerUp!
Iscriviti gratuitamente alla nostra newsletter.


Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 visitatori)
 
Strumenti Discussione
Modalità Visualizzazione

Regole di scrittura
non Puoi inserire messaggi
non Puoi rispondere ai messaggi
non Puoi inviare allegati
non Puoi modificare i tuoi messaggi

codice vB è Attivo
Smilies è Attivo
[IMG] il codice è Attivo
Il codice HTML è Disattivato
Trackbacks are Disattivato
Pingbacks are Disattivato
Refbacks are Disattivato
Vai al Forum


Tutti gli Orari sono GMT +2. Attualmente sono le 10.37.23.


Powered by vBulletin Versione 3.6.12
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0
Copyright © 2010 - Master New Media S.r.l. a socio unico - P.I. 02947530784. Tutti i diritti di proprietà letteraria e artistica sono riservati- Privacy
www.pctuner.net è testata telematica registrata presso il Tribunale di Torino, n. 39 del 07.05.2008, Editore Master New Media S.r.l.