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

Jak zastąpić opóźnienia w asemblerze na C dla I2C w kursie EDW?

malpek 29 Lis 2011 17:03 933 3
REKLAMA
  • #1 10197630
    malpek
    Poziom 18  
    Posty: 307
    Pomógł: 20
    Ocena: 36
    Próbuje rozgryść I2C w C, ale napotkałem mały problem. W kursie EDW do opóźnień używane sż wstawki assemblera, którego ni w ząb nie rozumiem. Zastanawiałem się czy jest możliwość zastąpienia ich opóźnieniami pisanymi w C?
    // Funkcja dłuższych opóźnień
    #if I2C_nhalf < 3
    	// Nic
    #elif I2C_nhalf < 8
    	static void i2c_xdelay(void)
    	{
    		NOP();
    	}
    #else
    	#define I2C_delayloops (1+(I2C_nhalf-8)/3)
    	#if I2C_delayloops > 255
    		#error Przyspiesz - bo sie nie wyrabiam ;)
    	#endif
    	static void i2c_xdelay(void)
    	{
    		asm volatile( \
    			"delayus8_loop%=: \n\t"\
    			"dec %[ticks] \n\t"\
    			"brne delayus8_loop%= \n\t"\
    		: :[ticks]"r"(I2C_delayloops) );
    	}
    #endif //I2C_nhalf >= 3
    
    // Opóźnienia dla I2C
    static inline void i2c_hdelay(void)
    {
    #if I2C_nhalf < 1
    	return; // To jest funkcja inline, jeśli składa się tylko z "return" jest usuwana podczas optymalizacji
    #elif I2C_nhalf < 2
    	NOP();
    #elif I2C_nhalf < 3
    	asm volatile(
    		"rjmp exit%=\n\t"
    		"exit%=:\n\t"::);
    #else
    	i2c_xdelay();
    #endif	
    }
  • REKLAMA
  • #2 10197668
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2203
    Powiem szczerze, że ten kod jest naprawdę zakręcony. Po mnemonikach wnioskuję, że chodzi o AVR? Znajdź jakiś nowszy kurs. Swoją drogą I2C realizuje się sprzętowo i żadne opóźnienia nie są potrzebne. Opóźnienia masz też gotowe w avr/delay.h.
  • REKLAMA
  • #3 10198206
    Brutus_gsm
    Poziom 25  
    Posty: 728
    Pomógł: 49
    Ocena: 13
    W internecie można znaleźć dużo kodów, które są napisane "bardziej przyjaźnie". Np.
    http://mikrokontrolery.net/avr_c_09.htm
    Wystarczy przestudiować notę katalogową. Ten standard jest naprawdę prosty. Zresztą niektóre AVRy mają zaimplementowaną obsługę sprzętową, nazywa się to TWI (nazwa inna, ale to jest to samo).
  • #4 10198297
    malpek
    Poziom 18  
    Posty: 307
    Pomógł: 20
    Ocena: 36
    Dziekuję za pomoc. Już powoli rozumiem to, dzięki ksaiążce Pana Mirka. Z kursem z EDW bardzo fajnie mi sie pracuje, ale jest on potraktowany dosyć skrótowo. Ale wszelkie diagramy itp rzeczy pozwalają o wiele szybciej coś zrozumieć i to jest duży plus tego kursu.
    Temat zamykam.
REKLAMA