logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Problem z przyciskiem | ATMEGA 16 | Język C

Andiron 08 Paź 2008 20:27 1208 3
  • #1 5612947
    Andiron
    Poziom 10  
    Podlaczone:
    PA0 z przyciskiem z jednej strony
    PA1 z przyciskiem z drugiej strony
    PA2 z diodą


    Kod:
    
    #include <avr/io.h>
    
    /* czestotliwosc kwarcu */
    #ifndef F_CPU
    #define F_CPU 1000000L
    #endif
    
    void poczekaj(int ms)
    	{
    	volatile long unsigned int i;
    	for(i=0;i<(ms*(F_CPU)/35000);i++);
    	}
    
    
    int main(void)
    {
    DDRA=0xFE;
    PORTA=0xFF;
    
    delay_ms(80);
    
    while (1) {
    if (bit_is_clear(PINA,PA0)) 
    {
    while (1) 
    {
    PORTA=0xFB;
    poczekaj(80);
    PORTA=0xFF;
    poczekaj(80);
    }
    }
    return(0);
    }
    }
    



    Wie ktoś czemu przycisk nie zmienia stanu... ?
    Dioda sie świeci ale skolei jego wciskanie nie daje żadnej reakcji :/

    Gdzie jest błąd :> ?
  • #2 5613133
    shg
    Poziom 35  
    Andiron napisał:
    Podlaczone:
    PA0 z przyciskiem z jednej strony
    PA1 z przyciskiem z drugiej strony

    Dlaczego tak dziwnie?

    void poczekaj(int ms)
    	{
    	volatile long unsigned int i;
    	for(i=0;i<(ms*(F_CPU)/35000);i++);
    	}

    Proponuję #include <util/delay.h> i zapoznanie się z funkcjami tam dostępnymi.

    if (bit_is_clear(PINA,PA0)) 

    A jakim cudem na PA0 miało by się pojawić zero?

    Andiron napisał:
    skolei

    "z kolei"

    Andiron napisał:
    Gdzie jest błąd :> ?

    Wszędzie...
  • #3 5613223
    Andiron
    Poziom 10  
    Z kolei zapytam tak, co powinienem zmienić ?
    Przypuszczam że zmienić podłączenie, tak ?

    PA0(podciągnięty pull-upem) ------[przycisk]------GND

    tak :) ?
  • #4 5613410
    shg
    Poziom 35  
    Tak. Przede wszystkim to.
    Podciąganie pull-upem wewnętrznym wystarczy, to już jest zrobione (0 w DDR i 1 w PORT).
    Ten delay przed pierwszą pętla zupełnie niepotrzebny.
    Nie wiem jak ten program ma działać, z tego co widzę to po wciśnięciu przycisku dioda będzie cały czas migać mimo zwolnienia go.
    Jeżeli ma migać tylko gdy przycisk jest wciśnięty to tak:
    while (1) {
      if (bit_is_clear(PINA,PA0))
      {
        // żeby nie ruszało pozostałych bitów, teraz to i tak żadnej różnicy nie robi, ale jakbyś używał innych pinów niezależnie to już będzie.
        PORTA &= ~_BV(PA2); // albo tak (to samo): PORTA &= ~(1 << PA2);
        _delay_ms(80);
        PORTA |= _BV(PA2); // albo tak (to samo): PORTA |= 1 << PA2;
        _delay_ms(80);
      }
    }

    Jeżeli używasz util/delay.h, to F_CPU musi być zdefiniowane przed #include <util/delay.h> Jako że jest to makro używane "globalnie", to dobrze było by je umieścić w Makefile jako argument dla kompilatora. Standardowy szablon Makefile z WinAVR udostępnia taką funkcjonalność.
REKLAMA