MacDonald, making his 11th start of the season, stopped 17-of-18 shots in a furious second period while the Flames were notching the tying and go-ahead goals.
Roman Cervenka forged a 1-1 tie with a tally midway through the middle frame and Cammalleri netted the decisive goal at the 16:41 mark when he took a feed from Roman Horak in the slot and one-timed a shot past Jean-Sebastian Giguere.
Alex Tanguay added a shorthanded score for the Flames, who broke a five-game losing streak.
Brad Malone scored and Giguere finished with 31 stops for the Avalanche.
Ray Liotta sues skin care company over use of likeness
Aaron Carter is still in love with Hilary Duff