raspberry pico - micro python - thonny.

ik wil binnen een functie ongeveer 10 Kbyte aan data opslaan.
die data wil ik buiten die zelfde functie bewerken.
hoe krijg ik die data buiten die functie ?
dat hoeft denk ik niet via return.
of sla je die data op een "speciale plek" op ?

Als je een functie maakt waar 10kbyte aan data in zit dan kan je al deze data in de functie zelf beheren.
Via invoer en uitvoer die je in de functie maakt kan je dan gegevens met de functie uitwisselen. Maar je kan dan ook een in de functie de code schrijven dat je de complete inhoud kan uitvoeren.

Ik hen dat zelf in C++ geleerd maar ik denk dat het in python ook zo werkt.

Een ander word voor functie is een object of librarie. Veel libraries doen hetzelfde bv een lib voor een stappen motor. Tegen de lib wat eigenlijk een functie is zeg je dan stepper.move(1000) en de stepper gaat 1000 stapje bewegen. De richting bepaal je dan bv met stepper.dir(forward).

stepper is de functie
.move is een member van deze functie
.dir is een andere member van deze functie.

Zo beschrijf je in de functie dan wat elke member precies moet doen.

Hoe je dat precies in python moet dan zal je ergens via een tutorial oid kunnen vinden.
Zelf werk ik graag met Udemy dat is een opleidingswebsite waar je 1000den cursuusen kan vinden die kwalitatief meestal een heel stuk beter zijn dan op youTube. De cursus is vaak niet gratis maar ze zijn nu ook niet echt duur. En je krijgt een certificaat dat staat weer leuk op je CV.

[Bericht gewijzigd door benleentje op (29%)]

Data gewoon globaal houden?

udemy ken ik, ik heb daar een paar cursussen gedeeltelijk gevolgd, probleem is dat het vaak in erg gebrekkig engels gaat (Indiërs die engels praten),
de vertaling die je kan inschakelen, kan er ook niks van maken :)

data globaal houden gaat niet (eenvoudig), de data word binnengehaald tijdens het bewegen van een stepper motor, en die word in een functie aan gestuurd.
voorop gesteld ik weet na genoeg niets van geheugens en dergelijke, maar ik had gedacht (& gehoopt) als je die data in b.v. RAM of flash schrijft, dat die later vanaf iedere plek weer op te halen was.

edit:
ik ga er nog eens over nadenken, mischien dat ik het op een andere manier kan doen.
Tnx.

Je kunt het beste een class maken of gebruiken.

Dan heb je in de class methods die data kunnen schrijven en lezen.

Maar wat je wilt is waarschijnlijk een gewone lijst opslaan van gegevens, dat soort classes zijn al te kust en te keur gemaakt in zo ongeveer alle programmeertalen.

De algemene naam van zo'n "ding" voor opslag noemt men een "container class".

Bijvoorbeeld je hebt fifo's, lists, arrays, maps, random access storage etc.
Dus afhankelijk wat je wilt pak je zo'n voorgedefinieerde class en gebruik je die via de methods die erbij horen. Ieder soort container heeft zijn voor en nadelen. Dat is een kwestie van opzoeken welke methods (functies dus) er in zitten.

Hoe dat exact in (micro)python gaat weet ik niet. Ik heb geprobeerd zoveel mogelijk python te mijden in mijn carrieere.

Python heeft wat andere namen voor sommige classes als C++ (hash->dictionary bijvoorbeeld). Dus soms moet je even zoeken welke class het beste bruikbaar is.

.. dubbel PC crash met een blauw scherm

[Bericht gewijzigd door benleentje op (93%)]

voorop gesteld ik weet na genoeg niets van geheugens en dergelijke, maar ik had gedacht (& gehoopt) als je die data in b.v. RAM of flash schrijft, dat die later vanaf iedere plek weer op te halen was.

Maar dat is een totaal andere vraag. IK dacht dat je in dezelfde software de data wou kunnen uitlezen.

Als je data naar een SD kaart schrijft dan kan je precies zeggen naar welk adres die data moet. Als je die adressen weet kan je dat met iets anders ook weer uitlezen

Op de SD kaart kome dan files te staan en in die files staat de data op de adressen zoals je ze het hebt weggeschreven.

probleem is dat het vaak in erg gebrekkig engels gaat (Indiërs die engels praten),

Ik heb tot nu toe enkel nog Amerikanen gehad. Maar er zijn er zoveel aanbieders en dan neem je toch een andere cursus die wel goed engels spreekt.

