|
|
|
||||||||
| Arcade | Registrazione | Blogs | Regolamento | Feedback | FAQ | Lista Utenti | Calendario | Segna come Letti |
| Ultimi 5 blog pubblicati su PcTuner Blog | ||||||
|
||||||
![]() |
|
|
Strumenti Discussione | Modalità Visualizzazione |
|
|
#1 |
|
Registered User
|
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
|
|
|
|
|
|
#2 |
|
Registered User
|
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) |
|
|
|
|
|
#3 |
|
Registered User
|
in pratica sto costruendo un multyivibratore che ogni 10 cicli deve aumentare la frequenza, come posso procedere?
__________________ |
|
|
|
|
|
#4 |
|
Registered User
|
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
allora il valore di delayMs vorrei incrementarlo dopo circa 2 secondi che secindo me dopo un ciclo di 100 dovrebbe essere sufficiente. come procedo? |
|
|
|
|
|
#5 | |
|
Registered User
|
Quote:
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) |
|
|
|
|
|
|
#6 |
|
Credendo Vites
|
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.
|
|
|
|
|
|
#7 | |
|
Registered User
|
Quote:
|
|
|
|
|
|
|
#8 |
|
Registered User
|
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) |
|
|
|
|
|
#9 | |
|
Registered User
|
Quote:
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...
|
|
|
|
|
![]() |
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 | |
|
|