Sida 1 av 1

Atmega2560 - hur upptäcka överlappande interrupt?

Postat: 1 maj 2016, 10:56:21
av hawkan
Undrar om det finns en idé om hur man upptäcker att t ex timer4 har startats om på Atmega2560.

Sitter med Marlin för 3D-skrivare och försöker få till en laserpuls med bestämd längd. De kommer oftast en efter en, kant i kant så att säga. Detta är en alternativ metod mot den som används populärt idag.

Ett försök att visa vad som händer.

Kod: Markera allt

void Stegmotor_ISR()
.
kod kod kod
.
Laser_pulse(150) // Initiera timer 4 med 150 microsekunders puls
.
kod kod kod
.
end Stegmotor_ISR

void Timer4_ISR() // ISR för att släcka lasern 
släck lasern
end TImer4_ISR
Det ser ju rättframt ut hoppas jag.
Men det som händer sekventiellt är oftast.

Kod: Markera allt

void Stegmotor_ISR()
.
kod kod kod
timer4 triggar på en tidigare puls och genererar ett Interrupt  <==== !
.
Laser_pulse(150) // Initiera timer 4 med 150 microsekunders puls
.
kod kod kod
.
end Stegmotor_ISR

Timer4_ISR() // ISR för att släcka lasern 
HÄR vill jag kunna avgöra om timer4 has startats om.
Har den startats om får den fortsätta utan att släcka lasern, 
det kommer så småningom ett nytt interrupt som släcker lasern.
Annars, släck lasern
end TImer4_ISR
Tiden för en laserpuls är beräknad från nominell hastighet och steglängd och sånt så typiskt
löser timern ut där jag visar. Men vi är ju redan i en ISR så vi får vänta tills den är färdig innan interruptet kan tas hand om.

Jag har läst Mega2560s datablad för 16-bit timers men hittar inget uppenbart sätt. Jag använder WGM=4.
Den möjlighet jag sett är WGM41 och WGM40 i TCCR4 men jag vet inte, det kanske finns ett bättre sätt.

Kan nämna att jag gjorde precis den här övningen på Arduino Due Sam3x8e och det är rätt olika.
Där kan man sätta att timern ska stanna efter en Compare Match. Och då är det bara att se
om klockan går eller ej. Går den har någon startat om den och då vet man det.
Men nu gällde det Atmega2560 som sagt.
Hoppas det finns nån idé.

Re: Atmega2560 - hur upptäcka överlappande interrupt?

Postat: 1 maj 2016, 14:29:33
av mAVRick
Kan du inte bara i Laser_pulse funktionen rensa timer4 interrupt flaggan?

Re: Atmega2560 - hur upptäcka överlappande interrupt?

Postat: 1 maj 2016, 15:01:37
av hawkan
jaaa... hur blir det?
Hmm så då låssas man inte om det tidigare interruptet.
Ja borde kunna funka, ska testa.
Blir ju också klart enklare för då behöver man inte ens ta hand om det oönskade
interruptet, det uppstår aldrig. Bra!

Re: Atmega2560 - hur upptäcka överlappande interrupt?

Postat: 1 maj 2016, 16:27:09
av mAVRick
Precis så ja. Lycka till!