Страница 1 из 1

Atmega 64 + АЦП которое не хочит работать

Добавлено: Пн мар 16, 2015 13:52:50
misterkuk
Как уже много раз говорилось и на своём опыте знаю, что если программа не работает как нужно в Proteus, то это не значит что в железе будет анологично. У меня сидуация с точностью да наоборот. Задача снять напряжение с 1го канала ацп и передать на дисплей нокиа. В Proteus всё прекрастно работает, в железе выводит 0.0 Опорное АЦП от AVCC. Кондёр в 0.1 мф на AREF повесил. Порты которые по совместительству входы АЦП работают. Сжечь я их никак не мог. Может особенность какая-то есть?
Кварц 8мГц. Пробывал разные источники опорного напряжения, менял частоту генератора АЦП, направление ножек портов АЦП. Уже 3й день бьрюсь. Разные вариации в симуляции работают, в елезе ничего не пашит.
Спойлер

Код: Выделить всё

#include <stdio.h>
#include <mega64a.h>
#include <delay.h>
#include <io.h>
#include <ds18b20.h>
#include <math.h>
#include "n3310lcd.c"
#define china 1
unsigned long int  i;
float VCC;


// Voltage Reference: AVCC pin
#define ADC_VREF_TYPE ((0<<REFS1) | (1<<REFS0) | (0<<ADLAR))

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | ADC_VREF_TYPE;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);

SREG|=(0<<7); // Глобальное  прерываний запрещаем.
// Start the AD conversion
ADCSRA|=(1<<ADSC);
// Wait for the AD conversion to complete
while ((ADCSRA & (1<<ADIF))==0);
SREG|=(1<<7); // Глобальное  прерываний разрешаем.
ADCSRA|=(1<<ADIF);
return ADCW;
}


  
void main(void)
{
 PORTA.2=1;
DDRA.2=1;


// Port F initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTF=0x00;
DDRF=0x00;

// ADC initialization
// ADC Clock frequency: 1000,000 kHz
// ADC Voltage Reference: AVCC pin
ADMUX=ADC_VREF_TYPE;
ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADFR) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
SFIOR=(0<<ACME);
 


 VCC=5.00/1023;

 

 Lcd_on ();
 LcdInit();
 LcdClear ();
 LcdMode (2);
 Lcd_on (); 
 PORTA.2=1;

 while(1) 
 { 
        sprintf( lcd_buf,"V=%.1f",VCC*read_adc(0) );
        LcdString(1,1);
        sprintf( lcd_buf,"V=%.1f",VCC*read_adc(1) );
       LcdString(1,2);
       i=1238;
       sprintf( lcd_buf,"V=%.1i",i );
       LcdString(1,3);
       LcdUpdate (); 
  }
}

Re: Atmega 64 + АЦП которое не хочит работать

Добавлено: Пн мар 16, 2015 14:44:32
WiseLord
misterkuk писал(а):SREG|=(0<<7); // Глобальное прерываний запрещаем.
На самом деле, эта строка ничего не делает.
misterkuk писал(а):SFIOR=(0<<ACME);
А эта обнуляет весь SFIOR. Уверены, что Вам именно это надо?+

В общем, как минимум, перепроверьте все эти |= (0<<bit), так как они делают не то, что Вы от них ожидаете (не обнуляют бит).

Re: Atmega 64 + АЦП которое не хочит работать

Добавлено: Вт мар 17, 2015 16:41:15
misterkuk
На самом деле, эта строка ничего не делает.
Проблем с ней не возникало, всегда так пишу. Но поменял на #asm("sei") и #asm("cli")
эта обнуляет весь SFIOR.
Открыл пару учебников. Судя по ним этой командой значение байта ACME устанавливаю в 0 в регистре SFIOR.
Я проверил как вы и сказали. ничего не поменялось. Тот же SFIOR=(0<<ACME); если писать ACME=0; то ошибка.
Тогда SFIOR|=0x... писать. Я посмотрел в симуляции и весь SFIOR равен 0. Я удалил эту строчку. В итоге програма работала как и работает. В протеусе всё измеряется и выводится, в железе на собранной плате Вместо ожидаемого напряжения горят нули.

