Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[ATMega32][c] - Samowciskający się przycisk

28 Lut 2009 11:32 1157 2
  • Poziom 22  
    Witam
    Mam pewien problem z jednym programem, który ma wykrywać wciśnięcie switcha.
    Chodzi o to, że gdy nacisnę obojętnie jaki switch i go puszcze to wyświetla się informacja, że switch 1 jest ciągle wciśnięty.
    Nie mam pojęcia o co w tym chodzi.
    Spójżcie na mój kod może coś tu pomieszałem, ale wydaje mi się że wszystko jest ok
    Code:
    //Program LCD+Switch+LED - ATMega8
    
    //
    //Obsługa wyświetlacza LCD, przycisków oraz diod LED
    //Na pewno działa
    // a) wyświetlacz LCD
    // b) przyciski
    // c) dioda

    //Podłączenie
    //- LCD - według pliku HD44780
    //- przyciski - do portu PC1 i PC2
    //- dioda - do portu PC0

    // Wejście = 0 -> switch
    // Wyjście = 1 -> dioda

    #include <avr/io.h>
    #include <inttypes.h>
    #include <util/delay.h>
    #include <hd44780.c>

    #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
    #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))

    int main(void)
    {
    DDRC=0x11110000; // PortC Pin1 i Pin 2 - Wejście , pozostałe Wyjścia
    PORTC=0xFF; // Włączenie podciągania wejść P1 i P2


    LCD_Initalize();
    LCD_Clear();
    LCD_WriteText("Test LCD");
    int i =0 ;

       while(1)
         {
         while (bit_is_clear(PINC, 0)) // Jeśli na wejściu 2 portu D (PD2) jest stan niski to,
          {
          _delay_ms(250);
          LCD_Clear();
          LCD_WriteText("Wcisnieto przycisk 1");
          i = 1;
          }
         while (bit_is_clear(PINC, 1)) // Jeśli na wejściu 2 portu D (PD2) jest stan niski to,
          {
          _delay_ms(250);
          LCD_Clear();
          LCD_WriteText("Wcisnieto przycisk 2");
          i = 1;
          }

         while (bit_is_clear(PINC, 2)) // Jeśli na wejściu 2 portu D (PD2) jest stan niski to,
          {
          sbi(PORTC,0);
          _delay_ms(250);
          LCD_Clear();
          LCD_WriteText("Wcisnieto przycisk 3");
          i = 1;
          }

         while (bit_is_clear(PINC, 3)) // Jeśli na wejściu 2 portu D (PD2) jest stan niski to,
          {
          _delay_ms(250);
          LCD_Clear();
          LCD_WriteText("Wcisnieto przycisk 4");
          i = 1;
          }

         if (i==1)
           {
          cbi(PORTC,0);
           LCD_Clear();
           LCD_WriteText("Zwolniono przycisk");
          i = 0;
           }
         }
    }


    Nie sugerujcie się do końca komentarzami, bo mogą i na pewno w nie których miejscach są nie poprawne.

    Umieszczam jeszcze schemat układu, może być pomocny
    [ATMega32][c] - Samowciskający się przycisk

    Dodano po 4 [minuty]:

    Wylutowałem nawet switcha, bo myślałem że może jakieś bardzo długie drgania albo że switch coś się wiesza, ale niestety nic to nie dało

    Dodano po 3 [minuty]:

    Podczas kompilacji otrzymjuę taki błąd:

    ../lcd+sw+led.c:27: warning: large integer implicitly truncated to unsigned type

    co on oznacza

    Dodano po 3 [minuty]:

    Ok, znalazłem błąd w kodzie. I jak na razie się nie wykrzacza
  • Poziom 32  
    Pytanie nr 1: masz wyłączony JTAG? A teraz zobacz tutaj:
    Code:
    while (bit_is_clear(PINC, 0)) // Jeśli na wejściu 2 portu D (PD2) jest stan niski to,
    
          {
          _delay_ms(250);
          LCD_Clear();
          LCD_WriteText("Wcisnieto przycisk 1");
          i = 1;


    a teraz tutaj:
    Code:
    if (i==1)
    
           {
          cbi(PORTC,0);
           LCD_Clear();
           LCD_WriteText("Zwolniono przycisk");
          i = 0;
           }


    Już widzisz co jest nie tak?
  • Poziom 22  
    Już poprawiłem wszystko i jak na razie jest ok.

    TEMAT DO ZAMKNIĘCIA