Skip to content

cyw43_arch_init() gets stuck #2728

@avey3421

Description

@avey3421

I am trying to make an lcd display show the current time

Since the pico has its own rtc and time.h does not return the actual time, i want to set up Wifi so i get the epoch time from a website, i create a C/C++ project from the raspberry pi pico extention with the option of onboard LED, my code gets stuck on cyw43_arch_init() (infinite loop?)

my code is:


#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/cyw43_arch.h"
#include <string.h>
#include <stdlib.h>
#include "hardware/rtc.h"

#define data_out_port_0 6
#define data_out_port_1 7   
#define data_out_port_2 8
#define data_out_port_3 9
#define data_out_port_4 10
#define data_out_port_5 11
#define data_out_port_6 12
#define data_out_port_7 13
#define rw_port 16
#define e_port 18
#define rs_port 17



typedef struct{
    int DATA0, DATA1, DATA2, DATA3,
        DATA4, DATA5, DATA6, DATA7,
        RW, RS, E,character_count;  
}LCD;
void write_data(){  
    gpio_put(rs_port, 1);
    gpio_put(rw_port, 0); 
    gpio_put(e_port, 1);
    sleep_ms(15);
    gpio_put(e_port, 0);
}


void setup(LCD *lcd){
    lcd->character_count = 0;
    lcd->DATA0 = data_out_port_0;
    lcd->DATA1 = data_out_port_1;
    lcd->DATA2 = data_out_port_2;
    lcd->DATA3 = data_out_port_3;
    lcd->DATA4 = data_out_port_4;
    lcd->DATA5 = data_out_port_5;
    lcd->DATA6 = data_out_port_6;
    lcd->DATA7 = data_out_port_7;
    lcd->RW = rw_port;
    lcd->RS = rs_port;
    lcd->E = e_port;
    //init output ports
    for (int i = data_out_port_0; i <= data_out_port_7; i++) {
        gpio_init(i);
        gpio_set_dir(i, GPIO_OUT);
    }
    gpio_init(rw_port);
    gpio_set_dir(rw_port, GPIO_OUT);
    gpio_init(e_port);
    gpio_set_dir(e_port, GPIO_OUT);
    gpio_init(rs_port);
    gpio_set_dir(rs_port, GPIO_OUT);
}


void print_to_lcd(char* str,LCD *lcd){
    uint len = strlen(str);  
    // sending data to lcd
    uint32_t mask = 1<<data_out_port_0 | 1<<data_out_port_1 | 1<<data_out_port_2 | 1<<data_out_port_3 |
                    1<<data_out_port_4 | 1<<data_out_port_5 | 1<<data_out_port_6 | 1<<data_out_port_7;
    for (uint i = 0; i < len; i++) { 
        uint32_t data = str[i]<<6;
        gpio_put_masked(mask,data);
        write_data();
    }
    lcd->character_count += len;
}


void turn_on_display(LCD lcd){

     // appears to make lcd dimmer and 2 line display doesnt work with this
    // put 2 line mode first   
    
    gpio_put(e_port, 1);
    gpio_put(data_out_port_0, 0);
    gpio_put(data_out_port_1, 0);
    gpio_put(data_out_port_2, 0);
    gpio_put(data_out_port_3, 1); // this sets 2 line mode
    gpio_put(data_out_port_4, 1);
    gpio_put(data_out_port_5, 1);
    gpio_put(data_out_port_6, 0);
    gpio_put(data_out_port_7, 0);
    gpio_put(rw_port, 0);
    gpio_put(rs_port, 0);
    sleep_ms(15);
    gpio_put(e_port, 0);
    for (int i = data_out_port_0; i <= data_out_port_7; i++) {
        gpio_put(i, 0);
    }

    // display on, cursor on, blink off
    gpio_put(e_port, 1);
    gpio_put(data_out_port_0, 0);
    gpio_put(data_out_port_1, 1);
    gpio_put(data_out_port_2, 1);
    gpio_put(data_out_port_3, 1);
    for (int i = data_out_port_4; i<=data_out_port_7; i++) {
        gpio_put(i, 0);
    }
    gpio_put(rs_port, 0);
    gpio_put(rw_port, 0);
    sleep_ms(15);
    gpio_put(e_port, 0);
    for (int i = data_out_port_0; i<=data_out_port_3; i++) {
        gpio_put(i, 0);
    }     
}

void change_line(LCD *lcd){
    
    gpio_put(e_port, 1);
    gpio_put(data_out_port_0, 0);
    gpio_put(data_out_port_1, 0);
    gpio_put(data_out_port_2, 0);
    gpio_put(data_out_port_3, 1);
    gpio_put(data_out_port_4, 0);
    gpio_put(data_out_port_5, 1);
    gpio_put(data_out_port_6, 0);
    gpio_put(data_out_port_7, 1);
    gpio_put(rs_port, 0);
    gpio_put(rw_port, 0);
    sleep_ms(15);
    gpio_put(e_port, 0);

}

void clear(LCD lcd){
    gpio_put(e_port, 1);
    gpio_put(data_out_port_0, 1);
    for(int i = data_out_port_1 ; i <= data_out_port_7; i++){
        gpio_put(i, 0);
    }
    gpio_put(rs_port, 0);
    gpio_put(rw_port, 0);
    sleep_ms(15);
    gpio_put(e_port, 0);
}

void shift(LCD lcd){
    gpio_put(e_port, 1);
    gpio_put(data_out_port_2, 1);
    gpio_put(data_out_port_3, 1);
    gpio_put(data_out_port_4, 1);
    for(int i = data_out_port_5 ; i <= data_out_port_7; i++){
        gpio_put(i, 0);
    }
    gpio_put(rs_port, 0);
    gpio_put(rw_port, 0);
    sleep_ms(15);
    gpio_put(e_port, 0);

}

