Rasberry PI PICO (RP2040) продолжение темы

Разобрался с использованием флага TXSTALL для проверки завершения работы ПИО программы. Оказывается, флаг сам не очищается. Один раз выставленный, он остается висеть всегда, или пока его не очистишь принудительно. Причем очистка флага до запуска программы не помогает - пока вы запихиваете первое значение в FIFO, флаг уже успевает выставится!
Вообще, было бы логично, если бы флаг сбрасывался при помещении в FIFO нового значения. Но почему-то авторы SDK этого не сделали.

Решение - принудительно очищать флаг при помещении в буфер FIFO новых данных. Сделал так - теперь все работает правильно.

Да, добавлю - очистка флага производится записью единицы в соответствующий бит:

void pio_sm_tx_fifo_stall_clear(PIO pio, uint sm) {
    pio->fdebug |= (1u << (PIO_FDEBUG_TXSTALL_LSB + sm)) ;
}
2 лайка

Оффтоп:
@MMM , если будет время - глянь вот этот код:

Меня интересует - почему нельзя в лупе регистры менять? Или я это не правильно делаю?

Пытаюсь подключить 16 кнопок к Pi Pico через CD74HC4067. Мультиплексор выдает по всем каналам рандомные значения, при этом показания могут быть на всём диапазоне от 0 до 1023, которые плавно то повышаются то понижаются. В чем беда? >.<


Все кнопки подключены


Синий земля, второй С0-С15.

В чем беда? \о/

#define S0 0
#define S1 5
#define S2 22
#define S3 21
#define SIG 26


void setup(){
  Serial.begin(9600);
  
  pinMode(S0, OUTPUT); 
  pinMode(S1, OUTPUT); 
  pinMode(S2, OUTPUT); 
  pinMode(S3, OUTPUT);   

  digitalWrite(S0, LOW);
  digitalWrite(S1, LOW);
  digitalWrite(S2, LOW);
  digitalWrite(S3, LOW);
  
}

void loop(){

  //Loop through and read all 16 values
  //Reports back Value at channel 6 is: 346
  for(int i = 0; i < 16; i ++){
//    Serial.print("Value at channel ");
//    Serial.print(i);
//    Serial.print(": ");
    Serial.print(readMux(i));
    Serial.print(". ");
    
  }
  Serial.println();
  delay(100);
}


