2017-02-20 1 views
0

J'ai une configuration de circuit, qui allume la led chaque fois que l'on appuie sur un bouton et il compte de 0 à 255, donc dans le binaire 0000 0000 à 1111 1111. Mon commutateur est configuré pour PB2 qui est D9 sur la carte.AVR C: Compteur de 8 bits utilisant le bouton

Je fais face à un problème, comme vous pouvez le voir dans mon coud J'utilise 8 broches, 6 du registre D et 2 du registre B. Quand j'augmente PORTB et à un certain point il devient 0b00000100, alors c'est la même valeur que la broche d'entrée qui est alors pb2 donc dans ma boucle infinie même si je n'appuie pas sur le bouton pour PINB, il est allumé. J'ai essayé de réinitialiser les valeurs de PORTB à 0 mais il ne s'éteindra pas.

J'ai besoin d'un mécanisme, donc quand j'augmente PORTB ça n'affecte pas ma broche d'entrée qui est PB2.

S'il vous plaît toute aide est appréciée, j'ai essayé de poster la vidéo, mais c'est trop grand.

#include <avr/io.h> 
#define F_CPU 16000000UL 
#include <util/delay.h> 

/* 
    Board digital I/O pin to atmega328 registers for LEDS 
    | d2 | d3 | d4 | d5 | d6 | d7 | d8 | d9 | 
    | pd2 | pd3 | pd4 | pd5 | pd6 | pd7 | pb0 | pd1 | 

    Input Button 
    | d9 | 
    | pb2 | 


*/ 


int main(void) { 

    int x; 

    DDRD = 0b11111100; 
    PORTD = 0b00000000; 

    DDRB = 0b00000011; 
    PORTB = 0b00000100; 

    while(1) { 

     if((PINB & 0b00000100) == 0) { 

      if(x < 63) { 

       PORTD = PORTD + 0b00000100; 
       x++; 

      } else if (x == 63) { 

       x=0; 
       PORTD = 0b00000000; 
       PORTB = PORTB + 0b00000001; 

       //problem here, when PORTB is incremented to 0b00000100 then the switch turns on automatically 
       if((PORTB & 0b00000100) == 0b00000100) { 
        PORTB = 0b00000000; 
        PORTD = 0b00000000; 
       } 

      } 

      _delay_ms(80); 


     } 

    } 

    return 0; 
} 

Répondre

0

La réponse facile est d'éviter d'utiliser PORTB en tant que variable. Au lieu de cela, utilisez x et déplacez la valeur de x de manière appropriée pour l'afficher.

#include <avr/io.h> 
#define F_CPU 16000000UL 
#include <util/delay.h> 

/* 
Board digital I/O pin to atmega328 registers for LEDS 
| d2 | d3 | d4 | d5 | d6 | d7 | d8 | d9 | 
| pd2 | pd3 | pd4 | pd5 | pd6 | pd7 | pb0 | pd1 | 

Input Button 
| d9 | 
| pb2 | 
*/ 


int main(void) { 

    uint8_t x = 0; 

    DDRD = 0b11111100; 
    PORTD = 0b00000000; 

    DDRB = 0b00000011; 
    PORTB = 0b00000100; 

    while(1) { 

     if((PINB & 0b00000100) == 0) { 

      ++x; 

      PORTD = x << 2; 
      PORTB = (PORTB & 0b11111100) | ((x >> 6) & 0b00000011); 
     } 

     _delay_ms(80); 
    } 
    return 0; 
}