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

Programowanie uC w jezyku C

qudi 14 Mar 2010 12:21 1554 13
  • #1 7827655
    qudi
    Poziom 15  
    Mam pytanie dlaczego caly portd daje mi jedynke podczas gdy mam wcisniety pina (5bit na 1), symulator pokazuje ze powinno byc wszedzie zero i dioda nigdy sie nie zapali (niezaleznie od pina). Wydaje mi sie jakby u mnie w programi 0 bylo jedynka a 1 zerem pomozecie ???

    
    #include <avr/io.h>
    
    
    void Inicjalizacja(void)
    {
    DDRD=0xff;
    PORTD=0x00;
     
    DDRA=0x00;
    PORTA=0xff;
    }
    
    
    int main(void)
    {
    Inicjalizacja();
    
    
    while(1)
    {
    
     if(bit_is_clear(PINA, 5)) {
    
       
      PORTD &= ~_BV(5);
    //PORTD = 0b00000000;
    }
    else {
    
       
      PORTD &= _BV(5);
    //PORTD = 0b00100000;
      }
    }
    
    } 
    


    Przeniesiono z Programowanie Ogólne. - arnoldziq

    Dodano po 17 [minuty]:

    Kiedy elsa zmienie na takiego to program dziala juz poprawnie

    else {


    PORTD |= _BV(5);
    //PORTD = 0b00100000;
    }

    ale problem polega na tym ze to co jest wyzej powinno dawac caly czas zero a daje na portd 1 dlaczego ????
  • #2 7827787
    tadzik85
    Poziom 38  
    Nie może działać, poczytaj o maskowaniu bitów i podstawowych operacjach logicznych. 2 wersja jest poprawna.

    PORTD &= _BV(5);

    działa następująco:

    0000 0001
    po bv masz:
    0010 0000

    po AND zerujesz wszystkie bity oprócz 5, a ty chcesz go ustawić nalezy więc zastosować operacje OR.
  • #3 7827848
    qudi
    Poziom 15  
    no tak ja to wiem ale chcialbym wiedziec dlaczego jak zastosuje AND to on mi oddaje 1 a nie zero ?

    Dodano po 2 [minuty]:

    on oddaje mi jedynke na calym porcie D...
  • #4 7827908
    tadzik85
    Poziom 38  
    Może masz coś nie tak w połączeniach. Z logiki programu nie wynika by mógł ustawić ci cały port na 1. 2 możliwością jest działanie optymalizatora. Zresztą czym się przejmujesz skoro i tak poprawna jest 2 wersja.
  • #6 7827926
    qudi
    Poziom 15  
    poprostu che to rozgryzc... zastanawiajace jest to ze nawet jesli dam takie cos

    
    while(1)
    {
    
     if(bit_is_clear(PINA, 5)) {
    
       
      //PORTD &= ~_BV(5);
    PORTD = 0b00000000;
    }
    else {
    
       
    //  PORTD |= _BV(5);
    PORTD = 0b00000000;
      }
    }
    
    } 
    
    


    to na porcie d mam jedynke, poprostu nie wiem juz jak to sie dzieje, prosze jesli ktos wie o wytlumaczenie...
  • #7 7827938
    tadzik85
    Poziom 38  
    Krotka wskazówka:

    Ustawianie konkretnego bitu zawsze operacja |= bez negacji przed BV
    Zerowanie konkretnego bitu zawsze operacja &= z negacja przed BV

    A dlaczego w twoim przypadku cały port ustawiany jest na 1?? czarna magia, sprawdź bez optymalizacji i połączenia.
  • #8 7827950
    qudi
    Poziom 15  
    a co to znaczy bez optymalizacji polaczenia ? jestem tu troche zielony jeszcze...
  • #9 7827971
    tadzik85
    Poziom 38  
    Programując w C domyślnie włączone jest optymalizacja programu na jakimś poziomie. Optymalizator, zmienia trochę program pozostawiając jego funkcjonalność, i czasami mogą dziać się właśnie takie cuda, optymalizator stwierdził ze prościej ustawić mu cały port na 1 więc to zrobił.
    A połączenia?? Nie podałeś nam schematu może coś tak nie grać.
  • #10 7828016
    qudi
    Poziom 15  
    z portu d (5 bit) daje na katode diody , anoda zwarta z vcc(przez rezystor), switch z masa i pin a na 5 bit, probowalem juz ze wszystkimi mozliwymi optymalizacjami, ciagle to samo...
  • #11 7828024
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Jeez ale wy tu herezje wypisujecie... Dobrze że optymalizator nie stwierdził, że łatwiej będzie mu samemu post na elektrodzie napisać...

    No i koniecznie najważniejsze jest to durne _BV(x), bo przecież nie można by po ludzku zrobić (1<<x), efekt ten sam, znaczków tyle samo, a zaleta jest taka, że (1<<x) jest rozumiane przez KAŻDY kompilator na tej planecie, a _BV(x) jest zdefiniowane tylko w nagłówkach do avr-libc.

    4\/3!!
  • #12 7828032
    tadzik85
    Poziom 38  
    Pamiętaj, że wciśniecie switcha wymusza stan zero. A reszta tak jak już mówiłem. Więcej pomysłów brak.
  • #13 7828042
    qudi
    Poziom 15  
    no tak ale ja juz nawet ustawiam bity tak PORTD = 0b00000000; tego kompilator tez nie kuma ?

    Dodano po 57 [sekundy]:

    wcisniecie switcha to zero ?? a nie jeden ?? jesli tak to mam zle polaczenie... chyba

    Dodano po 5 [minuty]:

    wielkie dzieki tadzik :D nie wiedzialem ze jak wcisne switcha to on mi zero daje.... dzieki jeszcze raz

    Dodano po 1 [minuty]:

    teraz widze ze ja tu mialem bledy w polaczeniu,i wszystko dziala, temat zamykam elo
  • #14 7828084
    LiMuBai
    Poziom 15  
    Widac ze nie czytasz dokumentacji uC... wydrukuj sobie i wtlucz do glowy - raz - bo wiele rzeczy jest wspolnych dla wielu uC.
    Wewnatrz masz pullup do Vcc - jak dasz switcha do masy to chyba logika ze sciagniesz do 0...
REKLAMA