но работает это всё как-то очень плохо одни раз всего по случайности получилось что-то похожее на синусоиду (положительная полу волна) а дальше пошло что-то на подобии треугольных импульсов а чаше всего вверху много точек около пикового значения а дальше их нету
в общем всё идёт на прерывании как на цап приходит сигнал он полученное значение записывает в массив а дальше возникает прерывание по опустошению регистра UDR и и там соответственно из этого массива передаю в терминал
подскажите почему у меня такой не ровный сигнал получается ?
не нравится что приходится через массив передавать можно как-нибудь по другому ?
как правильно сделать передачу ?
если вместо b[index]=ADCH; писать b[index]=ADCL; то протеус начинает ругаться что регистр ADC заблокирован и он не может из него считать с чем это может быть связано ? ставил задержки не помогло =(
Код: Выделить всё
#include <mega16.h>
// Standard Input/Output functions
#include <stdio.h>
#include <delay.h>
unsigned char index;
unsigned char bufL;
unsigned char bufH;
unsigned char varr;
char b[256];
#define ADC_VREF_TYPE 0x00
#define FOSC 8000000// Clock Speed
#define BAUD 9600
#define MYUBRR FOSC/16/BAUD-1
#define RXEN 4
#define TXEN 3
#define URSEL 7
#define USBS 3
#define UCSZ0 1
#define UDRE 5
#define UDRIE 5
#define ADEN 7
#define ADSC 6
#define ADFR 5
#define ADIF 4
#define ADIE 3
#define ADPS2 2
#define ADPS1 1
#define ADPS0 0
void USART_Init( unsigned int ubrr)
{
/* Set baud rate */
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<UDRIE);
/* Set frame format: 8data, 2stop bit */
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}
interrupt[USART_DRE] void USART_transmit(void)
{
UDR=b[varr];
varr++ ;
if (varr>250){varr=0;}
}
interrupt[ADC_INT] void ADC_result(void)
{
b[index]=ADCH;
index++;
if (index>250){index=0;}
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
PORTB=0x00;
DDRB=0xFF;
USART_Init ( MYUBRR );
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
ADMUX=224; // 1110000 (внутрений источник опороного напряжения выравнивание по левой границе)
ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0)|(1<<ADSC)|(1<<ADFR)|(1<<ADIE)|(1<<ADIF);
#asm("sei");
while (1)
{
};
}


