Timers gebruiken in Microchip (TMR0)

Ondanks dat ik niet meer op school zit, is dit denk ik de beste plek om deze vraag te stellen, vooral omdat ik er zelf nog veel van moet leren.|

Ik gebruik bij mijn projecten voornamelijk Microchip microcontrollers, PIC 8 bits.
Nu zijn mijn programmeerskills opzich prima, totdat het aankomt op Timers en Interrupts. Tot op heden kwam ik er wel mee weg om gewoon delay's te gebruiken, maar ik wil toch echt een keer de timers onder de knie krijgen.

Om die reden begin ik hier met een eenvoudige (?) vraag.

Op mijn microchip Curiosity board zit een PIC16F18875. Om te starten met Timers wil ik een eenvoudig project waarin ik 2 LEDs laat knipperen.
LED1 iedere seconde aan- en uit.
LED2 iedere halve seconde aan- en uit.

Door gebruik te maken van de TMR0 overflow lukt het om 1 LED te laten knipperen. Zodra TMR0 'vol' zal LED1 getoggled worden.

c code:

        if(SWITCH1_PORT == LOW){
            TMR0_StartTimer();
        }
        
        else if(SWITCH1_PORT == HIGH){
            TMR0_StopTimer();
        }
        
        if (TMR0IF) //Has Timer0 Overflowed?
        {
            LED1_Toggle();
            TMR0IF = 0;      //Clear the Timer0 overflow flag
        }

Klopt het dat de Timer iedere 250ms overflowed?

Mijn vragen:
Stel ik wil dat mijn LED iedere 5 seconden knippert, hoe krijg ik dat voor elkaar? Een kwestie van een counter die optelt naar 20 (250ms * 20) en dan pas de LED aan schakelt? Of is dat niet de manier waarop het hoort?

Stel ik wil een 2e LED toevoegen die met een andere snelheid knippert en niet synchroon loopt met LED1, kan ik dan nog wel dezelfde timer gebruiken? Of moet ik dan TMR1 bijvoorbeeld ook gaan gebruiken?

Arco

Special Member

Is inderdaad gebruikelijk om een countertje bij te houden voor lange tijden.
De interval van de timer is afhankelijk van de clock frequentie, en die staat nergens.

Ik gebruik meestal timer2. die is wat handiger (heeft autoreload)

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

Clock staat op 4MHz. (zie bijlage hieronder)

Termen als autoreload zeggen mij nog niet zoveel, aangezien ik mezelf een leek acht op het gebied van timers.

Op 24 mei 2023 11:17:12 schreef Arco:
Is inderdaad gebruikelijk om een countertje bij te houden voor lange tijden.
)

Maar dan nog, is het toevoegen van een counter DE manier? Of een manier die mensen met niet zoveel ervaring gebruiken? Dat gevoel krijg ik er namelijk bij.
En bovendien kan ik met een counter nog steeds niet een 2e LED op een andere snelheid laten knipperen, toch?

[Bericht gewijzigd door Christiaan371 op 24 mei 2023 11:28:01 (10%)

Arco

Special Member

Counter bijhouden is normaal wat men doet. Voor 2 leds kun je 2 counters gebruiken. Voor lange tijden is er iet veel anders.
Als die de gewenste waarde bereiken zet je ze weer op nul.

Voor timers is het wel gebruikelijk dat je de interrupt gebruikt, pollen is minder handig/ongebruikelijk... (maar kan wel)

Autoreload is dat de timer opnieuw wordt geladen met de gewenste waarde als er een roll-over (timer wordt '0') plaats vindt.

[Bericht gewijzigd door Arco op 24 mei 2023 11:51:31 (24%)

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

Duidelijk.

Maar stel dat ik normaal een delay van 463 ms heb (willekeurig getal), en die wil ik nu vervangen door een Timer, hoe krijg ik dan ooit voor elkaar dat mijn timer op de 463ms pollt?

Arco

Special Member

Kan bijv. door de timer op 1ms te zetten en tot 463 te tellen...

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