Разработка, производство и продажа радиоэлектронной аппаратуры
|
Требуется программист в Зеленограде - обработка данных с датчиков; ColdFire; 40 тыс.
e-mail: jobsmp@pochta.ru
|
Вот вырезки из старого проекта на 32-й меге (IAR-C). Там есть лишние куски, счас уж не помню что к чему, про АЦП сам наковыряй из кода.
Отправлено
scorpion 09 мая 2008 г. 23:16
В ответ на:
ATmega16 отправлено
ruxa 09 мая 2008 г. 21:55
////////// adc.h, ////////////////////////
void ADCInit(unsigned char);
void ADCStart(void);
/////////////////////////////////////////////
////////// adc.c ////////////////////////
#include <iom32.h>
#include <inavr.h>
#include <stdlib.h>
#include "ports.h"
#include "adc.h"
/////////////////////////////////////////////////////////////////////////
void ADCInit(unsigned char n)
{
ADMUX = 0; //reference = AREF (pin 29 TQFP), result is right adjusted
ADMUX &= 0xf8;
ADMUX |= (n & 0x07); //source = n
ADCSRA = 0x8e; //разреш, такт/64
}//void ADCInit(unsigned char n)
//==============================================================
void ADCStart(void)
{//запускает измерение датчиков
ADCSRA |= 0x40; //start (ADCS - ADC start conversion)
}//void ADCStart(void)
//=================================================================
///////// p59_main.c /////////////////////////
#include <inavr.h>
#include <string.h>
#include <stdio.h> //for "printf()"
#include <iom32.h>
#include "Ports.h"
#include "timers.h"
#include "bios.h"
#include "adc.h"
#include "eeprom.h"
#include "74hc164.h"
//=================================================================
// Основная программа
//=================================================================
void main()
{ //инициализация
unsigned char a;
int i;
unsigned char ADCnumb = 6; //номер АЦП, с которым в данный момент ведётся работа
///////////////////////////////////////////////////////////////////
__disable_interrupt();
InitVars(); //"timers.c"
InitPorts(); //порты, defined in "ports.c"
InitTimer0();
InitTimer2(31);
Set1hc164(0x00);
a = RdW1();
if(a > 3) WrW1(2);
InitUSART(); //"bios.c"
USART_RXC_INT_ENABLE; //"bios.h"
__disable_interrupt();
TIMER0_COMP_INT_ENABLE;
TIMER2_COMP_INT_ENABLE;
TIMER0_START;
TIMER2_START;
WDTCR = 0x00;
WDT_DISABLE;
__enable_interrupt();
ADCInit(ADCnumb); //"adc.c" , 6 - PulseInterval, 7 - PulseWidth
ADCStart();
//=============================================================================
while(1)
{
// LED1_CPL;
if(!(ADCSRA & 0x40)) //
{//данные готовы
if(ADCnumb == 6)
{//готовы данные с регулятора периода между импульсами, вычисляем ValBetwPulse (timers.h)
a = ((ADCL>>2) & 0x3f) | (ADCH<<6);
SetTbetwPuls(a); //"bios.c"
CalcTimer2Init(GetEEPROM(2), GetEEPROM(3), a);//(((ADCL>>2) & 0x3f) | (ADCH<<6))); //~l.521 of "timers.c"
ADCnumb++;
}
else if(ADCnumb == 7)
{//готовы данные с регулятора ширины импульсов, вычисляем ValPulseWidth (timers.h)
SetValPulseWidth(((ADCL>>2) & 0x3f) | (ADCH<<6)); //"timers.c"
ADCnumb = 6;
}
else ;
ADCInit(ADCnumb); //"adc.c" , 6 - PulseInterval, 7 - PulseWidth
ADCStart();
}//if(!(ADCSRA & 0x40))
i = GetRegime(); //located in "timers.c"
if(i == 0) i = 0x09;
else if(i == 1) i = 0x05;
else if(i == 2) i = 0x0a;
else i = 0x06;
DispatchCmd(ChkCmd()); //"bios.c"
Delay(5); //this delay is obligatory ! Otherwise leds on HC164 will flash continuosly
}//while(1)
}//main()
Составить ответ | Вернуться на конференцию
Ответы