interrupt
13 berichten
• Pagina 1 van 2 • 1, 2
interrupt
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.
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
Re: interrupt
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!!
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!!
Re: interrupt
is inderdaad best lastig, is dit echt niet mogelijk met een interrupt ?
het maakt het een stuk overzichtelijker.
het maakt het een stuk overzichtelijker.
Re: interrupt
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
shooter@home.nl
Re: interrupt
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 ?
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 ?
Re: interrupt
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
shooter@home.nl
- sterretjeToo
- Berichten: 62
- Geregistreerd: 05 Feb 2023, 13:30
Re: interrupt
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).
13 berichten
• Pagina 1 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 1 gast