Dag allen,
Bij het ontwikkelen van mijn toekomstige 4 voudige keukentimer ben ik toch een eigenaardig probleem tegengekomen.
Opstelling: mikroBasic van MikroElektronica.
microcontroller: dsPIC30F3013
Ik maak gebruik van een interrupt op timer 1 om zo al mijn tijden te gaan berekenen.
Voor elke timer maak ik gebruik van een structure.
Een structure is een verzameling van variabelen, die dan in één soort van object verzameld zijn.
Hier een voorbeeld:
pic basic code:
structure Timehms
dim Hour as string[6]
dim Minu as string[6]
dim seco as string[6]
dim OverTime as char ' 43 = "+" = gewoon afteller, 45 = "-" = timer afgelopen en negatief tellen
end structure
Nu heb ik een functie gemaakt die een tellerwaarde, een gewone integer,die in seconden de tijd bijhoudt, deze gaat omzetten naar de 3 string waarden om die dan op het LCD te laten zien.
Dus:
pic basic code:
sub function Func_TimeSecTo_hms (dim TimeInSeconds as integer) as Timehms
' Blablabla de omzetting
result.Hour = MijnOmgezetteUur
result.Minu = MijnOmgezetteMinuut
result.seco = MijnOmgezetteSeconde
end sub
Echter werkt dit NIET.
Het effect is, dat is eerst perfect werkt, maar na een tijd (lees na x loops in de main code en interrupts)
reset de microcontroller, echter ZONDER de interrupt op timer 1 door te lopen.
Nu heb ik gelezen dat een verkeerde berekening een reset kan veroorzaken en dat je die met een "Trap" kan opvangen, maar er gebeurt géén verkeerde berekening.
Wat ik ook raar vindt is, dat mijn interrupt, na de reset niet meer werkt.
De microcontroller reset wel degelijk volledig, want ik heb 2 "beepjes" geprogrammeerd in het begin van de main loop en net voor de oneindige loop, dus ik weet dat het volledige deel initialisatiecode doorlopen wordt.
Hoe ik het nu heb opgelost, en momenteel het ook zo werkt is het volgende:
pic basic code:
'Ik declareer een volledige structure.
dim Result_hms as Timehms
sub function Func_TimeSecTo_hms (dim TimeInSeconds as integer) as Timehms
' Blablabla de omzetting
'tussenstap door alles in een voorgedefinieerde struct te zetten
Result_hms .Hour = MijnOmgezetteUur
Result_hms .Minu = MijnOmgezetteMinuut
Result_hms .seco = MijnOmgezetteSeconde
result = Result_hms 'transfereren van data in één keer
end sub
Dus nu is mijn vraag, hoe komt dit?
En waarom is mijn interrupt na die "reset" / crash niet meer actief?
Als ik een reset op de mclr pin doe, komt de interrupt wel terug actief.
Nog ter info voor de liefhebbers, Picbasic van Proton vs mikroBasic:
-Getallen kan je in picbasic zo naar een lcd printen, in mikrobasic moet je die omzetten in een char.
In picbasic is het ook eenvoudiger om met getallen te werken waarvan je de voorste nullen van wil printen op een lcd.
-Bij een logische vergelijking bij een "if" statement, en je hebt 2 vergelijkingen, dan moeten die bij mikroBasic tussen haakjes staan.
Bij Picbasic van Proton hoeft dit niet.
Dus bvb: if (a>1) and (b<2) then...