interrupt

algemene C code
Berichten: 52
Geregistreerd: 15 Mei 2015, 22:07

interrupt

Berichtdoor trix » 24 Mrt 2023, 20:06

hallo,

ik heb een interrupt nodig, maar weet niet goed hoe dit te doen.
ik ben een programma aan het maken waarin gebruik word van een HMI (een nextion touch screen).
die HMI stuurt zijn commando's naar de uart van de raspberry pi pico.
nu wil ik, ongeacht waar ik ergens in het programma ben altijd die uart uit lezen als daar wat op verschijnt.
dus ik zit b.v. ergens in een while loop die nog niet klaar is, en ik druk een knop op de HMI dan ga ik eerst die uart uitlezen.
hier heb ik dus een interrupt voor nodig.

bestaat hier een interrupt voor ?
tnx.

Advertisement

Berichten: 80
Geregistreerd: 02 Nov 2022, 13:03

Re: interrupt

Berichtdoor ThHe » 25 Mrt 2023, 01:32

Bij dit soort interrupt in C moet je werken met thread. Lastig om direct te beschrijven maar het komt erop neer dat je meerdere onderdelen in je programma naast elkaar kan laten runnen.
Advies: google op de tekst: "Thread in C example" en als je er helemaal niet uit komt, want het blijft een lastige materie, dan stel je gewoon de volgende vraag.
Succes!!

Berichten: 52
Geregistreerd: 15 Mei 2015, 22:07

Re: interrupt

Berichtdoor trix » 25 Mrt 2023, 08:24

ga ik bekijken, bedankt.

Berichten: 52
Geregistreerd: 15 Mei 2015, 22:07

Re: interrupt

Berichtdoor trix » 26 Mrt 2023, 19:12

is inderdaad best lastig, is dit echt niet mogelijk met een interrupt ?
het maakt het een stuk overzichtelijker.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: interrupt

Berichtdoor shooter » 26 Mrt 2023, 20:00

ja hoor ik beschrijf het even op een arduino maar ook op enn rpi moet dat kunnen, als je in de loop schrijft if serial available en dan heb je al een hulpfunctie, je kunt ook je pin waar je een interupt op wilt knopen aan een interupt ingang en als de interupt verschijnt ga jij naar je nextion routine.
paul deelen
shooter@home.nl

Berichten: 52
Geregistreerd: 15 Mei 2015, 22:07

Re: interrupt

Berichtdoor trix » 27 Mrt 2023, 07:00

tnx.

in de while loop "if serial available" zou wellicht kunnen werken, maar dat moet je dan in elke "blocking" loop doen.

je kunt ook je pin waar je een interupt op wilt knopen aan een interupt ingang en als de interupt verschijnt ga jij naar je nextion routine.

die vat ik niet, of bedoel je de Rx pin van de UART aan een interrupt ?

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: interrupt

Berichtdoor shooter » 27 Mrt 2023, 10:20

ja dat bedoel ik maar ken de RPI niet genoeg hiervoor
paul deelen
shooter@home.nl

Berichten: 52
Geregistreerd: 15 Mei 2015, 22:07

Re: interrupt

Berichtdoor trix » 27 Mrt 2023, 11:11

dat zal inderdaad wel werken, kost alleen een extra pin.
tnx.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: interrupt

Berichtdoor shooter » 27 Mrt 2023, 16:16

if uart.any heb ik gevonden voor je dus helemaal geen interupt nodig hoor. je moet toch wachten tot een byte binnen is.
paul deelen
shooter@home.nl

Berichten: 62
Geregistreerd: 05 Feb 2023, 13:30

Re: interrupt

Berichtdoor sterretjeToo » 29 Mrt 2023, 05:54

trix schreef:tnx.

in de while loop "if serial available" zou wellicht kunnen werken, maar dat moet je dan in elke "blocking" loop doen.



