• Email
  • Forum

Dyrektywa kompilatora #IF

Pozwala określić co kompilujemy, a co nie i szybko przełączać się pomiędzy różnymi konfiguracjami sprzętowymi.

Jeśli w naszej płytce uruchomieniowej, testowej czy jak zwał tak zwał, mamy inaczej podpięty wyświetlacz niż w docelowym projekcie. Jeśli "wypuszczamy" różne wersje, np. z wyswietlaczem lub bez, z enkoderem lub na przyciskach...Jeśli w docelowym urządzeniu czegoś ma nie być ze względu na małą pojemność pamięci, a np. debugujemy przy pomocy wyswietlacza. Jeśli pracujemy na innym procesorze w którym inaczej nazywają się rejestry..to możemy się łatwo między nimi przełączać.
Wystarczy zadeklarować stałą którą warunkiem sprawdza kompilator podczas kompilowania. Przykłady chyba najlepiej to wyjaśnią.

Zwróć tylko uwagę na to, że nie ma odstępu w wyrażeniu #endif.

Trzy różne płytki i trzy różne i różnie podłączone wyświetlacze:
'konfiguracja = 1 = BARTek test board
'konfiguracja = 2 = BARTek sterownik
'konfiguracja = 3 = Mirley UPT M16

Const Konfiguracja = 2

#if Konfiguracja = 1
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.0 , Rs = Portc.0
Config Lcd = 20x4                                           'nowy typ zapisu
#endif
#if Konfiguracja = 2
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.0 , Rs = Portb.1
Config Lcd = 16x2                                           'nowy typ zapisu
#endif
#if Konfiguracja = 3
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16x2                                           'nowy typ zapisu
#endif

#if Konfiguracja = 3
Config 1wire = Pind.2
#else
Config 1wire = Pind.5
#endif
		
Dwa różne procesory. Ten sam Timer ale ma różniące się nazwy rejestrów:
Const Atmega328 = 0
'second ATmega8
#if Atmega328 = 1
Config Timer2 = Timer , Async = Off , Prescale = 256 , Compare_a = Disconnect , Compare_b = Disconnect , Clear Timer = 1
Enable Compare2a : On Compare2a Timer2_isr : Compare2a = 124
#else
Config Timer2 = Timer , Prescale = 256 , Compare = Disconnect , Clear Timer = 1
Enable Compare2 : On Compare2 Timer2_isr : Compare2 = 124
#endif

Opcjonalny wyświetlacz. Kod bez niego jest dużo krótszy.
Const Lcd_on_board = 1
'NOTE THAT LCD IS FOR TRAINING ONLY :D
#if Lcd_on_board = 1
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
Config Lcd = 16 * 2
Cursor Off Noblink
Cls
#endif

Do
... kod programu
Case 4
   If Encoder_sw = 0 Then
   #if Lcd_on_board = 1
    Locate 2 , 1 : Lcd "Open"
   #endif
    Reset Rygiel
    Safe = 2
    Tryb = 1
    Sounds = 0
   End If
... kod programu
Loop
End

Int_10ms:
#if Lcd_on_board = 1
Incr Divider2
If Divider2 = 10 Then
Locate 1 , 1 : Lcd Tick ; " " ; Tryb ; " " ; Safe
Divider2 = 0
End If
#endif	
Email

Jeśli mogę w czymś pomóc, napisz.