Добрый вечер уважаемые знатоки!

Написал первую программу в IAR 4.20/
У меня 2 вопроса:
1. Как разрешить глобальные прерывания?
2.Не работает команда PORTD=decode[Tens], хоть компилятор ошибок не выдаёт. Проверку производил в AVRStudio.
Программу прилагаю.
/*Программа выводит на индикатор числа с возрастанием
с 0 до 99 или с убыванием с 99 до 0 с частотой 1 сек
Если кнопка на выводе 0 порта С отжата - происходит счёт на увеличение,
если нажата - на уменьшение.
Среда IAR 4.20
Микроконтроллер AtMega 16
Кварц 16 МГц*/
#include <ioavr.h>
// Описание глобальных переменных
unsigned char n,c,flag,Ones,Tens;
char decode[10]={0xC0,0xFC,0xA4,0xB0,0x99,0x92,0x02,0xF8,0x80,0x90};
#define Bit(n) (1<<(n))
// Обработка прерываний по таймеру ТС0
#pragma vector=TIMER0_OVF_vect
__interrupt void FIRST (void)
{
PORTB=0x03; // выключаем индикатор
if (n){
PORTD=decode[Ones];
PORTB&=~Bit(0); // включаем 1 индикатор
}
else{
PORTD=decode[Tens];
PORTB&=~Bit(1); // включаем 2 индикатор
}
n=!n;
}
// Обработка прерываний по таймеру ТС1
#pragma vector=TIMER1_OVF_vect
__interrupt void SECOND (void)
{
TCNT1=0xC35A;
flag=1;
if ((PINC & Bit(0))!=0) c++; // увеличиваем, если кнопка отжата
else c--; // уменьшаем, если кнопка нажата
if (c==0x64) c=0x00;
if (c==0xFF) c=0x63;
}
// Преобразование 2-10 кода в 2-й
char CharToBCD(char c)
{
char high;
high=0;
while (c>=10){
high++;
c-=10;
}
return (high<<4)|c;
}
// Настройка регистров контроллера
void unit_avr (void)
{
//Порт А
PORTA=0x00;
DDRA=0xFF;
//Порт B
PORTB=0x03;
DDRB=0x03;
//Порт C
PORTC=0x01;
DDRC=0x00;
//Порт DD
PORTD=0xFF;
DDRD=0xFF;
// Настройка таймера ТС0
// Источник синхронизации: внутренний
// Частота на входе: 62,500 kHz
// Переполнение каждые 4 мс
TCCR0=0x03;
TCNT0=0x00;
OCR0=0x00;
// Настройка таймера ТС1
// Источник синхронизации: внутренний
// Частота на входе: 15,625 kHz
// Переполнение каждую секунду
TCCR1A=0x00;
TCCR1B=0x04;
TCNT1=0xC35A;
ICR1=0x00;
OCR1A=0x00;
OCR1B=0x00;
// Таймер 2 отключён
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// Внешние прерывания отключены
MCUCR=0x00;
MCUCSR=0x00;
// Разрешены прерывания по переполнению таймеров ТС0 и ТС1
TIMSK=0x05;
// Аналоговый компаратор отключён
ACSR=0x80;
SFIOR=0x00;
}
void main (void)
{
unit_avr();
// Разрешены глобальные прерывания
// __enable interrupt(); // здесь выдаёт ошибку
SREG|=Bit(7);
while (1){
while(flag){
// Place your code here
flag=0;
Tens=CharToBCD©;
PORTA=Tens;
Ones=Tens;
Ones=Ones&(0x0F);
Tens=Tens>>4;
}
}
}
Помогите разобраться!
Сообщение отредактировал Anjey_N - Jan 21 2007, 21:47