Maar of je nu de data in een functie + software wilt opslaan op SD kaart allebei goed te doen. Ik heb ook met 0,0 ervaring mijn eigen class = functie geschreven die de in en uitvoer naar een SD kaart deed.

[Bericht gewijzigd door benleentje op (11%)]

Zoals Arco noemt je maakt een globale variabele aan. Die kan je vervolgens in elke functie gebruiken.

Als je de data in een andere proces nodig hebt. Na reboot of er start iets anders op dat toegang heeft tot dezelfde kaart dan moet je het ergens wegschrijven, zoals een SD kaart.

Maar wat ik begrijp heb je dat helemaal niet nodig, je moet je gewoon een globale variabele, bijvoorbeeld list als eerste definiëren en die kan je overal gebruiken.


#globals
friends = [ 'kees','jan','piet']

#functions
def myfunc():
  print(friends)

def myfuncB(gozer):
	friends.insert(2,gozer)
    
def byebye():
	friends.clear()
	print("goodbye buddies")

#main
    
myfunc()

myfuncB('klaas')

print(friends)

byebye()

myfunc()

OUtput:


['kees', 'jan', 'piet']
['kees', 'jan', 'klaas', 'piet']
goodbye buddies
[]

ik ga het een en ander bekijken, bedankt voor de input.

Ah alles in globals duwen
De volgende valkuil waar elk beginnend programmeur doorheen moet

ik had net een nieuwe python vraag gesteld, maar dat mag blijkbaar niet (slotje op de topic).
alle python vragen zullen wel in dit topic moeten, maakt niet uit.....dan doen we dat ;)

ze hebben zelfs de topic titel aangepast :D

raspberry pico
micro python
thonny

ik moet eigenlijk een event interrupt hebben, maar ik vind alleen voorbeelden van "push buttons" interrupts. die zal er toch wel zijn, hoop ik :/

die event is een positie teller waar ik bij elk 100-tal een interrupt wil triggeren

Ik zou denken als je de naam van het event weet je die naam als interrupt trigger moet gebruiken.

de naam van het event is een oplopende counter, probleem is ook een beetje dat ik nooit goed weet waar je dit kunt opzoeken, moet je dan zoeken in de manuals van de raspberry pi pico of van de RP2040, of micro python of die van thonny zou mischien ook nog kunnen :? :?

uiteraard is het altijd lastig om een oplossing voor te dragen, zonder exact te weten wat je wilt.
Jen hebt het over 10K aan stepper data. Ik denk dan al gelijk? hoeveel? waarom? wat ga je ermee doen? Is het echt allemaal relevante data?
Maar goed.
Er zijn in programmeer land 1000en oplossingen om het maar werkend te krijgen.
Een functie kun je een waarde terug laten geven met een return inderdaad.
Dat doe ik doorgaang met eenvoudige variabelen, dus een byte, word, whatever. Voor een structure vind ik dat persoonlijk al wat meer not done, maar who am I.
In het geval van wat complexere data geef ik dat soort waarden vaak terug "by reference"
Je geeft dan als argument een variabele mee, die de functie dan mag aanpassen. In C doe je dat met pointers, in python is het wat makkelijker.
Zie eens hier: https://www.geeksforgeeks.org/pass-by-reference-vs-value-in-python/of je daar iets van begrijpt.
Je kan inderdaad ook gewoon globale variabele gebruiken, maar ik vind persoonlijk dat functies geen globale variabelen moeten gebruiken. Een functie moet het liefst op zich zelf staan en geen magische globale variabelen verwachten.
Het is slechts een kleine moeite om deze globale variabele die je uiteraard wel nodig hebt by reference aan de functie mee te geven.

kleine side node, in python kun je wel wat makkelijker meerdere items returnen in een functie dmv een tuple.
Ik ben niet zo thuis in python en al helemaal niet in micropython, maar denk dat het allemaal wel beetje op hetzelfde neerkomt.

@ben Leentje
Een functie is geen class volgens mij. Een class is een gedefinieerde verzameling van functies (methods) en variabelen (members). Van een class kun je dan een object maken.

En over je event vraag.
Ik denk niet dat je pas een HW interrupt/event kan genereren elke 100 pulsen.
Het diee is dat je een interrupt hebt die elke puls getriggerd wordt. In die interrupt tel je tot je 100 pulsen hebt en dan doe je je ding.
Liever niet in die interrupt, maar dan zet je een vlaggetje dat je buiten de interrupt om je data processed. Maar dat hangt ervan af wat er moet gebeuren elke 100 pulsen.

