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);
}
}
chinga
 
Сообщения: 203
Зарегистрирован: 24 дек 2008, 17:55
Откуда: Актюбинск

Re: АЦП на Atmega32

Сообщение dccharacter » 06 окт 2011, 20:40

В формулировке вопроса
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

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);
    }
}
Аватара пользователя
HarryStar
 
Сообщения: 995
Зарегистрирован: 15 ноя 2010, 13:56
Откуда: Нижний Новгород
прог. языки: С, С++, РНР


Вернуться в Новичкам или основы основ роботостроения.

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7