Ho scritto un nuovo programma usando un altro approccio. Il programma funziona nel seguente modo, se RB0 passa a livello logico alto il timer viene impostato a 100 ed RB0=0. A questo punto parte un ciclo while interno che non si arresta fino a che non sia più soddisfatta la condizione RB0=0, nel ciclo viene incrementata la variabile count ad ogni overflow del timer (1 ms) e la variabile sec ogni volta che count = 1000, cioè ogni secondo. Se RB0 passa di nuovo a livello logico alto, il ciclo while si deve interrompere e il tempo trascorso (dato da sec) viene riportato in uscita con PORTC = sec.
Da simulatore il programma funziona parzialmente. In altre parole, se dopo l'struzione
PORTC = sec; pongo nuovamente RB0=0 (vedi commento) il programma funziona (naturalmente solo per una volta). In realtà, RB0 dovrebbe rimanere ad 1 logico in quanto deve fare da fronte per la successiva misura temporale, ma in questo modo smettere di funzionare. Avreste consigli? Vi ringrazio.
- Codice: Seleziona tutto
#include <htc.h>
#include <stdio.h>
#include <stdlib.h>
__CONFIG(FOSC_XT & WDTE_OFF & PWRTE_OFF & BOREN_ON & LVP_ON & CPD_OFF & WRT_OFF & CP_OFF);
int count=0;
int sec=0;
void main(void) {
TRISB = 1;
TRISC = 0;
PORTB = 0;
PORTC = 0;
OPTION_REG = 0b00000100;
while (1) {
if (RB0 == 1) {
RB0=0;
TMR0 = 100;
while (RB0==0) {
if (TMR0 == 255) {
TMR0 = 100;
count++;
}
if (count == 1000) {
sec++;
count = 0;
}
}
PORTC = sec;
sec = 0;
//RB0 = 0;
}
}
}