Eccomi. Ho scritto qualcosa. TardoFreak se hai un minuto ti andrebbe dare un'occhiata al codice per vedere se sto procedendo correttamente? Ho utilizzato un quarzo da 8Mhz con prescaler da 8 per sfruttare l'esempio che mi hai dato.
// Inizializzazione LCD su cui indicare i giri/min
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RC7_bit;
sbit LCD_D7 at RC6_bit;
sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISC7_bit;
sbit LCD_D7_Direction at TRISC6_bit;
int periodo=0;
int ricevuto=0;
int risultato=0;
int cont=0;
char testo[6];
void interrupt()
{
ricevuto=1;
periodo=TMR1H<<8+TMR1L;
TMR1H=0;
TMR1L=0;
INTCON.INTF=0;
}
void main()
{
PORTB = 0; // Initialize PORTB
PORTC = 0;
TRISB = 1; // PORTB is output
OPTION_REG=0xC0;
INTCON=0x90;
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
Delay_ms(500);
T1CON=0x31;
TMR1H=0;
TMR1L=0;
/*----------------------------------------------------------------------------*/
while(1)
{
if(ricevuto==1)
{
INTCON.GIE=0;
INTCON.INTE=0;
risultato=60000/periodo;
ricevuto=0;
INTCON.GIE=1;
INTCON.INTE=1;
}
WordToStr(risultato,testo);
Lcd_Out(2,1,testo);
}
}
Maggiore precisione con contagiri PIC
Moderatore:
Paolino
44 messaggi
• Pagina 4 di 5 • 1, 2, 3, 4, 5
0
voti
3 cose:
- Il sorgente lo devi mettere fra i tags [ code ] e [ /code ] (senza spazi fra le parentesi)
- Prima prova il programma poi, se non funziona, ne parliamo
- Oggi sono assai incasinato e di tempo, purtroppo, ne ho poco. Rispondo quando faccio partire le compilazioni
- Il sorgente lo devi mettere fra i tags [ code ] e [ /code ] (senza spazi fra le parentesi)
- Prima prova il programma poi, se non funziona, ne parliamo
- Oggi sono assai incasinato e di tempo, purtroppo, ne ho poco. Rispondo quando faccio partire le compilazioni
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
-

TardoFreak
73,9k 8 12 13 - -EY Legend-

- Messaggi: 15754
- Iscritto il: 16 dic 2009, 11:10
- Località: Torino - 3° pianeta del Sistema Solare
0
voti
Ok! Dopo provo e ti scrivo. Non importa se non mi rispondi subito. Puoi anche farlo tra una settimana. Non mi interessa. Dipende dal tempo che si ha. Io in ogni caso scrivo i risultati che ottengo. Magari c'è un altro che vuole realizzare la medesima cosa.
Edge
Edge
0
voti
Macché! Nulla da fare. Ho provato come sempre a verificare con l'oscilloscopio se effettivamente i triggers arrivano correttamente alla routine di interrupt. Tutto a posto.
E' sbagliata la relazione con cui ricavo gli rpm forse?
E' sbagliata la relazione con cui ricavo gli rpm forse?
0
voti
Inizia a far visualizzare il periodo, vedi se funziona e che indicazioni dà.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
-

TardoFreak
73,9k 8 12 13 - -EY Legend-

- Messaggi: 15754
- Iscritto il: 16 dic 2009, 11:10
- Località: Torino - 3° pianeta del Sistema Solare
0
voti
Nulla da fare. Fatto così ho qualche problema. Credo di aver sbagliato concettualmente il firmware. Forse devo ragionare come se utilizzassi TMR0, ovvero arriva il primo impulso e faccio partire TMR1, poi arriva il secondo fronte ed è qui che devo azzerare Timer1....
0
voti
Il problema è che il timer 1 non s' incrementa. E' di sicuro una fesseria, un particolare che una volta risolto ... insomma non c'e' differenza fra un timer e l' altro, di sicuro manca un passaggio, un' istruzione ma questa sera ho il cervello che si è spento da solo dopo avere risolto un problema che mi assillava da quasi una settimana.
Love to but can' t.
Love to but can' t."La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
-

TardoFreak
73,9k 8 12 13 - -EY Legend-

- Messaggi: 15754
- Iscritto il: 16 dic 2009, 11:10
- Località: Torino - 3° pianeta del Sistema Solare
0
voti
Eccomi. Ho avuto da fare al lavoro. Allora ho riprovato e ho riscritto il codice:
Ora sul display si visualizza qualcosa ma sono numeri improbabili e troppo alti. A volte salta a oltre 33000 giri senza senso. Cerco di capire dove sta l'errore...
- Codice: Seleziona tutto
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
int periodo=0;
int ricevuto=0;
int risultato=0;
int cont=0;
char testo[6];
char txt1[]="Tach/hr";
void interrupt()
{
TMR1ON_bit=1;
cont++;
INTCON.INTF=0;
if(PIR1.TMR1IF)
{
PIR1.TMR1IF=0;
TMR1H=0;
TMR1L=0;
risultato=0;
}
}
void main()
{
PORTB = 0; // Initialize PORTB
PORTC = 0;
TRISB = 1; // PORTB is output
OPTION_REG.INTEDG=1;
INTCON=0x90;
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
Lcd_Out(1,1,txt1); // Write text in first row
Delay_ms(500);
T1CON=0x30;
/*----------------------------------------------------------------------------*/
while(1)
{
if(cont==2)
{
TMR1ON_bit=0;
periodo=((TMR1H<<8)+TMR1L);
TMR1H=0;
TMR1L=0;
risultato=((60/4e-6)/periodo);
cont=0;
WordToStr(risultato,testo);
Lcd_Out(2,1,testo);
}
}
}
Ora sul display si visualizza qualcosa ma sono numeri improbabili e troppo alti. A volte salta a oltre 33000 giri senza senso. Cerco di capire dove sta l'errore...
44 messaggi
• Pagina 4 di 5 • 1, 2, 3, 4, 5
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 4 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)
