|
|
|
|
Научите меня, знатоки 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 - так без проблем. |
|
|
|
|