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-Problem ze zmienną [C]

adi84_84 28 Lut 2011 01:56 1437 10
REKLAMA
  • #1 9214512
    adi84_84
    Poziom 14  
    Witam wszystkich :)
    W ramach nauki jezyka C (przesiadka z bascoma) napisałem taki program.
    Niestety zero odzewu ze strony switchy.
    Prosze o pomoc i z góry dziekuję :)
    Oto kod:

    /*
     * main.c
     *
     *  Created on: 2011-02-28
     *      Author: adi84_84
     */
    
    #include <avr/io.h>
    #include <avr/pgmspace.h>
    #include "LCD/lcd44780.h"
    #include <util/delay.h>
    
    #define KEY1_PIN (1<<PD1)
    #define KEY2_PIN (1<<PD2)
    #define KEY_UP ! (PINC & KEY1_PIN)
    #define KEY_DOWN ! (PINC & KEY2_PIN)
    
    char PROGMEM tab2[] = {"Zmienna:"};
    uint8_t Liczba;
    
    int main(void)
    {
    	DDRC &= ~( KEY1_PIN | KEY2_PIN );
    	PORTC |= KEY1_PIN | KEY2_PIN;
    	lcd_init();
    
    	while(1)
    	{
            lcd_locate(0,2);
    		lcd_str_P(tab2);
    		lcd_locate(0,12);
    		lcd_int(Liczba);
    
    		if( KEY_UP )
    			 {
    				 _delay_ms(80);
    			     if( KEY_UP )
    				 {
    					 Liczba++;
    					 _delay_ms(200);
    				     lcd_cls();
    	     	     }
    		     }
    		if( KEY_DOWN )
    
    			 {
    				 _delay_ms(80);
    				 if( KEY_DOWN )
    				 {
    					 Liczba--;
    					 _delay_ms(200);
    					 lcd_cls();
    				 }
    			}
    	   }
      }
  • REKLAMA
  • #2 9214849
    mirekk36
    Poziom 42  
    po pierwsze masz:

    
    #define KEY1_PIN (1<<PD1) 
    #define KEY2_PIN (1<<PD2) 
    


    a za chwilę piszesz:

    #define KEY_UP ! (PINC & KEY1_PIN) 
    #define KEY_DOWN ! (PINC & KEY2_PIN) 
    


    więc zobacz już na tym etapie jakie masz błędy. Wyżej PD1 i PD2 a niżej masz PINC. Wprawdzie to przypadkowo mogłoby zadziałać (zastanów się dlaczego) ale tak ogólnie to błąd żeby tak piać kod - bo sam się walniesz 100 razy przez to. Ciekawe jak masz fizycznie kabelkami podłączone słicze do pinów tzn które do których? czy tu jeszcze błędu nie ma dodatkowego.

    Dodano po 3 [minuty]:

    Poza tym nawet tak do testu to przejrzyściej byłoby gdyby to napisać np tak:

    
    int main(void) 
    { 
       //DDRC &= ~( KEY1_PIN | KEY2_PIN ); --> to nie jest potrzebne bo po resecie i tak wszystkie piny są wejściami
       PORTC |= KEY1_PIN | KEY2_PIN; 
       lcd_init(); 
    
       // to może się wyświetlić tylko raz - po co wciąż wachlować w pętli
       lcd_locate(0,2); 
       lcd_str_P(tab2); 
    
    
       while(1) 
       { 
    
          if( KEY_UP ) 
              { 
                 _delay_ms(80); 
                  if( KEY_UP ) 
                 { 
                    Liczba++; 
                    // po co wachlować CLS'ami ??? można tak ;) 
                    lcd_locate(0,12); 
                    lcd_int(Liczba); 
                    } 
               } 
          if( KEY_DOWN ) 
    
              { 
                 _delay_ms(80); 
                 if( KEY_DOWN ) 
                 { 
                    Liczba--; 
                    lcd_locate(0,12); 
                    lcd_int(Liczba); 
                  } 
             } 
          } 
      }
    


    Po co te opóźnienia 200ms - przecież dzięki takiej konstrukcji jak wyżej masz już dużo lepszą obsługę przycisków bo pętla główna nie jest tak mocno blokowana dla innych zadań ;)
  • REKLAMA
  • #3 9214906
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #5 9214934
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #6 9214954
    mirekk36
    Poziom 42  
    _marek napisał:
    Faktycznie pomyliłem z czymś podobnym do:
    char PROGMEM tab[2] = {"Zmienna:"};

    Chyba muszę dopić tą kawę :)


    No a ja już dopiłem kawkę dlatego mnie to zastanowiło ;)

    a jeszcze do autora, żeby zmienna wyświetlała się bez żadnych "ogonów" to można jeszcze to zrobić tak:

    
                    lcd_locate(0,12); 
                    lcd_int(Liczba); 
                    lcd_str_P(PSTR("  "));
    


    czyli ze dwie spacje kasujące wartość gdyby licznik się przekręcił z 255 na 0 ;)
  • #7 9215278
    adi84_84
    Poziom 14  
    Dziękiuje wszystkim.Rzeczywiscie nie dopatrzyłem (1<<PD1) = PORTC :)

    Dodano po 26 [minuty]:

    /*
     * main.c
     *
     *  Created on: 2011-02-28
     *      Author: adi84_84
     */
    
    #include <avr/io.h>
    #include <avr/pgmspace.h>
    #include "LCD/lcd44780.h"
    #include <util/delay.h>
    
    #define KEY1_PIN (1<<PD1)
    #define KEY2_PIN (1<<PD2)
    #define KEY_UP ! (PIND & KEY1_PIN)
    #define KEY_DOWN ! (PIND & KEY2_PIN)
    
    char PROGMEM tab2[] = {"Zmienna:"};
    uint8_t Liczba;
    
    int main(void)
    {
       //DDRC &= ~( KEY1_PIN | KEY2_PIN ); --> to nie jest potrzebne bo po resecie i tak wszystkie piny są wejściami
       PORTD |= KEY1_PIN | KEY2_PIN;
       lcd_init();
    
       // to może się wyświetlić tylko raz - po co wciąż wachlować w pętli
       lcd_locate(0,2);
       lcd_str_P(tab2);
    
    
       while(1)
       {
    
          if( KEY_UP )
              {
                 _delay_ms(80);
                  if( KEY_UP )
                 {
                    Liczba++;
                    // po co wachlować CLS'ami ??? można tak ;)
                    lcd_locate(0,12);
                    lcd_int(Liczba);
                    }
               }
          if( KEY_DOWN )
    
              {
                 _delay_ms(80);
                 if( KEY_DOWN )
                 {
                    Liczba--;
                    lcd_locate(0,12);
                    lcd_int(Liczba);
                  }
             }
          }
      }


    Przy takim kodzie zaczeło cos trybić ale dziwnie się jeszcze zachowuje poniewarz:
    switch podłączony do PD1 jest martwy a znowu ten podłączony do PD2 dodaje liczbę zamiast odejmowac ?
  • #8 9215581
    mirekk36
    Poziom 42  
    Przede wszystkim tak z ciekawości zapytam, testujesz to na jakiejś własnej płytce stykowej? czy w jakimś zestawie uruchomieniowym? czy przypadkiem nie masz czegoś podłączonego do pinów PD0, PD1 ???? Jeśli stosujesz pewien zestaw uruchomieniowy to sprawdź jumperki do linii RS232 (trzeba byłoby je rozłączyć) ;) albo najlepiej to na drugi raz zawsze bardziej świadomie wybierać przypadkowe piny do testowania słiczy, bo wybierasz RxD i TxD - a może są one podłączone do nadajnika i odbiornika FT232R i stąd jakieś dziwne stany ???? .... oczywiście ze wszystkim jak widzisz można sobie poradzić tylko warto zawsze zajrzeć do schematu swojego zestawu uruchomieniowego przy takich okazjach nie wspominając już o nocie PDF, którą warto mieć w okienku pod spodem zawsze ;)

    Jeśli chodzi zaś o dodawanie - to słicz nie dodaje ani nie odejmuje .... robi to twój program, zatem to tam gdzieś musi być byczek jeśli nie działa zgodnie z twoimi założeniami. Poza tym co to znaczy w ogóle wg ciebie "że klawisz dodaje liczbę" ??? Staraj się zawsze bardziej precyzyjnie opisywać problem, żeby można było szybciej i lepiej coś doradzić ;)

    powodzenia
  • #9 9218599
    adi84_84
    Poziom 14  
    Płytka jest mojej własnej produkcji i wraz z pakietem bascom działała pięknie przez jeden rok a teraz po zakupie twojej książki przyszedł czas na C :).Tak czy siak coś niedziała i pokombinuję jeszcze.
  • #10 9218673
    mirekk36
    Poziom 42  
    adi84_84 napisał:
    Płytka jest mojej własnej produkcji i wraz z pakietem bascom działała pięknie


    No to super ;)


    adi84_84 napisał:
    Tak czy siak coś niedziała i pokombinuję jeszcze.


    Tak tylko to pozostaje bo przykład programowy jest prosty i pierwsze co bym na twoim miejscu sprawdził to po prostu przepięcie słiczy na całkiem inne piny. Może wtedy szybko ci sie wyjaśni gdzie robisz błąd?
  • #11 9218803
    adi84_84
    Poziom 14  
    Ok.Problem rozwiązany.
    Wystarczyło zmienic (1<<PD1),(1<<PD1) na (1<<PD6),(1<<PD7).Choć i tak to trochę dziwne ponieważ sprawdzałem połączenie chyba z 10 razy i oprócz switchy nic innego do tych portów nie było podpiete.
    Dzięki za pomoc

    Pozdrawiam ;)
REKLAMA