void cycle(LCD lcd,char *firstmessage,char *secondmessage){
    print_to_lcd(firstmessage, &lcd);
    change_line(&lcd);
    print_to_lcd(secondmessage, &lcd);
    sleep_ms(2000);
    for(int i = 0; i < 16; i++){
        shift(lcd);
        sleep_ms(800);
    }
    clear(lcd);
}

void shift_left(LCD lcd){
    gpio_put(e_port, 1);
    gpio_put(data_out_port_0, 0);
    gpio_put(data_out_port_1, 0);
    gpio_put(data_out_port_2, 0);
    gpio_put(data_out_port_3, 1);
    gpio_put(data_out_port_4, 1);
    for(int i = data_out_port_5 ; i <= data_out_port_7; i++){
        gpio_put(i, 0);
    }
    gpio_put(rs_port, 0);
    gpio_put(rw_port, 0);
    sleep_ms(15);
    gpio_put(e_port, 0);
    

}

void reverse_cycle(LCD lcd,char *firstmessage,char *secondmessage){
    print_to_lcd(firstmessage, &lcd);
    change_line(&lcd);
    print_to_lcd(secondmessage, &lcd);
    sleep_ms(1000);
    int scroll = strlen(firstmessage);
    for(int i = 0; i < 15; i++){
        shift_left(lcd);
        sleep_ms(750);
    }
    sleep_ms(1000);
    clear(lcd);
}

void check_for_special_date(datetime_t *t,char *special_message){
    if( t->day == 25 && t->month ==12 ){
        strcpy(special_message,"   Merry Xmas!");
    }
    else if( t->day == 1 && t->month ==1 ){
        strcpy(special_message," Happy New Year!");
    }
    else {
        strcpy(special_message,"    welcome!  ");
    }
}

void format(datetime_t *t, char* min, char* hour){
    char *mintemp = malloc(4*sizeof(char));
    char *hourtemp = malloc(4*sizeof(char));
    if (t->hour == 0){
        strcpy(hour,"0");
        strcat(hour,utoa(t->hour,hourtemp,10));
    }else {
        strcpy(hour,utoa(t->hour,hour,10));
    }
    if (t->min < 10){
        strcpy(min,"0");
        strcat(min,utoa(t->min,mintemp,10));
    }else strcpy(min,utoa(t->min,mintemp,10));
}




int main()
{
    LCD lcd;
    rtc_init(); 
    datetime_t t={
        .year  = 2025,
        .month = 12,
        .day   = 24,
        .dotw  = 5, 
        .hour  = 23,
        .min   = 59,
        .sec   = 57
    };
    setup(&lcd);
    turn_on_display(lcd);
    if (!rtc_set_datetime(&t)) return -1;
    sleep_ms(30);
    if (!rtc_get_datetime(&t)) return -1;


    // Initialise the Wi-Fi chip
    stdio_init_all();
    print_to_lcd("hello! ",&lcd);
    if (cyw43_arch_init()) {
        print_to_lcd("Wi-Fi init failed",&lcd);
        while(1){sleep_ms(1000);}
    }
    print_to_lcd("before connecting",&lcd);
    cyw43_arch_enable_sta_mode();
    char ssid[]="ssid";
    char pass[]="pass";
    if (cyw43_arch_wifi_connect_timeout_ms(ssid, pass, CYW43_AUTH_WPA2_AES_PSK, 1000)){
        print_to_lcd("connected!\n",&lcd);
    }
    print_to_lcd("error connecting",&lcd);
    while (true) {
        print_to_lcd("test",&lcd);
        sleep_ms(1000);
    }
}


cmake:

# Generated Cmake Pico project file

cmake_minimum_required(VERSION 3.13)

set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

# Initialise pico_sdk from installed location
# (note this can come from environment, CMake cache etc)

# == DO NOT EDIT THE FOLLOWING LINES for the Raspberry Pi Pico VS Code Extension to work ==
if(WIN32)
    set(USERHOME $ENV{USERPROFILE})
else()
    set(USERHOME $ENV{HOME})
endif()
set(sdkVersion 2.2.0)
set(toolchainVersion 14_2_Rel1)
set(picotoolVersion 2.2.0-a4)
set(picoVscode ${USERHOME}/.pico-sdk/cmake/pico-vscode.cmake)
if (EXISTS ${picoVscode})
    include(${picoVscode})
endif()
# ====================================================================================
set(PICO_BOARD pico_w CACHE STRING "Board type")

# Pull in Raspberry Pi Pico SDK (must be before project)
include(pico_sdk_import.cmake)

project(onboard_led C CXX ASM)

# Initialise the Raspberry Pi Pico SDK
pico_sdk_init()

# Add executable. Default name is the project name, version 0.1

add_executable(onboard_led onboard_led.c )

pico_set_program_name(onboard_led "onboard_led")
pico_set_program_version(onboard_led "0.1")

# Modify the below lines to enable/disable output over UART/USB
pico_enable_stdio_uart(onboard_led 0)
pico_enable_stdio_usb(onboard_led 0)

# Add the standard library to the build
target_link_libraries(onboard_led
        pico_stdlib)

# Add the standard include files to the build
target_include_directories(onboard_led PRIVATE
        ${CMAKE_CURRENT_LIST_DIR}
)

# Add any user requested libraries
target_link_libraries(onboard_led 
        pico_cyw43_arch_lwip_threadsafe_background
        hardware_rtc
        )

pico_add_extra_outputs(onboard_led)


thanks if someone knows how to fix this! this is my first project im pretty much new to everything

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions