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

[C] Nie wygasza 1 diody. Zamieszczony kod programu.

xamrex 10 Lut 2011 22:42 1422 4
REKLAMA
  • #1 9134050
    xamrex
    Poziom 28  
    Witam,
    Mam taki programik
    #define F_CPU 8000000L
    #include <avr/io.h>
    #include <util/delay.h>  
    
    int main(void){
    
    DDRD = 0xFF; // port d jako wjscie
    DDRC = 0x00; // port C jako wejscie
    PORTD = 0xFF;  //wszystko na porcie d stan wysoki
    PORTC = 0xFF; // wszysko na porcie C stan wysoki
    
    
    while(1)
    {
    
    
    if(!(PINC & 0x04)){ //JelSli PINC1 zewrzemy do masy
    PORTD &= ~_BV(6);	// To na porcie D 6 Pin powinien mieć 0
    }
    
    if(!(PINC & 0x02)){ //JelSli PINC2 zewrzemy do masy
    PORTD &= ~_BV(7); // To na porcie D 7 Pin powinien mieć 0
    }
    
    else
    PORTD = 0xFF;
    
    }
    
    } 
    

    W porcie D6 oraz D7 mam diody.
    W portach C1 oraz C2 mam przyciski (zwierające do masy)
    Założenia były takie, że gdy zewrę PINC1 do masy, to gaśnie dioda z portu D6,
    A gdy zewrę PINC2 to gaśnie dioda z portu D7.

    Niestety program nie działa tak jak ma .
    Gdy zwieram PC2 to dioda z portu D7 tylko przygasa.
    A gdy zwieram PC1 to dioda z portu D6 normalnie gaśnie.

    Dlaczego?
  • REKLAMA
  • #2 9134153
    BoskiDialer
    Poziom 34  
    Problem leży w
    else 
    PORTD = 0xFF;

    Pierwszy warunek będzie gasił PD6, natomiast else od drugiego ifa będzie ponownie załączać PD6 - efektem będzie przygasanie.
  • REKLAMA
  • #3 9134292
    xamrex
    Poziom 28  
    Dzieki
    Zrobiłem to tak:
    #define F_CPU 8000000L
    #include <avr/io.h>
    #include <util/delay.h> 
    
    int main(void){
    
    DDRD = 0xFF; // port d jako wjscie
    DDRC = 0x00; // port C jako wejscie
    PORTD = 0xFF;  //wszystko na porcie d stan wysoki
    PORTC = 0xFF; // wszysko na porcie C stan wysoki
    
    
    while(1)
    {
    
    
    if(!(PINC & 0x04)){ //JelSli PINC1 zewrzemy do masy
    PORTD &= ~_BV(6);   // To na porcie D 6 Pin powinien mieć 0
    }
    
    if(!(PINC & 0x02)){ //JelSli PINC2 zewrzemy do masy
    PORTD &= ~_BV(7); // To na porcie D 7 Pin powinien mieć 0
    }
    
    if (PINC & _BV(1) && PINC & _BV(2) ){
    PORTD = 0xFF;
    }
    
    }
    
    } 
    
    
  • REKLAMA
  • #4 9135557
    pancio
    Poziom 16  
    rozumiem, że problem rozwiązany ale zwróć uwagę na konstrukcję tego typu:
    
    		if(bit_is_clear(PINC, 2))
    		{
    			_delay_ms(20); //debounce
    			...
    		}
    


    niby to samo co if(!(PINC & 0x02) ale o ile ładniej się czyta :-)
  • #5 9135613
    mirekk36
    Poziom 42  
    pancio napisał:
    rozumiem, że problem rozwiązany ale zwróć uwagę na konstrukcję tego typu:
    
    		if(bit_is_clear(PINC, 2))
    		{
    			_delay_ms(20); //debounce
    			...
    		}
    


    niby to samo co if(!(PINC & 0x02) ale o ile ładniej się czyta :-)


    A ja zdecydowanie uważam, że o wiele bardziej czytelny jest zapis:

    if( !(PINC & (1<<PC2) )


    niż te makra. Tzn nie jestem przeciwnikiem makr, broń Boże. Ale jak ktoś zaczyna się uczyć to najlepiej żeby OD RAZU oswoił się z zapisem związanym z przesunięciami bitowymi w C. Bez tego później i tak wyjdą same problemy - bo to PODSTAWA PODSTAW. To trzeba znać.

    Dodano po 19 [minuty]:

    Poza tym, xamrex ---> po co piszesz w kodzie tą linijkę:



    ????????

    czyżbyś pisał programy w notatniku? zamiast w jakimś AVR Studio albo Eclipse ??? gdzie plik makefile generowany jest automatycznie i dzięki temu stała F_CPU jest już zdefiniowana ładnie/pięknie na poziomie właśnie makefile i dostępna w całym programie.

    Na prawdę polecam Eclipsa tym bardziej, że zdaje mi się, że kolega ma fajną płytkę DVD z preinstalowaną już wersją ;)
REKLAMA