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

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

Citek 28 Lut 2009 11:21 1367 2
REKLAMA
  • #1 6215913
    Citek
    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
    //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
  • REKLAMA
  • #2 6215951
    dawid512
    Poziom 32  
    Pytanie nr 1: masz wyłączony JTAG? A teraz zobacz tutaj:
    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:
    if (i==1)
           {
          cbi(PORTC,0);
           LCD_Clear();
           LCD_WriteText("Zwolniono przycisk");
          i = 0;
           } 


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

    TEMAT DO ZAMKNIĘCIA
REKLAMA