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

[Rozwiązano] Jak odczytywać wartość jednych portów, by potem zmieniać stany innych?

Drobny1995 02 Paź 2019 20:30 300 3
  • #1 18198509
    Drobny1995
    Poziom 8  
    Witam

    Jestem w trakcie budowania małego projektu, mam z nim niestety mały problem z którym nie mogę sobie poradzić wygląda to tak że chce odczytywać wartość portów PC0...PC5 i w zależności od tego czy jest tam stan wysoki czy niski zmieniać stany na portach PD0,PD1,PD4,PD5,PD6,PD7.

    Gdy odczytuje piny PC0 i PC1 jest ok, ale gdy chce odczytać stany z innych pinów pojawia się problem ponieważ natychmiast zapala się czerwony led tak jakby był tam stan niski przemierzyłem je miernikiem i jest tam napięcie 4,7V poza portem PC4 na nim jest 1,7 V

    Czy ja coś tam źle ustawiam czy w jakiś sposób uszkodziłem sobie atmegę (kupiłem 2 nowe i jest tak samo )


    Dodatkowo chciałem później dodać aby pikał buzer oraz wyświetlała się informacja na ekranie, gdy będzie nieprawidłowy stan na którymś pinie dlatego podłączałem to przez atmegę.

    Używam ATmega32.

    kod programu
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Bardzo prosił bym o podpowiedz co mogę robić źle że takie coś się dzieje.
  • Pomocny post
    #3 18198638
    Janusz_kk
    Poziom 38  
    Sorry ale nie chce mi się analizować całego kodu, masz tak kilka "perełek"
    Dlatego zacznij od początku czyli inicjacja, pętla główna w której czytasz wejścia i
    sygnalizacja co czytasz.
    Teraz fragmenty twojego kodu:
    DDRD &= ~(1<<PD2) | (1<<PD3); //WE INT0 i INT1
    Po 1 jak jeszcze nic nie pisałeś do rejestru to po co "&",
    dwa- pd2 będzie zerem ale pd3 jedynką, taki miałeś zamiar?


    PORTD |=(1<<PD2)|(1<<PD3);
    Tu podobnie or jest zbyteczny

    DDRD |= (1<<PD0) | (1<<PD1) | (1<<PD4) | (1<<PD5) | (1<<PD6) | (1<<PD7); // WY zatkanie zbiornika
    a tu radośnie wpisujesz jedynki a można to prosto zrobić tak
    DDRD=0xFF & ~(1<<PD2) | (1<<PD3); ~
    bo jak się domyślam to oba miały być wejściem :)

    Drobny1995 napisał:
    GICR |= _BV(INT0); //aktywacja przerwania INT 0
    MCUCR |= (1<<ISC01) | (1<<ISC00); // ustawianie przerwania na zbocze narastające


    tu także or-y zbędne

    Drobny1995 napisał:
    Gdy odczytuje piny PC0 i PC1 jest ok, ale gdy chce odczytać stany z innych pinów pojawia się problem ponieważ natychmiast zapala się czerwony led tak jakby był tam stan niski przemierzyłem je miernikiem i jest tam napięcie 4,7V poza portem PC4 na nim jest 1,7 V


    Jtag-a wyłączyłeś? chyba nie.
  • #4 18198643
    Drobny1995
    Poziom 8  
    Pomogło wyłączenie JTAG gdy go wyłączyłem odrazy cały program ruszył wielkie dzięki za pomoc
REKLAMA