Wat voor jouw vragen een uitkomst kan zijn is het gebruik van microsofts copilot. Als je edge als browser neemt en je drukt rechts boven op dat blauwe copilot icoontje, kun je daar gewoon je programmeer vraag stellen.
Die is behoorlijk goed voor python en brengt je in ieder geval in de juiste richting.

ik vroeg hem bijvoorbeeld: "
I have a pulse counter input and I would like to create an event/interrupt every time 100 pulses are counted on the input in micro python, Can you give me an example?"

hij stelt deze code voor:


from machine import Pin

# Define the pin connected to the pulse counter input
pulse_counter_pin = Pin('GP14', mode=Pin.IN, pull=Pin.PULL_UP)

# Initialize the pulse count
pulse_count = 0

def pulse_interrupt(pin):
    global pulse_count
    pulse_count += 1
    if pulse_count >= 100:
        # Trigger your desired action here (e.g., send a notification, toggle an output, etc.)
        print("100 pulses counted! Trigger your action here.")
        pulse_count = 0  # Reset the pulse count

# Attach the interrupt handler to the pulse counter pin
pulse_counter_pin.irq(handler=pulse_interrupt, trigger=Pin.IRQ_FALLING)

# Keep the program running
while True:
    pass

[Bericht gewijzigd door Stijnos op (25%)]

bedankt, ik lees het straks aandachtig door, ben nu aan het werk.
voor alle duidelijkheid, het is een interne software puls waar van ik bij iederen 100 pulsen een interrupt nodig heb. dus geen pulsen op een input of zo.

Is het dan nog een interrupt?
Of ik roep elke 100 pulsen een andere functie aan?

Een functie is geen class volgens mij.

Ja je hebt gelijk ik haal soms wel eens namen door elkaar.

Op maandag 17 juni 2024 14:42:36 schreef DK:
Is het dan nog een interrupt?
Of ik roep elke 100 pulsen een andere functie aan?

volgens mij een interrrupt, als ik een functie zou aanroepen dan word iedere keer de "stepper bewegings lus" vertraagt waardoor de stappenmotor "stottert" tijdens bewegen.

dan heb je het niet goed ontworpen :)
een interrupt onderbreekt ook alle andere code die uitgevoerd wordt.

Dit is inderdaad geen interrupt, maar gewoon een functie die tot 100 telt en dan een andere functie uitvoert.
omschrijf eens wat je wilt bereiken

een wagen die over een as loopt, van links naar rechts. die wagen word aan gedreven met een stappenmotor, de volle lengte van die as = 2,5 mtr. wat overeen komt met 25000 pulsen.
de snelheid is 1000 pulsen/seconden.
bij elke 100 pulsen (dus 100, 200, 300, 4000.......24900, 25000) (100 pulsen = 10 mm) moet ik 3 bytes over de UART (boudrate = 9600) naar een scanner sturen (zelfbouw). maar de beweging van de wagen moet natuurlijk vloeiend blijven.
als ik dat gewoon in de counter lus doe (van 1 to 25000) gaat de beweging "stotteren", dus wil ik dat bij elk 100 pulsen dat in een interrupt doen.

In een int kost het ook tijd, het is niet zo dat je main loop blijft doorlopen. Die wordt onderbroken (interrupted) als de interrupt code wordt uitgevoerd.
Ik twijfel of dit je probleem gaat oplossen.

[Bericht gewijzigd door Sine op (10%)]

ik kan de wagen ook wat langzamer laten lopen, zodat tussen de pulsen niet 1 maar b.v. 3 mili seconden zit, dan zou je die data toch binnen de 2 pulsen kunnen verzenden.
als ik het goed heb, heb je bij een boudrate van 9600: 1 byte/msec.

[Bericht gewijzigd door trix op (17%)]

Je kunt ook het steppen van je motor in een timer int zetten. Of (wellicht nog beter) een hardware timer gebruiken voor het genereren van de pulsen.

dus wil ik dat bij elk 100 pulsen dat in een interrupt doen.

dan stopt de wagen juist. In een interrupt doet de CPU vaak maar 1 ding. En eigenlijk zou de besturing van de steppermotor dan volledig buiten de software om moeten. Hardware PWM bv gaat buiten de software om.

moet ik 3 bytes over de UART (boudrate = 9600) naar een scanner sturen

De uart gebruik waarschijnlijk ook een interrupt en daarom valt de wagen stil.

De beweging van de wagen moet nu on-onderbroken gebeuren en een interrupt onderbreekt de wagen. Wat gebeurt als je bv maar 1 van de 3 bytes tegelijk verstuurt? Of kan de buadrate niet omhoog?