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

Język C dla AVR, negacja portu dlaczego nie działa?

xamrex 10 Lut 2011 16:26 5551 6
  • #1 9131722
    xamrex
    Poziom 28  
    Witam,
    Zaczynam z C i mam mały problem,
    Bawię się ze zmianą stanów portów.
    Mam raki kod:
    
    #include <avr/io.h>
    #include <util/delay.h>   
    int main(void){
    DDRD = 0x80; // port d.7 jako wyjscie
    PORTD = 0x00;
    while(1){
    PORTD ^= 0x80; 
    _delay_ms(330); 
    
    }
    }
    

    No i dioda podłączona do portu D.7 sobie miga.

    Chciałem sobie teraz napisać coś takiego:
    
    #include <avr/io.h>
    #include <util/delay.h>   
    int main(void){
    DDRD = 0x80; // port d.7 jako wyjscie
    PORTD = 0x00;
    while(1){
    PORTD = 0x80; 
    _delay_ms(330); 
    
    PORTD = ~0x80; 
    _delay_ms(330); 
    }
    }
    

    I czegoś takiego nie można skompilwoać.

    Dokładnie chodzi o ta linijkę
    PORTD = ~0x80; Tutaj pojawia się błąd.
    Natomiast gdy tam coś takiego:
    PORTD &= ~0x80; to program się kompiluje.
    Dlaczego tak się dzieje?
  • #2 9131788
    piotrva
    VIP Zasłużony dla elektroda
    nie chcę od razu naskakiwać, ale bardzo poprosiłbym o treść błędu :D
  • #4 9131903
    Fredy
    Poziom 27  
    Ma być
    PORTD& = ~0x80 kasowanie bitu

    oraz PORTD| = ~0x80 ustawianie bitu

    Twój zapis powoduje że cały PORTD ma być zmieniony, zobacz czy wogóle cały PORTD ma ten procek. Kompilator ma problem z ustawieniem któregoś z pinów portu D, albo go nie ma, albo z jakiś innych powodów nie może go ustawić jako wyjście.
    Jeśli to jest ostrzeżenie to słusznie kompilator robi.
    Jaki masz procesor?
  • #5 9131921
    Konto nie istnieje
    Poziom 1  
  • #6 9131961
    xamrex
    Poziom 28  
    Fredy
    tak, portD jest 8 bitowy
    Jest atmega8

    atom1477, rzeczywiście to jest Ostrzeżenie.
    I da się to skompilować

    Ale dlaczego pojawia się taki błąd?
  • Pomocny post
    #7 9131965
    Andrzej__S
    Poziom 28  
    Oto, co pisze na ten temat avr-libc-user-manual:
    Cytat:

    This may be especially important when clearing a bit:
    var &= ~mask; /* wrong way! */
    The bitwise "not" operator (~) will also promote the value in mask to an int. To keep
    it an 8-bit value, typecast before the "not" operator:
    var &= (unsigned char)~mask;

    Użycie operatora ~ powoduje, że wartość 0x80 zostaje zmieniona na wartość 16-bitową typu integer (0x0080), czyli po zanegowaniu otrzymujemy 16-bitową wartość (0xFF7F), która nie pasuje do ośmiobitowego portu, więc powinna być jawnie rzutowana na typ unsigned char (lub uint8_t).
    
    PORTD = (uint8_t)~0x80;
    
REKLAMA