Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

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

Drobny1995 02 Oct 2019 20:30 261 3
  • #1
    Drobny1995
    Level 7  
    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
    Code: c
    Log in, to see the code


    Bardzo prosił bym o podpowiedz co mogę robić źle że takie coś się dzieje.
  • Helpful post
    #2
    tmf
    Moderator of Microcontroller designs
    Wyłącz w niej interfejs JTAG, który jest na tych samych pinach zapewne.
  • Helpful post
    #3
    Janusz_kk
    Level 36  
    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 wrote:
    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 wrote:
    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
    Drobny1995
    Level 7  
    Pomogło wyłączenie JTAG gdy go wyłączyłem odrazy cały program ruszył wielkie dzięki za pomoc