De beste oplossing is om geen blokkerende loops te gebruiken; blokkerende loops zijn loops waar delay() inzit of die heel erg vaak (miljoenen keren, op de pi pico misschien miljarden keren) doorlopen moeten worden.

Een simpel voorbeeld gebaseerd op blink waarbij het interval gevarieerd kan worden van 1 to 9 seconden.

Code: Alles selecteren
const uint8_t pinLed = LED_BUILTIN;

void setup()
{
  Serial.begin(115200);
  while (!Serial)
    ;
  Serial.println(F("Non-blocking demo"));

  pinMode(pinLed, OUTPUT);
}

void loop()
{
  // default delay time
  static uint32_t blinkInterval = 1000;
 
  // status of the led
  static uint8_t ledStatus = LOW;

  // check if user wants to change the delay time
  if (Serial.available())
  {
    char c = Serial.read();
    if (c >= '1' && c <= '9')
    {
      blinkInterval = (c - '0') * 1000;
      Serial.print(F("Interval set to "));
      Serial.println(blinkInterval);
    }
  }

  // blink
  ledStatus = !ledStatus;
  digitalWrite(pinLed, ledStatus);
  delay(blinkInterval);
}


In de eerste stap zetten we de blokkerende blink in een functie.

Code: Alles selecteren
const uint8_t pinLed = LED_BUILTIN;

void setup()
{
  Serial.begin(115200);
  while (!Serial)
    ;
  Serial.println(F("Non-blocking demo"));

  pinMode(pinLed, OUTPUT);
}

void loop()
{
  // default delay time
  static uint32_t blinkInterval = 1000;
 
  // check if user wants to change the delay time
  if (Serial.available())
  {
    char c = Serial.read();
    if (c >= '1' && c <= '9')
    {
      blinkInterval = (c - '0') * 1000;
      Serial.print(F("Interval set to "));
      Serial.println(blinkInterval);
    }
  }

  // blink
  blink(blinkInterval);
}

/*
  blink led
  In:
    blink interval
*/
void blink(uint32_t blinkInterval)
{
  // status of the led
  static uint8_t ledStatus = LOW;

  ledStatus = !ledStatus;
  digitalWrite(pinLed, ledStatus);
  delay(blinkInterval);

}


We kunnen nu de blink() functie veranderen en de delay() vervangen door een millis() gebaseerde benadering

Code: Alles selecteren
const uint8_t pinLed = LED_BUILTIN;

void setup()
{
  Serial.begin(115200);
  while (!Serial)
    ;
  Serial.println(F("Non-blocking demo"));

  pinMode(pinLed, OUTPUT);
}

void loop()
{
  // default delay time
  static uint32_t blinkInterval = 1000;

  // check if user wants to change the delay time
  if (Serial.available())
  {
    char c = Serial.read();
    if (c >= '1' && c <= '9')
    {
      blinkInterval = (c - '0') * 1000;
      Serial.print(F("Interval set to "));
      Serial.println(blinkInterval);
    }
  }

  // blink
  blink(blinkInterval);
}

/*
  blink led
  In:
    blink interval
*/
void blink(uint32_t blinkInterval)
{
  // status of the led
  static uint8_t ledStatus = LOW;
  // last time that the LED was updated
  static uint32_t lastUpdatetime;

  // if it's time
  if (millis() - lastUpdatetime >= blinkInterval)
  {
    // remember the time
    lastUpdatetime = millis();
    // toggle the LED
    ledStatus = !ledStatus;
    digitalWrite(pinLed, ledStatus);
  }
}


Uiteraard is jouw code gecompliceerder maar de truc is om voor iedere functionaliteit een functie te schrijven en die functies vanuit loop aan te roepen; iedere functie moet je veranderen naar een niet-blokkerede versie; dat is nu misschien nu een beetje veel werk als je programma al bijna klaar is.

Als je dit allemaal al wist, sorry.

Ik ben niet bekend met de pi pico dus dit is geschreven voor een AVR (Arduino Leonardo).

Volgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 5 gasten