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

[Atmega8][C] problem z portami

piotrek7700 07 Cze 2010 12:41 1050 2
REKLAMA
  • #1 8164488
    piotrek7700
    Poziom 16  
    Witam. Mam problem z podstawowa konfiguracja portów w Atmega8 (oraz Atmega88). Najpierw myślałem ze uC jest uszkodzony. Zamieniłem na Atmege88. Nadal tak samo się zachowuje.
    Jak np na mam odczytać PINB5 i w zależności od jego stanu zmienić któryś bit PORTB na przeciwny to nie działa nic, ciągle widzi ze PINB5 ==1. Jak PINB5 ma sterować PORTD działa poprawnie. Cały PORTD to wyjście. PORTB0..4 wyjścia reszta to wejścia. Cały PORTC to wejścia. I np z wszystkie PINC które próbuję odczytać zachowują się jakby były cały czas podciągnięte do VCC. Już nie wiem gdzie szukać błędu w tak prostym kodzie. Tam nie ma nic co może wprowadzać zakłócenia. Dodam ze próbowałem napisać to pod AVRstudio i w symulatorze działa poprawnie. Kompilowałem także w CodeVision. Nie próbowałem jedynie w Bascomie z racji ze nie uruchomiło mi się to środowisko a w domu nie mam Internetu. Proszę o pomoc, ponieważ na Atmega88 chciałem zbudować coś dużo bardziej skomplikowanego i sprawdzić jej możliwości a jak na razie nie potrafię sterować portami. Przetwornik ADC działa poprawnie w obu kościach. Dzisiaj kupię jeszcze jedną kość dla sprawdzenia. FuseBity sa skonfigurowane na 8MHz internal RC. a tak to wszystkie se default'owe.

    
    #include <avr/io.h>
    #define F_CPU 8000000
    int main()
    {
    
    
    
    // Input/Output Ports initialization
    // Port B initialization
    // Func7=In Func6=In Func5=In Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
    // State7=T State6=T State5=P State4=0 State3=0 State2=0 State1=0 State0=0 
    DDRB = 0b00011111;
    PORTB =0b00100000;
    
    // Port C initialization
    // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State6=T State5=P State4=P State3=P State2=T State1=T State0=T
    DDRC = 0b00000000;
    PORTC =0b11111000;
    
    // Port D initialization
    // Func7=In Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
    // State7=T State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
    DDRD = 0b01111111;
    PORTD =0b10000000;
    
    while (1)
          {
    //warunek majacy jedynie zmieniac bit w porcie wyjscowym 
           if (((PINC && 0b00100000)))
          PORTD |= 0b00000001;
          else
          PORTD &=0b11111110;
    
    /* tak samo nie dziala nic a nic taki kod
    w symulatorze dziala poprawnie a w rzeczywistosci nie dziala.
     if (((PINB && 0b00100000)))
          PORTB |= 0b00000001;
          else
          PORTB &=0b11111110;
          }
    */
    }
    


    Dodam że to nie mój pierwszy program na uC. Do tej pory wykorzystywałem M16, M32, tiny2313 tiny15... Ale po raz pierwszy mam takie problemy... A bardzo zależy mi na rozgryzieniu tych m8 i m88 dlaczego zachowują się tak samo....
    pozdrawiam
  • REKLAMA
  • #2 8164660
    tmf
    VIP Zasłużony dla elektroda
    if (((PINC && 0b00100000))) - błędem jest && - to operacja logiczna and, a ty chcesz zrobić maskowanie, czyli tylko jeden &.
  • #3 8165513
    piotrek7700
    Poziom 16  
    Ja tu, układ tam...
    Człowiek uczy się cale życie, a do C niedawno się przesiadłem.
REKLAMA