int readMux(int channel){
  int controlPin[] = {S0, S1, S2, S3};

  int muxChannel[16][4]={
    {0,0,0,0}, //channel 0
    {1,0,0,0}, //channel 1
    {0,1,0,0}, //channel 2
    {1,1,0,0}, //channel 3
    {0,0,1,0}, //channel 4
    {1,0,1,0}, //channel 5
    {0,1,1,0}, //channel 6
    {1,1,1,0}, //channel 7
    {0,0,0,1}, //channel 8
    {1,0,0,1}, //channel 9
    {0,1,0,1}, //channel 10
    {1,1,0,1}, //channel 11
    {0,0,1,1}, //channel 12
    {1,0,1,1}, //channel 13
    {0,1,1,1}, //channel 14
    {1,1,1,1}  //channel 15
  };

  //loop through the 4 sig
  for(int i = 0; i < 4; i ++){
    digitalWrite(controlPin[i], muxChannel[channel][i]);
  }

  //read the value at the SIG pin
  int val = analogRead(SIG);

  //return the value
  return val;
}```

В подтяжке

Кнопки на cd74hc4067 вроде не нужно подтягивать, s0-s1 тоже не нужно. Пробывал выпаивать резистор на 10к на землю, потом на SIG. Эффекта ноль. Чего натянуть?

Хотя нашел ещё пример подтяжки который не пробывал)

с чего вы взяли?
Подумайте сами - когда у вас кнопка не нажата, у вас SIG получается никуда не подключен. А это значит, что он будет ловить все внешние наводки, как антенна и выдавать случайный шум.
Вот именно это у вас и происходит.

Вроде как в самой плате все подтянуто… И как быть? Я так понимаю все 16 кнопок запаять как на примере ниже? Кабзда вермишели будет…

начните со схемы, которую вы сами привели выше в #725
С ней все должно быть нормально. Не поможет - будете искать другие решения.

Только учитывайте, что с той схемой кнопки должны замыкаться на минус.

Штош наконец нашлось время спаять эту вермишель) пришлось использовать обе схемы. А есть идеи как устаканить значения без колебаний?) чтоб прям статично 0-1023 было) можно канеш для кнопок программно обрезать) но в схеме ещё 4 потенциометра и их точность значений прям хромает)

что это за цифры?

Это массив значений со всех 16 каналов мультиплексора которые идут к кнопкам и 4 потенцмометрам

судя по значениям, вы что-то напутали в схеме.

Да и фраза

как-то настораживает.
Нарисуйте, какая схема подключения получилась в итоге.

подтягивать надо к плюсу, а кнопки замыкать на землю

1 лайк

и да, если в схеме есть и кнопки и потенциометры, то либо придется подтягивать каждый канал отдельно (то есть схема из #725 не прокатит), либо поставить два мультиплексора - один для кнопок, другой для потенциометров

без резистора на мультиплексоре значения прям плавают и не ±5 а прям ±500, все работает и кнопки и потенмоментр, просто не стабильно) Массив значений на # 729 это каждая строчка со значениями всех каналов с интервалом delay(200); 990 это макксимально выкрученный ПОТ, а 396 стоит на середине) а да, еще я добавил строчку pinMode(SIG, INPUT); , а резисторы на 10к, думаю может для 3.3v надо было поменьше взять, или без разницы?)

Схема неправильная.

вы уверены, что не перепутали пины на кнопке?

В этой схеме вы должны использовать или резистор на кнопке, или общий на мультиплексоре, но НЕ ОБА СРАЗУ!
Если у вас с одним резистором не работает, значит вы подключили кнопку неверно.

Вот как нарисовал так и запаял) прям по ножкам и как то работает) без резистора на мульте даже если НИЧЕГО на каналы не вешать показания плавают вверх вниз, если приложить палец на пустые пины каналов то будут показывать все стабильно 0, но потом опять начинают плавать. Я пробывал запитывать и от платы, и отдельное питание для кнопок через стабилизатор. А да, ещё странный момент мультиметр показывает СТАБИЛЬНО 3.333v на пи пико, и на отдельном стабилизаторе ТОЖЕ ,НО на пинах vcc gnd мульта оно скачет 1.2-3.3v при этом хаотично и непостоянно скачет, хотя в порт значения приходят стабильные, как то так)

Слушайте, ну что вы тут какие-то “занимательные истории” рассказываете? Дело выеденного яйца не стоит. Вся задача - правильно подключить кнопки! при правильном подключении вы должны получить вполне определенные СТАБИЛЬНЫЕ цифры. По крайней мере с кнопок.

А если у вас даже VCC и GND “плавают” - ищите косяки. Или неверная схема, или, может непропай? Вы, вообще, который раз в жизни паяете?

Кстати резистор на мульте я нарисовал не правильно) ошибочно припаял его на EN ) убрал вообще) вы правы работает без него но точно также) почему то нижний порог не опускается ниже 4 а верхний не поднимается выше 990, ни на кнопках ни на потенцмоментрах.

Нуууу и касательно пайки) в) тут надо ещё понимать что и как я паяю) вот например вся эта куча работает четко!!! Но без мультиплексора =)

А вот эта куча которую я сейчас делаю с мультом троит чето

ну подскажите как ПРАВИЛЬНО подключить дураку)

Отличное фото, можно приблизить и рассмотреть все в деталях.

Когда приближаешь, отчетливо видно, что пропаяно плохо. Некоторые соединения явно не прогреты, на других мало флюса и или почти нет припоя. Сказать что более-менее нормально можно не больше чем про треть соединений.

То ли вы без флюса паяете (судя по полному отсутствию следов), то ли припой безсвинцовый и вы его не греете… а может просто не умеете.