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

STM32 Discovery one-wire. W zmiennych od temperatury są same zera.

maccek 27 Kwi 2011 15:48 5012 3
  • #1 9444664
    maccek
    Poziom 2  
    Witam, chcę podłączyć termometr ds18b20 do mojego STM'a. Wzorując się na przykładzie pod AVR'a chciałem napisać swoją bibliotekę obsługującą one-wire.
    Niestety po załadowaniu programu w zmiennych, w których powinna być temperatura znajdują się same jedynki. Może ktoś wie co może być przyczyną?
    Opóźnienia zostały sprawdzone na oscyloskopie i są w porządku.

    Z góry dziękuję za pomoc.

    Biblioteka:
    
    unsigned char oow_reset()
    {
    	unsigned char presence;
    	GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_RESET);
    	oow_pin_out();
    	delay_us(500);
    	oow_pin_in();
    	delay_us(45);
    	if(IS_GPIO_BIT_ACTION(Bit_RESET))
    	{
    		presence = 1;
    	}
    	else
    		presence = 0;
    
    	delay_us(470);
    	return presence;
    }
    
    void  oow_write_bit(char cBit)
    {
    	oow_pin_out();
    	delay_us(5);
    	if(cBit == 1)
    		oow_pin_in();
    	delay_us(80);
    	oow_pin_in();
    }
    
    unsigned char oow_read_bit()
    {
    	unsigned char ucBit;
    
    	GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_RESET);
    	oow_pin_out();
    	delay_us(2);
    	oow_pin_in();
    	delay_us(15);
    	if(IS_GPIO_BIT_ACTION(Bit_SET))
    	{
    		ucBit = 1;
    	}
    	else
    		ucBit = 0;
    
    	return ucBit;
    }
    
    void oow_write_byte(char Byte)
    {
    	unsigned char licznik;
    	unsigned char wartosc;
    	GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_RESET);
    	for(licznik = 0; licznik<8; licznik++)
    	{
    		wartosc = Byte>>1;
    		wartosc &=0x01;
    		oow_write_bit(wartosc);
    
    		/*
    		oow_pin_out();
    		if(Byte & 0x01)
    		{
    			delay_us(7);
    			oow_pin_in();
    			delay_us(70);
    		}
    		else
    		{
    			delay_us(70);
    			oow_pin_in();
    			delay_us(7);
    		}
    		Byte>>=1;*/
    	}
    	delay_us(100);
    }
    
    unsigned char oow_read_byte()
    {
    	unsigned char licznik;
    	unsigned char byteToRead =0 ;
    	for(licznik = 0; licznik<8; licznik++)
    	{
    		if(oow_read_bit())
    			byteToRead |=(0x01<<licznik);
    		delay_us(25);
    
    		/*oow_pin_out();
    	    delay_us(7);
    		oow_pin_in();
    		delay_us(7);
    		byteToRead>>=1;
    		if(IS_GPIO_BIT_ACTION(Bit_SET))
    			byteToRead|=0x80;
    		delay_us(80);
    		*/
    	}
    	return byteToRead;
    }
    void oow_pin_out(void)
    {
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    
       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
       //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
       GPIO_Init(GPIOA, &GPIO_InitStructure);
       GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);
    }
    
    void oow_pin_in(void)
    {
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
       GPIO_Init(GPIOA, &GPIO_InitStructure);
       //GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);
    
    }
    
    Main:
    
    int main()
    {
    	unsigned char reset;
    	char tempH, tempL;
    	float fTemp;
    	STM32vldiscovery_LEDInit(LED3);
    	STM32vldiscovery_LEDInit(LED4);
    	delay_init();
    	oow_pin_in();
    	while(1)
    	{
    		reset = oow_reset();
    		if(reset == 1)
    		{
    			STM32vldiscovery_LEDOn(LED4);
    			oow_write_byte(0xCC);
    			oow_write_byte(0x44);
    			delay_ms(750);
    			reset = oow_reset();
    			oow_write_byte(0xCC);
    			oow_write_byte(0xBE);
    			tempH = oow_read_byte();
    			tempL = oow_read_byte();
    			reset = oow_reset();
    			STM32vldiscovery_LEDOff(LED4);
    			fTemp = (float)(tempL + (tempH<<8))/16;
    			delay_ms(200);
    		}
    		else
    		{
    			STM32vldiscovery_LEDOn(LED4);
    		}
    /*
    		GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_RESET);
    		delay_ms(200); //6.6ms
    		GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_SET);
    		delay_ms(200); //10ms*/
    	}
    	return 0;
    }
  • #2 9445546
    nsvinc
    Poziom 35  
    Twoim pierwszym, podstawowym i najgłupszym błędem są funkcje biblioteczne typu GPIO_WriteBit( ); IS_GPIO_BIT_ACTION(Bit_SET);....

    Ręce opadają.

    Przestań wykorzystywać w swoim kodzie tą bibliotekę, a najpewniej układ zacznie działać - a jeśli nie, to wtedy sam będę miał motywację i umiejętności do analizy tego kodu...

    PS
    Znacznik syntax nie zagnieżdża znacznika code. Wywal jeden z nich...
  • #3 9451512
    maccek
    Poziom 2  
    A mógłbyś podać przykład na co mam je zamienić?
  • #4 9459500
    saper_2
    Poziom 18  
    Potrzebujesz:
    " RM0041: STM32F100xx advanced ARM-based 32-bit MCUs " -> www.st.com
    To też będzie potrzebne:
    " DS6517: Low & medium-density value line, advanced ARM-based 32-bit MCU with 16 to 128 KB Flash, 12 timers, ADC, DAC & 8 comm interfaces "
    i to (zakładam ,że to chociaż już masz) :
    " UM0919: STM32VLDISCOVERY STM32 value line Discovery "

    I oczywiście znajomość operacji bitowych w C :)

    Piszesz ,że czasy są ok, ale jesteś w stanie sprawdzić całą transmisję czy tylko to co nadajesz?

    Poza tym coś mi się nie trawi toja proc do odczytu...
    to moje z avr'ów (działające) :
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    ow_delay generuje opóźnienie dokładnie x * 1us :)
    Zapomniałem dopisać, żebyś się nie przejmował komentarzami w moim kodzie ,gdyż jakoś nie mam motywacji do jego uporządkowania :)
REKLAMA