Re: Atmega 64 + АЦП которое не хочит работать

Добавлено: Вт мар 17, 2015 17:01:22
misterkuk
Ещё в новой плате мк немного тёплый. Цепи питания разведены верно. Питаю от ЮСб. По питанию у мк стоят кондёры в 0.1мф.

Re: Atmega 64 + АЦП которое не хочит работать

Добавлено: Вт мар 17, 2015 18:10:33
ARV
схему вы не публикуете... жаль. протеусу без разницы, подвели вы питание AVCC и AGND, а реальному МК важно, чтобы ВСЕ ЗЕМЛИ были соединены между собой, а ВСЕ ВЫВОДЫ ПИТАНИЯ - между собой. AVCC может быть запитан ерез фильтр, но обязательно запитан.

в железе у вас с питанием все, как нужно?

Re: Atmega 64 + АЦП которое не хочит работать

Добавлено: Вт мар 17, 2015 19:00:17
misterkuk
ARV писал(а):схему вы не публикуете... жаль.
Мне не жалко, просто её нет. Вот скрин печатки и файл лайаута в придачу. Скажу сразу что кренки 12 и 5 вольт на печатке подписаны наоборот, TL431 вообще не впаяна и к AREF просто кондёр на землю. Землю аналоговую и питание старался не сводить вместе возле мк.
Дописал код и выходит что АЦП работает. Ключевые моменты выводил на экран. Флаги дёргаются, всё как нужно. Только вот результат измерения всегда выходит 0. Всё больше думаю что что-то с мк случилось.
Прямая ссылка: http://i.piccy.info/i9/3674ededf1f9dfe5 ... /mbk64.jpg
ИзображениеИзображение

Re: Atmega 64 + АЦП которое не хочит работать

Добавлено: Ср мар 18, 2015 08:11:37
Mishany
пробовать для начала подкидывать фиксированые значения от ацп что б проверить вычислительную часть программы если дисплей начнет показывать разбираться с преобразованиями ацп

Re: Atmega 64 + АЦП которое не хочит работать

Добавлено: Ср мар 18, 2015 10:12:20
misterkuk
Mishany писал(а):пробовать для начала подкидывать фиксированые значения от ацп
Да пробывал. Функция чтения АЦП возвращает в конце return ADCW;
Я написал return ADCW=555;
( Кпримеру) Значания напряжениия вывелись на дисплей. тут всё чотко. тоесть ацп не меряет напряжения, точней после замера результат нулевой.

Re: Atmega 64 + АЦП которое не хочит работать

Добавлено: Ср мар 18, 2015 10:37:44
eess9
Меряли напряжение непосредственно на ноге МК (канале АЦП)? Еще раз внимательно пройдитесь по коду и убедитесь, что точно у вас нигде нога канала не настраевается на выход. Это можно поиском сделать (DDRA, например, и вдумчиво посмотреть что будет в конкретном бите регистра).

Re: Atmega 64 + АЦП которое не хочит работать

Добавлено: Ср мар 18, 2015 12:12:10
misterkuk
eess9 писал(а):Меряли напряжение непосредственно на ноге МК (канале АЦП)? .
Мерял не посредственно на ножках мк. Проверил направление портов. Смотрел примеры работы с АЦП. Всё точно так же. Выбрал ИОН внутренний 2.56- безрезультатно. Пробывал подать напряжение на другие ноги АЦП и считать с них- безрезультатно. Результат любого считывания равен ную. Там где я брал этот проц он сейчас стоит 80 грн. Ещё буду пробывать, ведь не очень обрадует если прейдётся купить новый камень и получить тот же результат.