Свежие обсуждения
Микроконтроллеры

Как научиться писать программы для AVR

1 2 5

Научите меня, знатоки CodeVision, почему я в подпрограмму прерывания по переполнению Timer2 не залетаю?
Счётчик считает, переполняется, глобально прерывания разрешил, ан нет, не хочет он в void timer2_ovf_isr(void) почему-то заходить. Где я туплю, подскажите.

#include <mega16.h>
#include <bcd.h>
const char ZNAK_COD[20] = { ....}

interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{// Place your code here
.....
return ;
}

void main (void){ // ------------- Главная функция ----------------
char var_PA, dec_PA, ed_PA, des_PA;
DDRA = 0xFF ;//
DDRC = 0xFF ;//сделать PORTC выходом
TCCR0 = 0x05;
TCCR2=0x03; // Timer/Counter 2 initialization

#asm("sei"); // Global enable interrupts

while (1){ //
var_PA++;
if (var_PA>99 )var_PA=0;
dec_PA= bin2bcd(var_PA) ;
ed_PA =dec_PA & 0x0F;
des_PA=(dec_PA & 0xF0)>>4;
PORTA=ZNAK_COD[ed_PA]; //
};
}

 

дык у тебя ничего нет в обработчике

 

TIMSK еще нужно установить. Да и var_PA проинициализировать не помешает

 

Спасиб, что-то я понадеялся, что мне визард всё сделает, а вот тимском он не рулит.

 

*Назидательным тоном* Аааа вот нефига полагаться на всякие левые визарды. На первых порах визарды тока отупляют и вводят в заблуждение. Ручками надо ручками!

 

gan: визард всё сделает, а вот тимском он не рулит.

Мастер "рулит" всем что нужно для выполнения ВАШЕГО ЗАКАЗА ! Что просите то и получаете.

 

ДА ладно, сразу пинать. Действительно, зря я на визард погнал, выставил он мне тимск, просто я его не перенёс.
У меня теперь такой вопрос, вот симулирую я это всё в VMLABe, и что-то столкнулся либо с его косяком, или опять туплю. В окне Watch не показывает локальную переменную. Делаю её глобальной- сразу её видно, делаю локальной- захожу брикпойнтом в процедуру, где она стопудово должна быть видна- нет, показывает <out of scoup>, хотя при запуске на прогон всё работает, как надо. Заливаю (с как-бы невидимыми переменными) в МЕГУ16- в железе работает.

 

У локальных переменных фиксированного места в памяти нет, они адресуются по текущему указателю стека плюс смещение. Возможно, причина в этом. Посмотрите содержимое стека, если это важно.

 

Да ну, так сложно? Может я не понятно выразился?
Отлаживаю я программу в КодеВижн, откомпилировал её, запускаю этот ВмЛаб и хочу посмотреть значения разных переменных в точках останова. В аттаче я прикрепил скриншот - зашёл в подпрограмму по прерывагию от АЦП, объявил в ней adc_data, тормознулся на голубой строке в точке останова, и что вижу значение adc_data = out of scope, а должно быть какое-то значение (старший байт АЦП сдвинутый влево | младший байт АЦП). Хотя, повторюсь, всё работает, и в симуляторе, и в железе, как надо. Если для этого надо лезть в память, может проще послать лесом этот VmLab, да перейти на AVRStudio, или Proteus?
HI-Tech PICC такую пургу не гнал, там зашёл в процедуру - все её переменные сразу стали видны, вышел - <out of scope>. А тут что, все переменные глобальными делать- засмеют ведь.

 

Да нет, вполне понятно. Может быть, такая фича у отладчика. Глобальные переменные-то все видны. В крайнем случае, если сильно хотца, заведите глобальную переменную X, в обработчике напишите X = adc_data; и наблюдайте счастье в X. Кстати, вопрос - а adc_data = ADC; не пробовали? В WinAVR - так без проблем.