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

Jak zapalić diodę po wciśnięciu przycisku w C dla AVR?

nolab 03 Sie 2007 22:09 2784 10
REKLAMA
  • #1 4143859
    nolab
    Poziom 13  
    Posty: 120
    Pomógł: 1
    Ocena: 9
    tak wiem że na pewno to już było ale nie umiem znaleźć tego ;/
    a wiec tak.. mam 1 (słownie jeden) przycisk na płytce podpięty do jakiegoś tam pina i chce żeby po jego wciśnięciu np zapaliła się dioda podpięta do innego pina. Szukałem tego w kursie na patronie... ale nie umiem zrozumieć tego kodu co tam jest.. jak to zrobić najprościej tak żeby działało..
  • REKLAMA
  • #2 4143877
    riger
    Poziom 24  
    Posty: 810
    Pomógł: 23
    Ocena: 9
    Na patronie wogole jest to troche niejasno napisane.
    Co do przycisku to
    
    // Dołączenie wymaganego pliku nagłówkowego
    #include <avr/io.h>
    // makroinstrukcja powodująca ustawienie
    // PORTB.7 w stan niski 
    #define LED_ON PORTB &= 0x7F
    // makroinstruckja powodująca ustawienie
    // PORTB.7 w stan wysoki
    #define LED_OFF PORTB |= 0x80
    // Program główny
    int main(void)
    {
    // konfiguracja portów I/O
    DDRB = 0xFF;
    DDRD = 0xFC;
    PORTB = 0xFF;
    PORTD = 0xF7;
    // Pętla nieskoczona
    while(1)
    {
    // Jeśli PIND.0 jest w sanie niskim
    // to znaczy, że wciśnięto S1
    if(bit_is_clear(PIND, PD0))
    // zapal kropke wyświetlacza
    LED_ON;
    // Jeśli natomiast PIND.1 jest w stanie niskim
    // to znaczy, że wciśnięto S2
    if(bit_is_clear(PIND, PD1))
    // zgaś kropke wyświetlacza
    LED_OFF;
    }// koniec pętli nieskończonej
    return 0;
    }
  • REKLAMA
  • #3 4144025
    kamyczek
    Poziom 38  
    Posty: 3994
    Pomógł: 394
    Ocena: 571
    Riger umiesz liczyć ? U Ciebie są 2 przyciski (słownie dwa) ;)
  • #4 4144641
    nolab
    Poziom 13  
    Posty: 120
    Pomógł: 1
    Ocena: 9
    Kompilator zwraca błąd undefined symbol "bit_is_clear"
    używam CodeVisionAVR.
    oczywiście zmieniłem #include <avr/io.h> na #include <mega8.h>
  • #5 4144667
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    ja tam nigdy nie korzystam z "bit_is_clear" i tym podobnych... łatwej chyba napisać to tak:
    if(!( PIND & _BV(PD0) ))
    jak dla mnie - czytelniejsze :D ewentualnie _BV(x) można zamienić na (1 << x)
  • #6 4144678
    nolab
    Poziom 13  
    Posty: 120
    Pomógł: 1
    Ocena: 9
    dalej coś nie tak ;/
    mam coś takiego
    #include <mega8.h>
    #define LED_ON(APort, APin) { (DDR ## APort) |= _BV(APin);(PORT ## APort) |= _BV(APin); } 
    #define LED_OFF(APort, APin) { (DDR ## APort) |= _BV(APin);(PORT ## APort) &=~_BV(APin); } 
    // Program główny
    int main(void)
    {
    
    DDRB = 0xFC;
    PORTB = 0xF7;
    
    // Pętla nieskoczona
    while(1)
    {
    // Jeśli PINB.1 jest w sanie niskim
    // to znaczy, że wciśnięto S1
    if(!( PINB & _BV(PB1) )) 
    // zapal kropke wyświetlacza
    LED_ON(B,2);
    }// koniec pętli nieskończonej
    return 0;
    }

    no i ... Kompilator zwraca błąd
     undefined symbol "_BV"
  • REKLAMA
  • #7 4144687
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    wstaw na początku definicje makra:
    #define _BV(x) (1 << (x))
    i powinno działać
  • #8 4144690
    johny_w
    Poziom 24  
    Posty: 673
    Pomógł: 80
    Ocena: 63
    _BV(x) jest makrem AVR-GCC. W CodeVision musisz napisać zamiast tego: (1<<x), gdzie x oznacza oczywiście numer bitu.
  • REKLAMA
  • #9 4144734
    nolab
    Poziom 13  
    Posty: 120
    Pomógł: 1
    Ocena: 9
    dziala :)
    no to teraz dalej :)
    jak zrobić żeby kolejne wciśnięcia robią co innego ?
    np drugie wyłącza, trzecie miga tą diodą itd..

    Dodano po 16 [minuty]:

    zrobiłem coś takiego
    #include <mega8.h>
    #asm
       .equ __lcd_port=0x12 ;PORTD
    #endasm
    #include <lcd.h>
    #define _BV(x) (1 << (x))
    unsigned char zwrot=0;
    unsigned char klawiatura(void)
      {
       
        DDRB = 0xFC;
        PORTB = 0xF7;
        if(!( PINB & _BV(1) ))
          {
            zwrot=zwrot+1;
          }
    
        return zwrot;
      }
      
      
    void stan(void)
      {
        if(klawiatura()==1)
          {
                lcd_gotoxy(0,0);
                lcd_putsf("1");
          }
        if(klawiatura()==2)
          {
                lcd_gotoxy(0,0);
                lcd_putsf("2");
          }
        if(klawiatura()==3)
          {
                lcd_gotoxy(0,0);
                lcd_putsf("3");
          }                     
    }
      
      
    // Program główny
    int main(void)
      {
        lcd_init(16);
    
        // Pętla nieskończona
        while(1)
          {                            
             stan();
          }// koniec pętli nieskończonej
        return 0;
      }
    

    ale nie działa ;/
    kiedy nacisnę RAZ przycisk obrazu pojawia sie na LCD 3 ... czyli nie tak jak chciałem ;/
  • #10 4144857
    riger
    Poziom 24  
    Posty: 810
    Pomógł: 23
    Ocena: 9
    kamyczek, oj sie czepiasz, chyba ze dla Ciebie jest to jakies niepojete, ze sa 2 przyciski. Sa komentarze wiec sadze, ze nie powinno to sprawic problemow. Co do kompilatora to uzywm WINAVR.
  • #11 4145147
    kamyczek
    Poziom 38  
    Posty: 3994
    Pomógł: 394
    Ocena: 571
    Zwracam uwagę na fakty jeden przycisk to jeden dwa to dwa Hi hi może ci co piszą w c to już liczyć nie potrafią ;) a tak serio ławiej zrobić to na 2 przyciskach niż na jednym , robiąc na jednym treba wyeliminować drgania styków itd ...

Podsumowanie tematu

✨ Dyskusja dotyczy implementacji prostego programu w języku C dla mikrokontrolera AVR (konkretnie ATmega8), który po wciśnięciu jednego przycisku zapala diodę LED podłączoną do innego pinu. Przedstawiono przykładowy kod z wykorzystaniem rejestrów DDR, PORT i PIN do konfiguracji i odczytu stanu przycisku oraz sterowania diodą. Omówiono problemy z funkcją bit_is_clear, która nie jest dostępna w kompilatorze CodeVisionAVR, oraz zaproponowano zastąpienie jej wyrażeniem bitowym (PIND & (1
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA