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

[At90S2313] [C] VMLab - Problem ze stopniem optymal. kodu.

Pawel1812 10 Paź 2008 20:33 1642 3
  • #1 5619257
    Pawel1812
    Poziom 26  
    Witam
    Piszę swój pierwszy program na AT90S2313. Program ma za zadanie obsługiwać LCD. Problem się jednak pojawił na początku. Jeśli opóźnienie zostanie wywołane jako procedura:
    
    void czekaj(void)
     {
     _delay_ms(10);
     }
    

    zostaje ona całkowicie zignorowana:
    
    * my_idea.c, line 35:  warning: statement with no effect
    

    Natomiast, jeśli się umieści w linii programu, to opóźnienie się pojawi dla dalszej części programu przestaje działać animacja kodu, koło kolejnych poleceń nie są stawiane kwadraciki, i nie widać, co jest wykonywane, a kod assemblerowy nie jest opisywany poleceniami języka C.
    Czy wie ktoś, czym takie zachowanie symulatora jest spowodowane?
    Zależy mi na VMLAB ze względu na oscyloskop i symulacje LCD - bardzo pomocne dla początkującego.
    Z góry dziękuję za jakąkolwiek pomoc.

    Powstały fragment programu wygląda tak:
    
    #define F_CPU 4000000
    #include <c:\winavr\avr\include\util\delay.h>
    #include <c:\winavr\avr\include\avr\io.h>
    #include <c:\winavr\avr\include\avr\pgmspace.h>
    #include <c:\winavr\avr\include\stdlib.h>
    #include <c:\winavr\avr\include\avr\sfr_defs.h>
    #define    PRG_RDB(addr)   pgm_read_byte(addr)
    #define lcd_rs 2             //definicja bitu portu dla linii RS
    #define lcd_e 3              //definicja bitu portu dla linii E
    #define CR 0x0a              //definicja znaku CR (przejście do nowej linii)
    #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) //definicja cbi
    #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
    
    
     void czekaj(void)
     {
     _delay_ms(10);
     }
    
     int main(void) //program główny
    {
       unsigned char i;
     
     //>>>>>>>>>>>>>>>>>>>>    konfigurowanie portów <<<<<<<<<<<<<<<<<<<<<<<<<<
     PORTD=0xff;   //port z podciąganiem
     PORTB=0xff;   //port z podciąganiem
     DDRD=0xff; //PORTD - we
     DDRB=0xff; //PORTB - wy
      cbi(PORTD,lcd_rs);
      sbi(PORTD,lcd_e);
       czekaj;   // ignorowane opóźnienie po włączeniu
       // _delay_ms(5);
    
      PORTB=0x30;  // wysłanie komendy 0x30 po raz pierwszy
      asm("nop");    // wydłużenie impulsu
      asm("nop");
      asm("nop");
      cbi(PORTB,lcd_e);   // impuls strobujący
        _delay_ms(5);    // opóźnienie po którym VMLAB nie pokazuje
        cbi(PORTD,lcd_rs);  //że wykonywane są na przykłąd te 
         sbi(PORTD,lcd_rs);   //przykładowwe instrukcje
        cbi(PORTD,lcd_rs);
        sbi(PORTD,lcd_rs);
       
       while(1)
             {
             }
    }
    
  • Pomocny post
    #2 5619277
    BoskiDialer
    Poziom 34  
    Widać nawyki z pascala/delphi: wywołanie funkcji, nawet bez parametrów, wymaga podania nawiasów:
    sbi(PORTD,lcd_e); 
    czekaj(); // <<-- nawiasy!!
    // _delay_ms(5);

    Bez nawiasu uzyskujemy adres funkcji, przydatne przy przypisaniach do zmiennych funkcyjnych. Komunikat składnia bez efektu oznacza tyle samo, jak by w miejscu podać samą wartość bez przypisania jej - bo tutaj podajesz samą wartość, nie wywołujesz funkcji.
  • #4 5619320
    Pawel1812
    Poziom 26  
    Dziękuje za pomoc, faktycznie po wprowadzeniu nawiasu funkcja nie jest ingorowana, natomiast kwadraciki przy poszczególnych komendach poniżej funkcji opóźnienia się nie pojawiają i dalej nie ma animacji kodu:( Do funkcji opóźnienia jest animacja i opis komend języka C przy kodzie assemblerowym. A poczatkującemu by się to bardzo przydało.

    Problem najlepiej pokazuje screen:
    [At90S2313] [C] VMLab - Problem ze stopniem optymal. kodu.

    A może istnieje inna metoda wygenerowania odpowiedniego opóźnienia?

    Problem rozwiązało zmniejszenie stopnia optymalizacji kodu, ale tylko jeśli _delay_ms(10) wywołamy z procedury. Niestety, spowodowało także zwracanie przez kompilator tego typu komuikatów:
    
    [PC = $0041, Time =    0.53 ms, {MEM}]: Indexed read from a I/O space register? Address = $0032
    

    Pod adresem $0041 PC stoi komenda:
    
    ld R24, Z
     

    Który to likwiduje zwiększenie stopnia optymalizaji :( Czy program może pracować z takim błędem?
    Przestaję już rozumieć, o co temu kompilatorowi chodzi - przecież program jest prościutki, tu chyba trudno o jakiś błąd.
REKLAMA