J'essaie de configurer une interruption et un compteur/minuteur. L'interruption est externe, lisant la logique basse de la broche. La minuterie devrait augmenter chaque 100 us et ajouter jusqu'à count
variable. J'ai configuré l'interruption, qui fonctionne bien après la mise en place d'une minuterie, ni l'interruption ni le minuteur ne fonctionnent. Le code est par exemple:Configuration de l'interruption et de la minuterie atmega 328p [C/C++]
volatile boolean allowCount = false, timerFlag = false;
volatile unsigned int counter;
boolean pulseLow = false;
void setup(){
Serial.begin(9600);
// initialize external pin interrupt.
PCICR = 0b00000010; // 1. PCIE1: Pin Change Interrupt Enable 1
EICRA |= bit (ISC10); // set wanted flags (low logic level causes interrupt)
PCMSK1 = 0b00010000; // Enable Pin Change Interrupt for A4
// TODO Interrupt settings not working together
// initialize Timer1
cli(); // disable global interrupts
TCCR1A = 0; // set entire TCCR1A register to 0
TCCR1B = 0; // same for TCCR1B
// set compare match register to desired timer count:
OCR1A = 0x18;
// turn on CTC mode:
TCCR1B |= (1 << WGM12);
// Set CS10 and CS12 bits for 64 prescaler:
TCCR1B |= (1 << CS10);
TCCR1B |= (1 << CS11);
// enable timer compare interrupt:
TIMSK1 |= (1 << OCIE1A);
}
void loop(){
if (allowCount == true)
{ timer100_uS();
if (counter > 50 && pulseLow == false){
DDRC |= (1 << DDC3); // sets bit DDC3 to 1 within register DDRC
//set pin 3(A3) ouput as sourcing Vcc(HIGH)
PORTC |= (1 << PORTC3);
timerReset();
pulseLow = true;
}
if (pulseLow == true){
timer100_uS();
if (counter >= 500){
//set pin3 of port C to LOW (A3);
PORTC &= ~(1 << PORTC3);
pulseLow = false
timerReset();
}
}
// external pin interrupt
ISR(PCINT1_vect){
if (allowCount == false)
allowCount = true;
}
// timer/counter interrupt
ISR (TIMER1_COMPA_vect)
{
if (timerFlag == true){
counter++;
}
}
void timer_100uS(void){
timerFlag = true;
cli();
}
void timerReset(void){
sei();
timerFlag = false;
counter = 0;
}
Valeur de OCR0A est calculée comme étant de 24 (0x18) avec prédiviseur 64 et 16 MHz sur la base de la formule suivante:
OCRn = [ (clock_speed/Prescaler_value) * Desired_time_in_Seconds ] - 1
Comment configurer différentes interruptions de telle sorte que ils ne se chevauchent pas? Ou mieux encore, est-il possible de configurer la minuterie pour qu'elle n'utilise pas d'interruption? Merci d'avoir lu!
juste ne pas définir l'interruption permettent dans les minuteries registre de contrôle oui ? puis interrogez le (s) registre (s) d'état pour voir si le minuteur a fait ce que vous attendiez de lui. –
pouvez-vous les utiliser séparément seulement faire une chose ou l'autre mais pas les deux, l'interruption fonctionne-t-elle pour chaque situation? Quelle est la source de votre interruption externe (un bouton ou un signal provenant d'un autre appareil)? Si un bouton, comment gérez-vous le rebond? –
@old_timer A quoi ressemblerait la lecture du compteur/valeur du compteur à partir du registre d'état? counterValue = SREG? L'interruption externe lit le signal analogique de passage par zéro, cela fonctionne à chaque fois. – flowian