Sida 2 av 2

Re: Hjälp med Arduino och IR

Postat: 23 juli 2024, 19:14:36
av Icecap
ISR(TIMER2_COMPB_vect) är en interrupt-rutin som utlösas när TIMER2 har nått ett förinställd värde.
Detta sker alltså med en given frekvens (800Hz) som beror på TIMER2 klockfrekvens, ned-delning o vad man annars kan göra med den.

I mina ögon skulle den egentligen se ut såhär:

Kod: Markera allt

ISR(TIMER2_COMPB_vect) {
    static byte pulse;
    pulse++;
    if (pulse >= 8) { // Change the number for the desired modulation cycles
        pulse = 0;
        TCCR2A ^= _BV(COM2B1); // Toggle pin 11 (turn it on and off)
    }
}
och raden:
volatile byte pulse = 0;
tas bort.

Detta säkrar att variabeln 'pulse' inte "kan ses" andra ställen i programmet och att den alltid kollas för värde.

800Hz som delas med 8 blir 100 Hz och är alltså modulationsfrekvensen.


void setIrModOutput() sätter upp pinnar och frekvens.

TIMSK2 = _BV(OCIE2B); // Enable Output Compare Match B Interrupt
är väl självförklarande - men den aktivera att TIMER2 - som ju ska vara startat - kan utföra interrupt när målet är nått.

Tydligen sker det en konstant PWM med 10% från PWM-generatorn och TIMER2 interrupten räknar 8 TIMER2-interrupt-pulser och växlar då PWM-pinnen mellan utgång och ingång(? alltså passiv).
Med en svag pull-down på PWM-pinnen vill den då ge pulser och dras ner med den givne modulationsfrekvens.

Re: Hjälp med Arduino och IR

Postat: 23 juli 2024, 19:52:50
av RadioDJ
@Icecap
Man får tacka.
Att OCR2A och OCR2B ställer in 38 kHz:n har jag förstått men var får man 800 Hz ifrån?
Om man i stället vill ha 1kHz, då är 800Hz lite lågt.
Det måste finnas en formel på dettas någonstans.

Re: Hjälp med Arduino och IR

Postat: 23 juli 2024, 21:23:36
av Icecap
Den formel finns definitivt men jag har sedan länge hållit mig ifrån atMEGA-familjen så jag kan inte hjälpa där.

Men såklart kan du ställa rätt prescaler och delare till att få rätt frekvens.

Re: Hjälp med Arduino och IR

Postat: 27 juli 2024, 17:39:34
av RadioDJ
Jag har knäckt problemet och är nästan nöjd.
Nästa steg blir att prova den analoga biten.
Ska bara tänka lite mer på E Kafeman beskrivning.
@E Kafeman
Hoppas att det är okej om jag kommer med en massa frågor till dig?

Felet var att alla exempel jag hittade hade något fel.
Dock inte samma.
Interrupten kommer i en takt på i mitt fall 38kHz som sedan delas ner till lämpligt värde.

Så här ser min kod ut som fungerar.
Verifierad med oscilloscope och miniräknare.
Går säkert att förbättra om man vet hur man gör, jag vet det inte.
Är dock lite känslig för solljus fortfarande med det blev mycket bättre.
Nu ska det bara provas utomhus också.

38 kHz på pinne 11, modulerad med 4750 Hz
Hoppas bara att jag har skrivit av koden rätt.
Hittar Ni något fel, rättar jag gärna detta så nästa person kan använda koden.
Så också om Ni har några förbättringar.

Fråga mig inte exakt vad detta står för, för det vet jag inte men det fungerar.

Kod: Markera allt

pinMode(11, OUTPUT);

setup()
{
    TCCR2A = _BV(COM2A0) | _BV(WGM21) | _BV(WGM20);
    TCCR2B = _BV(WGM22) | _BV(CS20);
    OCR2A = 209
    TIMSK2 = _BV(OCIE2A);
}

ISR(TIMER2_COMPA_vect) {
    static byte pulse;
    
    pulse++;
    if (pulse >= 8) // 38kHz / 8 = 4750 Hz, / 10 = 3800 Hz
     {
        pulse = 0;
        TCCR2A ^= _BV(COM2A0);
    }
}


Re: Hjälp med Arduino och IR

Postat: 26 oktober 2024, 15:28:33
av RadioDJ
Hur i hela friden får jag denna kod att lämna ut pulser på pinne 3 i stället som nu på pinne 11?
Tacksam för ett exempel som är rätt.
Har kört helt fast.

Kod: Markera allt

pinMode(11, OUTPUT); // Denna begriper jag....

setup()
{
    TCCR2A = _BV(COM2A0) | _BV(WGM21) | _BV(WGM20);
    TCCR2B = _BV(WGM22) | _BV(CS20);
    OCR2A = 209
    TIMSK2 = _BV(OCIE2A);
}

ISR(TIMER2_COMPA_vect) {
    static byte pulse;
    
    pulse++;
    if (pulse >= 8) // 38kHz / 8 = 4750 Hz, / 10 = 3800 Hz
     {
        pulse = 0;
        TCCR2A ^= _BV(COM2A0);
    }
}

Re: Hjälp med Arduino och IR

Postat: 26 oktober 2024, 17:52:53
av Icecap
Motsvarar PWM-utgången i hårdvaran pinne 11?
Om så, kan funktionen ändras till att skickas ut på pinne 3?

Det går med en del vettiga μC som har modul för att välja vilken digital funktion som används på vilken pinne. Är det PPI funktionen kallas...?

Utan det är din tur slut.