Мелкие вопросы по МК и ПЛИС.

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Сообщение спящий »

На асме сделал почти тоже самое,в протеусе работает,а вот это нет(У меня и так непрерывное преобразование,впринципе даже проферку на флаг необязательно.
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

а если так сделать?
Спойлер

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

#include <stdio.h>
#include <mega48.h>
#include <delay.h>
#include <string.h>
#include <io.h>

int x,y;

void main() {
DDRB=0xff;
DDRD=0xff;
DDRC=0b11111110;


#asm("sei")  ;
ADCSRA = 0b11100010;// ЗАПУСК ПРЕОБРАЗОВАНИЯ
ADCSRB = 0b00000000;
ADMUX =  0b01100000;
DIDR0 = 0b00000001;
while(1)
{
while (!( ADCSRA&(1<<4)));//ЖДЕМ ФЛАГ ГОТОВНОСТИ
 ADCSRA|=(1<<4); //Очистить флаг готовности 

PORTB=ADCH;
PORTD=ADCL;

x=ADCH;
y=ADCL;


}
}
 
Вы ведь не входите в прерывание, так что флаг прерывания некому очистить.И
если используете компилятор GCC лучше не активировать прерывания без блока их обработки.
Контактная информация:
Реклама
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Сообщение спящий »

всеравно нет,я испольтзую CV.
Вложения
Безымянный.GIF
(94.72 КБ) 310 скачиваний
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

А что мешает вам использовать родную функцию read_adc() или же обрабатывать результат в прерывании от Ацп?
Как то я тоже пытался в авторежиме использовать Ацп, не вышло, так и не понял в чем дело.Можно попробовать это в реальном устройстве.

Еще возможно просто частота преобразования для Ацп выбрана слишком высокая. Она должна быть в пределах 200кГц .
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Сообщение спящий »

read_adc() а как ее активировать? и какой (сейчас прозвучит иностранное слово) хидер(как программист, еще бы понимать) подключить? какой #include подключить.

Впрерывании непомогает,прерывание происходит, а значение не записывается(неизменяется).
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

В общем, как бы это повежливее сказать?
Есть такая штука как мастер кода, можно им легко воспользоваться.Значек расположен где то в середине.У меня возле кнопок программирования.Выглядит как звездочка или шестеренка.
Нажимаем на нее.Там можно выбрать тип контроллера, частоту работы.
Во вкладке ADC выбираем галку использовать ADC.Выбираем частоту преобразования.Короче разберетесь там все человеческим языком написано.И Google вам в помощь.Я про переводчик.
Хидеры CVAVR сам подключит.После нужных настроек нажимаете на Значек с шестеренкой уже в этом окне.И сохраняете все что предложит.

ВНИМАНИЕ это действительно только если проект новый без кода.
Если код уже написан, то можно скопировать нужные части автоматического кода нажав на кнопку предварительного просмотра левее шестеренки.
В поисках истины человек развивается.
Контактная информация:
Реклама
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Сообщение спящий »

Чет вообще неполучается, даже через этот мастер( посмотрите главный цикл,я правиьльно ввожу.
Спойлер#include <mega48.h>

#include <delay.h>

#define ADC_VREF_TYPE 0x60

// Read the 8 most significant bits
// of the AD conversion result
unsigned char 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 ADCH;
}

// Declare your global variables here
int x;
void main(void)
{
DDRB=256;
DDRC=0;
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B 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
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D 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
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2A output: Disconnected
// OC2B output: Disconnected
ASSR=0x00;
TCCR2A=0x00;
TCCR2B=0x00;
TCNT2=0x00;
OCR2A=0x00;
OCR2B=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
// Interrupt on any change on pins PCINT8-14: Off
// Interrupt on any change on pins PCINT16-23: Off
EICRA=0x00;
EIMSK=0x00;
PCICR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;
// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=0x00;
// Timer/Counter 2 Interrupt(s) initialization
TIMSK2=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
ADCSRB=0x00;

// ADC initialization
// ADC Clock frequency: 62,500 kHz
// ADC Voltage Reference: AVCC pin
// ADC Auto Trigger Source: Free Running
// Only the 8 most significant bits of
// the AD conversion result are used
// Digital input buffers on ADC0: Off, ADC1: On, ADC2: On, ADC3: On
// ADC4: On, ADC5: On
DIDR0=0x01;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0xA7;
ADCSRB&=0xF8;

while (1)
{
read_adc(x);
PORTB=x;
};
}
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

:facepalm: блин, похоже вам не стоит заниматься программированием.
Вы разве не поняли, что функцией пользоваться нужно read_adc(номер ноги Ацп);
Ваш пример

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

PORTB=read_adc(0); 
Контактная информация:
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Сообщение спящий »

Просто я думал что DIDR0=0x01; это и есть номер входа в АЦП,а так спасибо получилось.
а при
read_adc(x); x присваевается значение с функции(прерывания)


я написал
PORTB=read_adc(x); и тоже пашет)
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Didr вроде как выключает цифровой канал с ноги.
А номер ноги с которой происходит измерение, устанавливается ADMUX тремя последними битами.
Именно поэтому переменную adc_input смешивают с этим регистром

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

 unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);  
