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

[Atmega 8535][C]Przyciski, dziwny problem.

Verengard 25 Gru 2010 23:06 1073 2
REKLAMA
  • #1 8912913
    Verengard
    Poziom 10  
    Czesc wszystkim :) Wesolych

    Szukalem juz dosc dlugo po tutorialach a temat dość prosty wydaje. Mianowicie, prosty podrecznikowy przyklad :

    Mamy sobie atmege 8535, sprawna. Podlaczamy sobie do np PB 0 leda, PB 1 switcha :

    robie tak :

    
    
    #define F_CPU 1000000UL
    #include <stdlib.h>
    #include <avr/io.h>
    #include <util/delay.h>
    
    #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
    #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
    
    int main(void)
    {
      sbi(DDRB,0);
      while(1)
      {
        if bit_is_set(PINB, PB1)
        {
          sbi(PORTB,0);
          loop_until_bit_is_clear(PIND, PB1);
          cbi(PORTB,0);
        }
    }
    
    


    Ok działa, naciskam to sie pali puszczam gasnie. Problem jest ze dziala to wylacznie na PB1 jak dam przycisk na PB2 czy jaki kolwiek inny pin to w 99% nie reaguje na przycisk czy cokolwiek a raczej zyje wlasnym zyciem albo odczytuje stan z kosmosu. Przyciski podlaczam do +VCC przez switcha i do pina przez rezystor 1k.

    Chodzi mi oczywiscie o przyklad w praktyce bo w hapsimie itp to dziala...
  • REKLAMA
  • Pomocny post
    #2 8913089
    mirekk36
    Poziom 42  
    Podręcznikowy przykład to jest taki, że zwierasz switcha do GND a nie do VCC. Za to rezystor wykorzystujesz do podciągnięcia linii do VCC. Można też pominąć rezystor i podciąganie włączyć programowo poprzez wystawienie jedynki na ten pin gdzie masz switch.

    A w warunku badasz czy jest ZERO a nie JEDEN jak w tej chwili.
  • #3 8913108
    Verengard
    Poziom 10  
    No tak ale nigdzie nie pisali zeby NIE podlaczac do VCC :P a zdziwilo mnie ze na PB1 dziala jak nalezy a na innych juz nie dlatego pytam.

    
      while(1)
      {
        if bit_is_clear(PINB, PB1)
        {
          sbi(PORTB,0);
          loop_until_bit_is_set(PINB, PB1);
          cbi(PORTB,0);
        }
    


    Tak to powinno wygladac ?
    Jakies dodatkowe deklaracje sa potrzebne, przepraszam za troche nubskie pytania ale czytalem te tutoriale i jakos nie moge ogarnac tego, w hapsimie dzialalo normalnie tak jak robilem do tej pory a w rzeczywistej konfiguracji widze jest inaczej :P

    edit : dobra w koncu ogarnalem :D
REKLAMA