Мелкие вопросы по МК и ПЛИС.
Re: Мелкие вопросы по МК и ПЛИС.
На асме сделал почти тоже самое,в протеусе работает,а вот это нет(У меня и так непрерывное преобразование,впринципе даже проферку на флаг необязательно.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
а если так сделать?
Вы ведь не входите в прерывание, так что флаг прерывания некому очистить.И
если используете компилятор GCC лучше не активировать прерывания без блока их обработки.
Спойлер
Код: Выделить всё
#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 лучше не активировать прерывания без блока их обработки.
Re: Мелкие вопросы по МК и ПЛИС.
всеравно нет,я испольтзую CV.
- Вложения
-
- Безымянный.GIF
- (94.72 КБ) 308 скачиваний
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
А что мешает вам использовать родную функцию read_adc() или же обрабатывать результат в прерывании от Ацп?
Как то я тоже пытался в авторежиме использовать Ацп, не вышло, так и не понял в чем дело.Можно попробовать это в реальном устройстве.
Еще возможно просто частота преобразования для Ацп выбрана слишком высокая. Она должна быть в пределах 200кГц .
Как то я тоже пытался в авторежиме использовать Ацп, не вышло, так и не понял в чем дело.Можно попробовать это в реальном устройстве.
Еще возможно просто частота преобразования для Ацп выбрана слишком высокая. Она должна быть в пределах 200кГц .
Re: Мелкие вопросы по МК и ПЛИС.
read_adc() а как ее активировать? и какой (сейчас прозвучит иностранное слово) хидер(как программист, еще бы понимать) подключить? какой #include подключить.
Впрерывании непомогает,прерывание происходит, а значение не записывается(неизменяется).
Впрерывании непомогает,прерывание происходит, а значение не записывается(неизменяется).
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
В общем, как бы это повежливее сказать?
Есть такая штука как мастер кода, можно им легко воспользоваться.Значек расположен где то в середине.У меня возле кнопок программирования.Выглядит как звездочка или шестеренка.
Нажимаем на нее.Там можно выбрать тип контроллера, частоту работы.
Во вкладке ADC выбираем галку использовать ADC.Выбираем частоту преобразования.Короче разберетесь там все человеческим языком написано.И Google вам в помощь.Я про переводчик.
Хидеры CVAVR сам подключит.После нужных настроек нажимаете на Значек с шестеренкой уже в этом окне.И сохраняете все что предложит.
ВНИМАНИЕ это действительно только если проект новый без кода.
Если код уже написан, то можно скопировать нужные части автоматического кода нажав на кнопку предварительного просмотра левее шестеренки.
Есть такая штука как мастер кода, можно им легко воспользоваться.Значек расположен где то в середине.У меня возле кнопок программирования.Выглядит как звездочка или шестеренка.
Нажимаем на нее.Там можно выбрать тип контроллера, частоту работы.
Во вкладке ADC выбираем галку использовать ADC.Выбираем частоту преобразования.Короче разберетесь там все человеческим языком написано.И Google вам в помощь.Я про переводчик.
Хидеры CVAVR сам подключит.После нужных настроек нажимаете на Значек с шестеренкой уже в этом окне.И сохраняете все что предложит.
ВНИМАНИЕ это действительно только если проект новый без кода.
Если код уже написан, то можно скопировать нужные части автоматического кода нажав на кнопку предварительного просмотра левее шестеренки.
В поисках истины человек развивается.
Re: Мелкие вопросы по МК и ПЛИС.
Чет вообще неполучается, даже через этот мастер( посмотрите главный цикл,я правиьльно ввожу.
#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;
};
}
Спойлер
#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;
};
}
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
блин, похоже вам не стоит заниматься программированием.Вы разве не поняли, что функцией пользоваться нужно read_adc(номер ноги Ацп);
Ваш пример
Код: Выделить всё
PORTB=read_adc(0); Re: Мелкие вопросы по МК и ПЛИС.
Просто я думал что DIDR0=0x01; это и есть номер входа в АЦП,а так спасибо получилось.
а при
read_adc(x); x присваевается значение с функции(прерывания)
я написал
PORTB=read_adc(x); и тоже пашет)
а при
read_adc(x); x присваевается значение с функции(прерывания)
я написал
PORTB=read_adc(x); и тоже пашет)
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
Didr вроде как выключает цифровой канал с ноги.
А номер ноги с которой происходит измерение, устанавливается ADMUX тремя последними битами.
Именно поэтому переменную adc_input смешивают с этим регистром
А возвращает функция как раз значение измерения Ацп.То есть саму команду вызова функции можно использовать вместо переменной.
А номер ноги с которой происходит измерение, устанавливается ADMUX тремя последними битами.
Именно поэтому переменную adc_input смешивают с этим регистром
Код: Выделить всё
unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); А возвращает функция как раз значение измерения Ацп.То есть саму команду вызова функции можно использовать вместо переменной.
Re: Мелкие вопросы по МК и ПЛИС.
Всем привет!
Подскажите, кто сталкивался, чем еще отличается ATtiny4313 от ATtiny2313 кроме вдвое бОльшей памяти? Является ли 4313 полным аналогом (кроме памяти), т. е. впаял в ту же плату, зашил ту же прошивку?
Я конечно могу посмотреть ДШ, но сравнивать все характеристики очень геморно, решил сначала здесь спросить, может кто точно знает...
спящий,
read_adc(x) - это функция, Х- это ее параметр, т. е. через Х внутрь функции read_adc передается значение (в данном случае номер входа АЦП). Но никак не наоборот (точнее можно сделать так чтобы значение параметра изменялось функцией, но тогда ей уже надо передавать указатель).
В Си функции могут возвращать значения (результат работы функции). В данном случае функция возвращает результат преобразования - значение типа int16.
Подскажите, кто сталкивался, чем еще отличается ATtiny4313 от ATtiny2313 кроме вдвое бОльшей памяти? Является ли 4313 полным аналогом (кроме памяти), т. е. впаял в ту же плату, зашил ту же прошивку?
Я конечно могу посмотреть ДШ, но сравнивать все характеристики очень геморно, решил сначала здесь спросить, может кто точно знает...
спящий,
read_adc(x) - это функция, Х- это ее параметр, т. е. через Х внутрь функции read_adc передается значение (в данном случае номер входа АЦП). Но никак не наоборот (точнее можно сделать так чтобы значение параметра изменялось функцией, но тогда ей уже надо передавать указатель).
В Си функции могут возвращать значения (результат работы функции). В данном случае функция возвращает результат преобразования - значение типа int16.
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Мелкие вопросы по МК и ПЛИС.
aam писал(а):сравнивать все характеристики очень геморно
Достаточно сравнить Список регистров, КМК.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Мелкие вопросы по МК и ПЛИС.
Да ничем, кроме объёма памяти, они не отличаются, даже DS одинaam писал(а):... еще отличается ATtiny4313 от ATtiny2313 кроме вдвое бОльшей памяти? Является ли 4313 полным аналогом (кроме памяти), т. е. впаял в ту же плату, зашил ту же прошивку?
Re: Мелкие вопросы по МК и ПЛИС.
akl, спасибо.
-
Ruslan-maniak
- Открыл глаза
- Сообщения: 40
- Зарегистрирован: Вт янв 18, 2011 08:15:32
Re: Мелкие вопросы по МК и ПЛИС.
Вобщем вот какое дело. Есть идея запустить FAT на FRAMе. Использую STM32F207. Ни где не могу найти информацию, делал ли кто-нить подобное? Все используют только флэшки которые форматируют на компе. А хотя бы теоретически можно ли ФРАМку с СТМки форматнуть?
Re: Мелкие вопросы по МК и ПЛИС.
Да уж, по веселили.Ruslan-maniak писал(а):Вобщем вот какое дело. Есть идея запустить FAT на FRAMе. Использую STM32F207. Ни где не могу найти информацию, делал ли кто-нить подобное? Все используют только флэшки которые форматируют на компе. А хотя бы теоретически можно ли ФРАМку с СТМки форматнуть?
На дискете - можно. На жёстком диске - можно. На влэшке, карте памяти - можно. А с какого перепугу нельзя на FRAM этого сделать?
Память - это всего лишь память (микросхема, носитель информации, хранилище). FAT - это способ организации данных (файлов), и без разницы на каком носителе.
Так что хоть в тетрадке в клеточку организовывайте FAT - карандаш плюс стирашка и вперёд.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
Нельзя. По той простой причине, что как правило FAT-таблица отъедает приличный кусок. У вас есть микросхема FRAM на 4Мб чтобы под файлы реально использовать только два? Конечно можно как компромисс использовать FAT12 но однако - такой же переводняк весьма ценного ресурса. Да и имеет ли смысл поддерживать FAT на микросхеме памяти которая никогда не сможет быть подключена самостоятельно без участия контроллера к компьютеру? Если транзитом через контроллер то FAT можно банально эмулировать, а на FRAM хранить файлы в собственном формате, предполагающем бОльшую экономию ценных ячеек.
Re: Мелкие вопросы по МК и ПЛИС.
Добрый день, я начинающий в сфере МК. Сделал плату для ATMEGA32A, написал программу в IAR эмулируюшую светофор. Работаю с портами: A B D спокойно. Могу посылать 1 и 0. Но вот проблемма с портом C4 и C5. C4 не реагирует на посылаемую 1, светодиод не горит. C5 даже если контроллер без прошивки светиться и держит логическую 1. я просто не могу избавиться от напряжения на порте C5.
- Вложения
-
- ABCD0007.JPG
- (98.12 КБ) 264 скачивания
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
А ты даташит смотрел? какие функции висят на порту С4 и С5, если там UART - то так и должно быть если UART включен.
Вот на картинке в гугле видно что эти порты имеют функцию TDI и TDO - это соответствует активному SPI-интерфейсу, отключи его и порты вернутся в твое распоряжение.
Вот на картинке в гугле видно что эти порты имеют функцию TDI и TDO - это соответствует активному SPI-интерфейсу, отключи его и порты вернутся в твое распоряжение.
Re: Мелкие вопросы по МК и ПЛИС.
Правильно. Эти лапы при запрограммированном FUSE-бит JTAGEN так и будут себя вести. Попробуйте снять этот бит.nikityan писал(а):... Сделал плату для ATMEGA32A ... проблемма с портом C4 и C5. C4 не реагирует на посылаемую 1, светодиод не горит. C5 даже если контроллер без прошивки светиться и держит логическую 1. я просто не могу избавиться от напряжения на порте C5.