Timing in microcontroller organiseren, mikroBasic

Hallo allen,

Het project waar ik meer bezig ben, is hetzelfde als vorig topic.
Echter is mijn vraag volledig verschillend.

Eerst even een intro waarover het gaat:
Ik heb dus een keukentimer gemaakt, waarbij de gebruiker 4 timers kan bedienen, inlusief geluidssignaal.
Er wordt gebruikt gemaakt van een dsPIC30F3013 en een simpel HD44780 LCD display.Wat ingangen voor drukknoppen en een uitgang voor de luidspreker.

Hoe het momenteel werkt;
De LCD afhandeling zit in de main loop.
Echter trigger ik deze elke 100ms.
Ik heb 1 interrupt die elke 10ms loopt.
Daarin doe ik button debounce, hou ik de tijden bij en start of stop ik de buzzer.(hardware pwm out op een pin)

Ik gebruik niet de ingebouwde library voor de drukknop, aangezien die 200ms tijd van mijn microcontroller opeet.
Ik wil kunnen multiplexen tussen verschillende taken, dus doe ik dit zelf dmv tellers en flanken-detecties.
Ook gebruik ik de "tone" library niet, want ook die neemt teveel tijd in beslag, ik gebruik de hardware pwm van de controller zelf.

De standaard library voor het LCD gebruik ik wél.

Mijn microcontroller draait op 80Mhz (ik weet het, beetje overkill)
De tijd dat de interrupt in beslag neemt is 50µs.
De tijd dat de LCD routine in beslag neemt is 80ms, aangezien ik elke 100ms de LCD routine doorloopt, is de processor 20ms "niets" aan het doen.

Het geheel werkt perfect en reageert heel goed op user input, zelfs als de buzzer gaat, of als er een alarm aan het afgaan is, kan je een andere timer instellen enz...

Nu dacht ik, kan ik de PLL verlagen, zodat ik de MCU op 40Mhz kan laten draaien, zodat ik minder energie verbruik.
Natuurlijk pas ik dan ook de prescalers aan, zodat de interrupt tijd overeenkomt met die 10ms waarop alles gebouwd is.

Echter heb ik daar een probleem, het LCD wordt niet meer correct aangestuurd en geeft random karakters weer.

Ik ga ervan uit dat mijn interrupts té lang duren tijdens de communicatie met het LCD, is dat correct?

Om dit op te lossen zou ik de interrupt dat elke 10ms getriggert wordt kunnen opsplitsen door een interrupt van 1ms, die dan in een aantal stappen verschillende zaken verdeelt.
Dus ipv 1 lange interrupt, 5 korte interrupts, op een verschillend moment, maar nog steeds met een 10ms interval.

Hoe doen jullie dit? Of maken jullie een eigen LCD aansturing, die niet gebaseerd is op "wacht" instructies, maar misschien door te integeren met de interrupt?

Een refresh-rate van 100ms voor het LCD is méér dan voldoende, maar ik zou het geheel energie zuinig willen maken, zonder het "realtime" gevoel in de bediening te willen verliezen.

mel

Golden Member

Heb je de "busy"lijn ook benut? Dat de processor wacht op het display?
Als dat zo is, dat ZOU het goed moeten gaan..

u=ir betekent niet :U bent ingenieur..

Voor het LCD gebruik ik de interne library van MikroBasic, dus ik heb geen "grip" op de interne logica die het LCD aanstuurt.
Maar inderdaad, misschien moet ik me toch eens verdiepen in de datasheet en zelf een routine daarvoor schrijven.

Arco

Special Member

Zulke simpele klusjes moeten zelfs op 1MHz nog lopen... ;)
Heb je de MCU frequentie ook aangepast?

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Inderdaad... Nu werkt het dus wel op die 40Mhz... 8)7
Bedankt voor de hulp.