спасибо, принял асм.pyzhman писал(а):
а подскажите где почитать про видимость -невидимость переменных в С и асм ?
если вопрос подругому - как передавать данные между С и асм
спасибо, принял асм.pyzhman писал(а):
опрос провожу так:#include <mega8.h>
#include <lcd.h>
#include <string.h>
#include <stdio.h>
#include <io.h>
#include <interrupt.h>
#include <delay.h>
#asm
.equ __lcd_port=0x12; PORTD
#endasm
#define FIRST_ADC_INPUT 0
#define LAST_ADC_INPUT 0
unsigned char adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
#define ADC_VREF_TYPE 0x20
interrupt [ADC_INT] void adc_isr(void) //стандартное прерывание по ADC от CVAVR
{
static unsigned char input_index=0;
// Read the 8 most significant bits
// of the AD conversion result
adc_data[input_index]=ADCH;
// Select next ADC input
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
input_index=0;
ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff))+input_index;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
}
volatile unsigned char butte = 0;
int butt = 4;
unsigned char tim = 0;
unsigned char code = 0;
char buffer [128];
int oldButoon[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
void main( void )
{
ADMUX=FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff);
ADCSRA=0xCC;
#asm("sei") ;
...................
Вообще мне надо считывать состояние ADC(0) (0В-5В), и присваивать его переменной.if (adc_data[0] > 500) {
code = code + 1;}
А перед опросом ставить:void main( void )
{
/***Настройка АЦП***/
ADCSRA |= (1 << ADEN) //Включение АЦП
|(1 << ADPS1)|(1 << ADPS0); // предделитель преобразователя на 8
ADMUX |= (0 << REFS1)|(0 << REFS0) // внешний ИОН
|(0 << MUX0)|(0 << MUX1)|(0 << MUX2)|(0 << MUX3); // вход PC0
А как теперь сделать остальные пины выходами? (кроме PC(0) и PC(1))ADCSRA |= (1 << ADSC); //Начинаем преобразование
while ((ADCSRA&(1 << ADIF))== 0); //Ждем флага окончания преобразования
u = (ADCL|ADCH << 8 ); // Считываем ADC
Код: Выделить всё
// Start the AD conversion
ADCSRA|=0x40;Мне необходимо следить за датчиком холла (подключённого к ADC(0)) постоянно и считать количество оборотов двигателя#include <mega8.h>
#include <lcd.h>
#include <string.h>
#include <stdio.h>
#include <io.h>
#include <delay.h>
#asm
.equ __lcd_port=0x12; PORTD
#endasm
volatile unsigned char butte = 0;
int butt = 4;
unsigned char code = 0;
unsigned int u;
char buffer [128];
void main( void )
{
/***Настройка АЦП***/
ADCSRA |= (1 << ADEN) //Включение АЦП
|(1 << ADPS1)|(1 << ADPS0); // предделитель преобразователя на 8
ADMUX |= (0 << REFS1)|(0 << REFS0) // внешний ИОН
|(0 << MUX0)|(0 << MUX1)|(0 << MUX2)|(0 << MUX3); // вход PC0
DDRB = 0b00001111;
PORTB = 0b11110000;
for(;;)
{
ADCSRA |= (1 << ADSC); //Начинаем преобразование
while ((ADCSRA&(1 << ADIF))== 0); //Ждем флага окончания преобразования
u = (ADCL|ADCH << 8 ); // Считываем ADC
if (u > 200) {code = code++};
sprintf(buffer, "%u", code);
lcd_init( 16 );
lcd_clear( );
lcd_gotoxy( 0,0 );
lcd_puts( buffer );
lcd_gotoxy( 0,1 );
lcd_putsf( "RTY" );
}
};
Извините, я с самого начала не читал, что за устройство вы делаете. И почему именно ADC? У вас вроде Мега8 прописана, а в ней аналоговый компаратор никто не отменял. А с ним попроще будет. Замикшируйте негативный вход компаратора на тот же ADC0, на плюсовой его вход подайте нужное смещение (я заметил вы по ADC превышение порога 200 отслеживаете), которое можно будет отдельным потенциометром подстраивать. А там уж, как хотите. Или по прерыванию работайте, или постоянно поллингуйте вывод компаратора. Зависит от того, чем еще будет ваше ядро занято.isx писал(а):Мне необходимо следить за датчиком холла (подключённого к ADC(0)) постоянно и считать количество оборотов двигателя
Мдя... Ну эт щас поправимut1wpr писал(а):тег comment.
А внешнее устройство типа триггера шмидта не прокатит?isx писал(а):Мне необходимо следить за датчиком холла (подключённого к ADC(0)) постоянно и считать количество оборотов двигателя
Там много встроенных функций, в том числе вашisx писал(а):Дайте если есть у кого нибудь ссылку на подробное описание использования АЦП в CVAVR на СИ.
Код: Выделить всё
/***Настройка АЦП***/
ADCSRA |= (1 << ADEN) //Включение АЦП
|(1 << ADPS1)|(1 << ADPS0); // предделитель преобразователя на 8
ADMUX |= (0 << REFS1)|(0 << REFS0) // внешний ИОН
|(0 << MUX0)|(0 << MUX1)|(0 << MUX2)|(0 << MUX3); // вход PC0
...
ADCSRA |= (1 << ADSC); //Начинаем преобразование
while ((ADCSRA&(1 << ADIF))== 0); //Ждем флага окончания преобразования
u = (ADCL|ADCH << 8 ); // Считываем ADC
если на выход сделать, то вроде так просто должны работать.isx писал(а):И ещё, можно ли использовать выводы АЦП в качестве обычных портов ввода-вывода, и если можно, то там тоже нужно настраивать регистры или тупо как и со стандартными портами работать?
Код: Выделить всё
#include <mega8.h>
.....
sfrb PIND=0x10;
#define polarity PIND.6;
void main(void)
{
.....
199 if(polarity)
200 PORTC= 0b00001001;
201 else
202 PORTC= 0b00001010;
}