Всем привет. Пишу тут первый раз, так что не царапайте, если не там написал (не в той теме). Контроллеры программировать начал недавно. Первым моим эксперементом была ATMEGA16, которая программировалась на ура и в протеусе программа эмулировалась аналогично. Но для экономии места решил попробовать ATMEGA8... Вроде похожие, тока фунционала поменьше. Получился у меня такой вот полтергейст: Написанная элементарнейшая программка не хочет нормально отрабатывать в эмуляторе. Вот текст:
#include <avr>
#include <util>
#include <avr>
void Init(void)
{
DDRC = 0xFF;
PORTC = 0x00;
DDRD = 0xFF;
PORTD = 0x00;
//Global
TIFR = 0xC1;
TIMSK = 0xC1;
//Timer2
TCCR2 = 0x42;
TCNT2 = 0x02;
}
ISR(SIG_OVERFLOW2)
{
cli();
char pc = PORTC;
pc = pc + 1;
if (pc == 0)
pc = 1;
PORTC = pc;
sei();
}
int main (void)
{
Init();
Init();
sei();
while (1){
};
return 0;
}
Всё до смеха просто... В протеусе просто повесил атмегу, указал программу (elf|hex) и подключил на порт C осцилограф из виртуал инструментс. НО! сигнал есть только на PC1. Объясните, может что-то я не так делаю? собираюсь юзать внутренние 1MHz, так что в проекте WinAVR установлено 1000000Hz.
sun писал(а):Всем привет. ... НО! сигнал есть только на PC1. Объясните, может что-то я не так делаю? ...
Дык а чего ожидаете то?
Во-первых изменяемую в прерываниях переменную нужно как минимум с квалификатором volatile объявлять.
Во-вторых SIG_OVERFLOW2 -устаревшее определение вектора прерывания, лучше использовать TIMER2_OVF_vect.
В-третьих неплохо бы на дизассемблер посмотреть.
smac писал(а):
Во-первых изменяемую в прерываниях переменную нужно как минимум с квалификатором volatile объявлять.
Переменная внутренняя (НЕ ГЛОБАЛЬНАЯ).
Во-вторых SIG_OVERFLOW2 -устаревшее определение вектора прерывания, лучше использовать TIMER2_OVF_vect.
В-третьих неплохо бы на дизассемблер посмотреть.
Закрываеть - это я погарячился...
всё заработало..... собрал вот такую схему, тока без светодиодов....
Индикатор был сдвоенный, но выводы цифр на нём для каждой отдельные... тоесть я их просто пермкнул паралельно. собрал вот в такой схеме - не хочет работать... потребляет атмега как-то странно мало - 2mA, при нажатии кнопки 2.5mA.... Я думал, она в районе 6 ток держать будет..... но на индикаторе пусто..... может я что не так сделал? по даташиту написано, что можно подключать светодиоды прямо к выводам, да и так об этом в нете читал, а семисегментники - это и есть 8 светодиодов )) вот только они не хотят гореть по какой-то причине...