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") ;
...................
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
ADCSRA |= (1 << ADSC); //Начинаем преобразование
while ((ADCSRA&(1 << ADIF))== 0); //Ждем флага окончания преобразования
u = (ADCL|ADCH << 8 ); // Считываем ADC
Код: Выделить всё
// Start the AD conversion
ADCSRA|=0x40;
#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" );
}
};
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;
}