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

Обсуждаем контроллеры компании Atmel.
Ответить
Мучитель микросхем
Сообщения: 400
Зарегистрирован: Сб апр 17, 2010 10:30:13

Сообщение 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 (); 
  }
}
Вложения
mega64adc.rar
Исходник и файл протеуса
(201.68 КБ) 172 скачивания
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

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

В общем, как минимум, перепроверьте все эти |= (0<<bit), так как они делают не то, что Вы от них ожидаете (не обнуляют бит).
Контактная информация:
Реклама
Мучитель микросхем
Сообщения: 400
Зарегистрирован: Сб апр 17, 2010 10:30:13

Сообщение misterkuk »

На самом деле, эта строка ничего не делает.
Проблем с ней не возникало, всегда так пишу. Но поменял на #asm("sei") и #asm("cli")
эта обнуляет весь SFIOR.
Открыл пару учебников. Судя по ним этой командой значение байта ACME устанавливаю в 0 в регистре SFIOR.
Я проверил как вы и сказали. ничего не поменялось. Тот же SFIOR=(0<<ACME); если писать ACME=0; то ошибка.
Тогда SFIOR|=0x... писать. Я посмотрел в симуляции и весь SFIOR равен 0. Я удалил эту строчку. В итоге програма работала как и работает. В протеусе всё измеряется и выводится, в железе на собранной плате Вместо ожидаемого напряжения горят нули.
Контактная информация:
Мучитель микросхем
Сообщения: 400
Зарегистрирован: Сб апр 17, 2010 10:30:13

Сообщение misterkuk »

Ещё в новой плате мк немного тёплый. Цепи питания разведены верно. Питаю от ЮСб. По питанию у мк стоят кондёры в 0.1мф.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

в железе у вас с питанием все, как нужно?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Мучитель микросхем
Сообщения: 400
Зарегистрирован: Сб апр 17, 2010 10:30:13

Сообщение misterkuk »

ARV писал(а):схему вы не публикуете... жаль.
Мне не жалко, просто её нет. Вот скрин печатки и файл лайаута в придачу. Скажу сразу что кренки 12 и 5 вольт на печатке подписаны наоборот, TL431 вообще не впаяна и к AREF просто кондёр на землю. Землю аналоговую и питание старался не сводить вместе возле мк.
Дописал код и выходит что АЦП работает. Ключевые моменты выводил на экран. Флаги дёргаются, всё как нужно. Только вот результат измерения всегда выходит 0. Всё больше думаю что что-то с мк случилось.
Прямая ссылка: http://i.piccy.info/i9/3674ededf1f9dfe5 ... /mbk64.jpg
ИзображениеИзображение
Вложения
mbk64.rar
(110.58 КБ) 143 скачивания
Контактная информация:
Реклама
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение Mishany »

пробовать для начала подкидывать фиксированые значения от ацп что б проверить вычислительную часть программы если дисплей начнет показывать разбираться с преобразованиями ацп
Мучитель микросхем
Сообщения: 400
Зарегистрирован: Сб апр 17, 2010 10:30:13

Сообщение misterkuk »

Mishany писал(а):пробовать для начала подкидывать фиксированые значения от ацп
Да пробывал. Функция чтения АЦП возвращает в конце return ADCW;
Я написал return ADCW=555;
( Кпримеру) Значания напряжениия вывелись на дисплей. тут всё чотко. тоесть ацп не меряет напряжения, точней после замера результат нулевой.
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

Меряли напряжение непосредственно на ноге МК (канале АЦП)? Еще раз внимательно пройдитесь по коду и убедитесь, что точно у вас нигде нога канала не настраевается на выход. Это можно поиском сделать (DDRA, например, и вдумчиво посмотреть что будет в конкретном бите регистра).
Мучитель микросхем
Сообщения: 400
Зарегистрирован: Сб апр 17, 2010 10:30:13

Сообщение misterkuk »

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

Вернуться в «AVR»