roboforum.ru

Технический форум по робототехнике.

АЦП на Atmega32

АЦП на Atmega32

chinga » 05 окт 2011, 15:23

Здравствуйте!
реализовываю этот проект а Си)но выводит что то непонятное, в чем ошибка?
Код: Выделить всёРазвернуть
/*****************************************************
Chip type               : ATmega32
Program type            : Application
AVR Core Clock frequency: 16,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 512
*****************************************************/

#include <mega32.h>
#include <delay.h>
#include <stdio.h>

#asm
   .equ __lcd_port=0x16; PORTB   
#endasm             

#include <alcd.h>

#define ADC_VREF_TYPE 0x00

unsigned  int read_v=0;  //содержит результат преобразования для volt_adc(0) 0-1023
unsigned  int result_v=0;   //фактический показ на lcd 255 (число символов ASCII) для десятичной записи

unsigned int read_adc(unsigned char adc_input){

    ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
    // Delay needed for the stabilization of the ADC input voltage
    delay_us(10);
    // Start the AD conversion
    ADCSRA|=0x40;
    // Wait for the AD conversion to complete
    while ((ADCSRA & 0x10)==0);
    ADCSRA|=0x10;
    return ADCW;
}

void print(int number) {
    int sz = 0, i;
    char ch[100];
    while (number > 0) {
        ch[sz++] = number % 10;
        number /= 10;
    }               
   
    for (i = 0; i < sz/2; ++i) {
       char x = ch[i];
       ch[i] = ch[sz - i - 1];
       ch[sz-i-1] = x;
    }             
    lcd_gotoxy(0,1);
    lcd_puts("ADC0=");
    lcd_gotoxy(5,1);       
    lcd_puts(ch);
}

void main(void){

PORTA=0x00;
DDRA=0x00;

PORTB=0x00;
DDRB=0xFF;

PORTC=0x00;
DDRC=0x00;

PORTD=0x00;
DDRD=0x00;

// ADC initialization
// ADC Clock frequency: 125,000 kHz
// ADC Voltage Reference: Int., cap. on AREF
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x87;                         

lcd_init(16); // Инициализация ЖКИ на 16 символов

lcd_gotoxy(0, 0);
lcd_putsf ("volt_adc(0)"); 
delay_ms(3000);
lcd_clear();

read_v=read_adc(0);
result_v=read_v;

print(read_v);
delay_ms(3000);
lcd_clear();

while (1){
   
    read_v = read_adc(0);
    lcd_gotoxy(0,1);
    print(read_v);
    delay_ms(100);
}
}

Re: АЦП на Atmega32

dccharacter » 06 окт 2011, 20:40

В формулировке вопроса

Re: АЦП на Atmega32

HarryStar » 07 окт 2011, 00:11

Почему вы так сложно выводите текст?
Есть отличная отладочная (а если нет требований к быстродействию и памяти то и в конечном устройстве прокатит) штука, называется sprintf.
И вообще у вас много лишних усложнений.

CVAVR 2.04.4a
в свойствах С Compiler выставляете напротив (s)printf: "int, width"

Код: Выделить всёРазвернуть
#include <mega32.h>
#include <delay.h>
#include <STRING.h>
#include <stdio.h>
#include <stdlib.h>

#asm
   .equ __lcd_port=0x16 ;PORTB
#endasm
#include <lcd.h>


#define ADC_VREF_TYPE 0x40
unsigned int read_adc(unsigned char adc_input)
{
    ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
    delay_us(10);
    ADCSRA|=0x40;
    while ((ADCSRA & 0x10)==0);
    ADCSRA|=0x10;
    return ADCW;
}

char buf[40]; // Текстовый буфер для вывода

void main(void)
{
    PORTA=0x00; DDRA=0x00;

    // ADC initialization
    // ADC Clock frequency: 1000,000 kHz
    // ADC Voltage Reference: AVCC pin
    ADMUX=ADC_VREF_TYPE & 0xff;
    ADCSRA=0x84;

    #asm("sei")

    // LCD module initialization
    lcd_init(16);
    lcd_clear();

    while(1)
    {
            lcd_gotoxy(0, 0);
            sprintf(buf, "ADC(A0)=%3u ", read_adc(0));     
            lcd_puts(buf);
            delay_ms(100);
    }
}


Rambler\'s Top100 Mail.ru counter