Здравствуйте уважаемые программисты, помогите пожалуйста поправить программу. Суть в том, что я пишу программу для микроконтроллера atmega8 для измерения напряжения разомкнутой цепи (НРЦ) и замкнутой цепи (НЗЦ) батареи, используя внешний АЦП, подключенный через SPI, и выводу информации на 7-сегментый индикатор. Вначале измеряется НРЦ, далее, по нажатию кнопки подключается сопротивление при помощи полевого транзистора, в этот момент индикация должна прекратиться и возобновиться через 5 секунд, вывести на индикатор НЗЦ.
Основная проблема в том, что информация выводится постоянно с прерыванием основной программы по таймеру.
http://yadi.sk/d/tbwGLm7sMFPcX - ссылка на проекты в протеусе и в AVR Studio
Основная проблема в том, что информация выводится постоянно с прерыванием основной программы по таймеру.
Код: Выделить всё
#include <iom8.h>
#include <util/delay.h>
#include <avr/io.h>
#include "lcd_lib.h"
#include "mcp3001.h"
#include <avr/interrupt.h>
#define F_CPU 4000000
// 0 1 2 3 4 5 6 7 8 9
const unsigned char codes[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char data[4]={0x00,0x00,0x00,0x00};
unsigned char counter=0;
void pause (unsigned int a) // подпрограмма паузы
{ unsigned int i;
for (i=a;i>0;i--)
;
}
void init_timer (void)
{
TIMSK=(1<<TOIE0); //Прерывание по переполнению таймера
TCCR0=(0<<CS00)|(1<<CS01)|(0<<CS02);
}
void convert_data (unsigned int x) //конвертация получнного кода с ацп
{
unsigned int temp,res;
temp=x;
res=temp/1000; //Пересчет 1000-х
data[3]=codes[res]|0x80;
temp=temp-res*1000;
res=temp/100; //Пересчет 100-х
data[2]=codes[res];
temp=temp-res*100;
res=temp/10; //Пересчет 10-х
data[1]=codes[res];
temp=temp-res*10;
data[0]=codes[temp]; //Пересчет 1-х
}
ISR (TIMER0_OVF_vect) //подпрограмма индикации, срабатывает по переполнению счетчика.
{
PORTD=0xff;
PORTC=_BV(counter); //Выбор индикатора
PORTD=~data[counter]; //Запись кода
counter=(counter+1)%4; //Переход к следующему индикатору
TCNT0=0x00; //очистка таймера
}
int main()
{
SPI_MasterInit();
unsigned int adc=0;
DDRD=0xff;
PORTD=0x00;
DDRC=0xff;
PORTC=0x0f;
pause(1000); //пауза
init_timer(); //инициализация таймера
sei(); //разрешаем прерывание
while(1)
{
if ((PINB&0x01)==0x00) //Если кнопка нажата
{
cli(); //запрещаем прерывание на время паузы
PORTB = 1<<6; // подключаем сопротивление
pause (50000); // тут пауза не срабатывает, данные все равно отлылаются на индикатор
adc=ReceiveADC()/0.25; // получение даных с ацп
convert_data(adc); // конвертация
sei(); //разрешаем прерывание
}
if ((PINB&0x01)==0x01)
{
PORTB = 0<<6; // отключение сопротивления
adc=ReceiveADC()/0.25;
convert_data(adc);
}
}
}
- Вложения
-
- Точечный рисунок.JPG
- (83.33 КБ) 334 скачивания