Czy ktoś już robił w czystym C na tym SDK, maiłabym kilka podstawowych pytań
-- EDIT --
Oczywiście pod latarnią najciemniej
https://www.espressif.com/sites/default ... nce_en.pdf
Kod: Zaznacz cały
// struktura na dane wykorzystywane w funkcji
typedef struct
{
uint8 temp_H;
uint8 temp_L;
uint8 humi_H;
uint8 humi_L;
uint8 pos;
uint32 buff;
} T_dht11;
// Funkcja wyzwaljąca odczyt
void ICACHE_FLASH_ATTR
get_dth11(void)
{
dht11Data.pos = 0;
os_timer_disarm( &timer_dth11 );
os_timer_setfn( &timer_dth11, dht11_timer, 0 );
os_timer_arm( &timer_dth11, 18, 0);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);
GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 0);
}
// Callback do timera programowego
void ICACHE_FLASH_ATTR
dht11_timer(void* arg)
{
// GPIO jako wejscie
GPIO_DIS_OUTPUT( GPIO_ID_PIN(2) );
// przerwanie od przerwania (callback)
ETS_GPIO_INTR_DISABLE();
ETS_GPIO_INTR_ATTACH( gpio_interrupt_handle, 0 );
gpio_pin_intr_state_set( GPIO_ID_PIN(2), GPIO_PIN_INTR_ANYEDGE);
ETS_GPIO_INTR_ENABLE();
}
// Callback przerwania czyli odbieranie danych
void ICACHE_FLASH_ATTR
gpio_interrupt_handle(void)
{
uint8 h_time, l_time;
static uint32 lasttime;
uint32 tmptime;
uint16 gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status);
if( gpio_status & BIT(2) )
{
tmptime = system_get_time();
if( GPIO_INPUT_GET( BIT(2) ))
{
// narastające
l_time = tmptime - lasttime;
} else {
// opadające
h_time = tmptime - lasttime;
}
lasttime = tmptime;
// poczatek bitu (stan niski około 50us)
if ( l_time > 40 && l_time < 60 )
{
dht11Data.pos++;
dht11Data.buff = (dht11Data.buff << 1);
os_printf(" NB ");
}
if( dht11Data.pos )
{
// bit 0 (jesli stan wysoki około 20us)
if( h_time > 18 && h_time < 30 )
{
os_printf("0:[%d] ", dht11Data.pos);
}
// bit 1 (jeśli stan wysoki około 70us)
if ( h_time > 62 && h_time < 78 )
{
dht11Data.buff |= 1;
os_printf("1:[%d] ", dht11Data.pos);
}
}
// odebranie "sygnału startowego" około 80 us po nim lecą już bity z danymi
if( !dht11Data.pos && h_time > 80 && h_time < 93)
{
dht11Data.pos = 1;
dht11Data.buff = 0;
os_printf("\n\rSYNC: ");
}
}SYNC: 0:[1] 0:[1] 1:[1] 0:[1] 0:[1] 1:[1] 0:[1] 0:[1] 0:[1] 0:[1] 0:[1] 0:[1] 0:[1] 0:[1] 0:[1] 0:[1] 0:[1] 0:[1] 0:[1] 1:[1] 1:[1] 0:[1] 0:[1] 0:[1] 0:[1] 0:[1] 1:[1]
Kod: Zaznacz cały
void ICACHE_FLASH_ATTR
get_dth11(void)
{
os_printf("\nBits: %d \n", dht11Data.pos);
os_printf("H: %d,%d T: %d,%d CRC: %d\n", dht11Data.humi_H, dht11Data.humi_L, dht11Data.temp_H, dht11Data.temp_L, dht11Data.crc);
dht11Data.pos = 0;
os_timer_disarm( &timer_dth11 );
os_timer_setfn( &timer_dth11, dht11_timer, 0 );
os_timer_arm( &timer_dth11, 18, 0);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);
GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 0);
}
void ICACHE_FLASH_ATTR
dht11_timer(void* arg)
{
// GPIO jako wejscie z pullup-em
GPIO_DIS_OUTPUT( GPIO_ID_PIN(2) );
ETS_GPIO_INTR_DISABLE();
ETS_GPIO_INTR_ATTACH( gpio_interrupt_handle, 0 );
gpio_pin_intr_state_set( GPIO_ID_PIN(2), GPIO_PIN_INTR_NEGEDGE);
ETS_GPIO_INTR_ENABLE();
}
void ICACHE_FLASH_ATTR
gpio_interrupt_handle(void)
{
uint8 l_time;
static uint32 lasttime;
uint32 tmptime;
uint16 gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status);
if( gpio_status & BIT(2) )
{
tmptime = system_get_time();
l_time = tmptime - lasttime;
lasttime = tmptime;
if( !dht11Data.pos && l_time > 158 && l_time < 178)
{
dht11Data.pos = 1;
dht11Data.buff = 0;
}
if(dht11Data.pos)
{
if ( l_time > 70 && l_time < 80 )
{
dht11Data.pos++;
dht11Data.buff = (dht11Data.buff << 1);
}
if ( l_time > 110 && l_time < 130 )
{
dht11Data.pos++;
dht11Data.buff = (dht11Data.buff << 1);
dht11Data.buff |= 1;
}
}
if( dht11Data.pos == 33 )
{
dht11Data.humi_H = (dht11Data.buff >> 24);
dht11Data.humi_L = (dht11Data.buff >> 16);
dht11Data.temp_H = (dht11Data.buff >> 8);
dht11Data.temp_L = (uint8) (dht11Data.buff);
}
if( dht11Data.pos == 41 )
{
ETS_GPIO_INTR_DISABLE();
gpio_pin_intr_state_set( GPIO_ID_PIN(2), GPIO_PIN_INTR_DISABLE);
ETS_GPIO_INTR_ENABLE();
dht11Data.crc = (uint8) (dht11Data.buff);
}
}
}Bits: 41
H: 34,0 T: 25,0 CRC: 59
Bits: 41
H: 34,0 T: 25,0 CRC: 59

Kod: Zaznacz cały
typedef struct {
uint16 data;
int8 pos;
} T_rc5_data;
void ICACHE_FLASH_ATTR
rc5_send(uint8 addr, uint8 data)
{
static T_rc5_data *tmpdata = &rc5Data;
static uint8 tog;
tog = tog^1;
tmpdata->data = (tog << 11) | (addr << 6) | data;
tmpdata->data |= 0x3000;
tmpdata->pos = 13;
//Timer dla RC5
hw_timer_init(0, 0);
hw_timer_set_func( rc5_count );
hw_timer_arm(10);
}
void rc5_count(void)
{
static uint8 licznik = 124;
static T_rc5_data * pdata = &rc5Data;
uint8 bit = ( pdata->data >> pdata->pos );
if( licznik-- && (bit & 0x01) )
{
if(licznik<63)
{
GPIO_OUTPUT_SET(GPIO_ID_PIN(5), licznik%2);
}
} else {
if(licznik>63)
{
GPIO_OUTPUT_SET(GPIO_ID_PIN(5), licznik%2);
}
}
if( !licznik )
{
licznik = 124;
GPIO_OUTPUT_SET(GPIO_ID_PIN(5), 0);
pdata->pos--;
}
if( pdata->pos > -1 )
{
hw_timer_arm(10);
} else {
GPIO_OUTPUT_SET(GPIO_ID_PIN(5), 0);
}
}Wróć do „Inne mikroklocki, również peryferyjne”
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość