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
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
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é.