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

[AtMega128][AvrStudio] problem z banalnym kodem

Gural 07 Sie 2010 17:09 1110 6
REKLAMA
  • #1 8374479
    Gural
    Poziom 11  
    Witam,
    Chciałbym napisać działający kod, który by zapalił mi diode po wcisnięciu przycisku.
    Zacznę od tego iż wszystkie podłączenia luty i itp są OK.
    przycisk podłączony został pod PA7 oraz pod PA1 dioda natomiast która chce zapalić podłączona jest pod PB0 i GND.
    Czyli wciskam przycisk przelatuje 1 przez PA7 do PA1 jeśli PA1 =1 to PB0=1
    w innym przypadku PB0=0.
       
    
    #include <avr/io.h>
    #include <util/delay.h>               
    
    int main(void)
    {  DDRA = 0xF0;  
        DDRB = 0x03;
    while(1) 
     { 
      PORTA = 0xCC; 
      PINA = 0x33;  
    
            if(PINA | 0x03)
             {PORTB |=0x02; 
               PINB |= 0x02;
    		  }
      }
     }
    


    Z góry dzieki za zainteresowanie.
  • REKLAMA
  • #2 8374615
    landy13
    Poziom 31  
    Jakie zadanie mają instrukcje: PINA = 0x33; i PINB |= 0x02;? Do rejestrów PIN się nic nie wpisuje.

    Cytat:
    jeśli PA1 =1 to PB0=1
    w innym przypadku PB0=0.
    Ten inny przypadek to zero na PA1. Skąd się bierze? Znikąd. Po zwolnieniu przycisku jest stan nieustalony. Musiałbyś dać rezystor do masy.

    Chyba że zmienisz koncepcję programu. Przycisk zwieraj do masy, a PA1 podciągnij do VCC programowo.
  • REKLAMA
  • #3 8374979
    Gural
    Poziom 11  
    hmm chciałem zwierac vcc nie mase jednak mozna to zmienic...
    jesli dobrze zrozumialem musze wszystko zmienic na odwrotnie :)
    czy mozesz dokladniej wyjasnic jak miał bym to zrobic ?
  • REKLAMA
  • #5 8375261
    landy13
    Poziom 31  
    Gural napisał:
    chciałem zwierac vcc nie mase jednak mozna to zmienic...
    Ależ możesz zwierać do VCC, ale jak już pisałem wymaga to dołączenia dodatkowego rezystora. Zwieranie do masy może korzystać z wewnętrznego rezystora podciągającego, tzw pull-up.

    A jak to zrobić?
    -do rejestru DDR wpisać 0 - ustawienie jako wejście
    -do rejestru PORT wpisać 1- włączenie pull-up`a
    -z rejestru PIN czytać stan przycisku (przy zwarciu do masy będzie 0, przy zwolnieniu 1)
    To wszystko.
  • REKLAMA
  • #6 8375766
    Gural
    Poziom 11  
    Rozumiem ale pojąc nie mogę :)
    DDR ustawiam sobie jako wejście 0
    PORT tu podaje 1
    i kwestia PIN-u daje 0
    przycisk mam teraz połączony miedzy
    PA0 a Masą.
    to ustawienie dla przycisku.
    a jak ustawic 1 dla PB0 aby wcisniecie przycisku dawało 1
      
    
    #include <avr/io.h>
    #include <util/delay.h>               
    
    int main(void)
    {  DDRA = 0x00;  
       DDRB = 0x01;
    	while(1) 
     { 
    	  PORTA = 0x01; 
      	  PINA = 0x00;
     		
    	if(PINA & 0x00)
    		{PORTB =0x01; 
    		 PINB = 0x01;
              
    		  
    }
    }
      }

    tez nie pomogło ... hmmm..
  • Pomocny post
    #7 8375818
    gaskoin
    Poziom 38  
    rejestry PINx w atmedze128 są tylko do odczytu więc nie wolno do nich nic zapisywać.

    jak chcesz sprawdzić stan przycisku to robisz tak:

    ustawiasz pin do którego jest podpięty jako wejście
    podciągasz go do stanu wysokiego
    w pętli głównej sprawdzasz czy dany pin nie jest = 0 (co będzie miało miejsce gdy go naciśniesz)

    czyli mniej więcej tak:

    
    PORTA |= (1 << PA3);
    if(!(PINA & (1 << PA3))) coś;
    


    oczywiście dużo wygodniej zrobić to na przerwaniu, ale tu już odsyłam do datasheeta
REKLAMA