А возвращает функция как раз значение измерения Ацп.То есть саму команду вызова функции можно использовать вместо переменной.
Контактная информация:
aam
Собутыльник Кота
Аватара пользователя
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

Сообщение aam »

Всем привет!
Подскажите, кто сталкивался, чем еще отличается ATtiny4313 от ATtiny2313 кроме вдвое бОльшей памяти? Является ли 4313 полным аналогом (кроме памяти), т. е. впаял в ту же плату, зашил ту же прошивку?
Я конечно могу посмотреть ДШ, но сравнивать все характеристики очень геморно, решил сначала здесь спросить, может кто точно знает...

спящий,
read_adc(x) - это функция, Х- это ее параметр, т. е. через Х внутрь функции read_adc передается значение (в данном случае номер входа АЦП). Но никак не наоборот (точнее можно сделать так чтобы значение параметра изменялось функцией, но тогда ей уже надо передавать указатель).
В Си функции могут возвращать значения (результат работы функции). В данном случае функция возвращает результат преобразования - значение типа int16.
Друг Кота
Аватара пользователя
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

aam писал(а):сравнивать все характеристики очень геморно
Достаточно сравнить Список регистров, КМК.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

aam писал(а):... еще отличается ATtiny4313 от ATtiny2313 кроме вдвое бОльшей памяти? Является ли 4313 полным аналогом (кроме памяти), т. е. впаял в ту же плату, зашил ту же прошивку?
Да ничем, кроме объёма памяти, они не отличаются, даже DS один
aam
Собутыльник Кота
Аватара пользователя
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

Сообщение aam »

akl, спасибо.
Открыл глаза
Сообщения: 40
Зарегистрирован: Вт янв 18, 2011 08:15:32

Сообщение Ruslan-maniak »

Вобщем вот какое дело. Есть идея запустить FAT на FRAMе. Использую STM32F207. Ни где не могу найти информацию, делал ли кто-нить подобное? Все используют только флэшки которые форматируют на компе. А хотя бы теоретически можно ли ФРАМку с СТМки форматнуть?
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Ruslan-maniak писал(а):Вобщем вот какое дело. Есть идея запустить FAT на FRAMе. Использую STM32F207. Ни где не могу найти информацию, делал ли кто-нить подобное? Все используют только флэшки которые форматируют на компе. А хотя бы теоретически можно ли ФРАМку с СТМки форматнуть?
Да уж, по веселили. :))
На дискете - можно. На жёстком диске - можно. На влэшке, карте памяти - можно. А с какого перепугу нельзя на FRAM этого сделать?
Память - это всего лишь память (микросхема, носитель информации, хранилище). FAT - это способ организации данных (файлов), и без разницы на каком носителе.
Так что хоть в тетрадке в клеточку организовывайте FAT - карандаш плюс стирашка и вперёд. :)
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Нельзя. По той простой причине, что как правило FAT-таблица отъедает приличный кусок. У вас есть микросхема FRAM на 4Мб чтобы под файлы реально использовать только два? Конечно можно как компромисс использовать FAT12 но однако - такой же переводняк весьма ценного ресурса. Да и имеет ли смысл поддерживать FAT на микросхеме памяти которая никогда не сможет быть подключена самостоятельно без участия контроллера к компьютеру? Если транзитом через контроллер то FAT можно банально эмулировать, а на FRAM хранить файлы в собственном формате, предполагающем бОльшую экономию ценных ячеек.
Контактная информация:
Встал на лапы
Сообщения: 91
Зарегистрирован: Сб авг 11, 2012 22:31:57

Сообщение nikityan »

Добрый день, я начинающий в сфере МК. Сделал плату для ATMEGA32A, написал программу в IAR эмулируюшую светофор. Работаю с портами: A B D спокойно. Могу посылать 1 и 0. Но вот проблемма с портом C4 и C5. C4 не реагирует на посылаемую 1, светодиод не горит. C5 даже если контроллер без прошивки светиться и держит логическую 1. я просто не могу избавиться от напряжения на порте C5.
Вложения
ABCD0007.JPG
(98.12 КБ) 265 скачиваний
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

А ты даташит смотрел? какие функции висят на порту С4 и С5, если там UART - то так и должно быть если UART включен.

Вот на картинке в гугле видно что эти порты имеют функцию TDI и TDO - это соответствует активному SPI-интерфейсу, отключи его и порты вернутся в твое распоряжение.
Контактная информация:
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

nikityan писал(а):... Сделал плату для ATMEGA32A ... проблемма с портом C4 и C5. C4 не реагирует на посылаемую 1, светодиод не горит. C5 даже если контроллер без прошивки светиться и держит логическую 1. я просто не могу избавиться от напряжения на порте C5.
Правильно. Эти лапы при запрограммированном FUSE-бит JTAGEN так и будут себя вести. Попробуйте снять этот бит.
Ответить

Вернуться в «Разные вопросы по МК»