Страница 519 из 628
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Чт июл 03, 2014 21:02:33
Starmarik
beniamin91 держи код, коменты на украинском, думаю, разберешся
Спойлер
Код: Выделить всё
#include <tiny13.h>
#include <delay.h>
unsigned int m_sec=0x00;//переменная мсек
unsigned int tim=0x00; //таймер
unsigned char min=0x00;//переменная мин
unsigned char hour=0x00;//переменная час
unsigned char count=0x00;
unsigned int counter=0x00;
// Timer 0 output compare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_compa_isr(void) //прерывания по совпадению
{
m_sec++; //переменная 1/100 секунды увеличивается
counter++;
}
// Timer 0 output compare B interrupt service routine
interrupt [TIM0_COMPB] void timer0_compb_isr(void)
{
// Place your code here
}
void reset() //обнулення змінних
{
m_sec=0;min=0;hour=0;tim=0;
}
void main(void)
{
// 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
// Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=Out
// State5=T State4=P State3=P State2=0 State1=0 State0=0
PORTB=0x18;
DDRB=0x07;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 9,375 kHz
// Mode: CTC top=OCR0A
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x02;
TCCR0B=0x05;
TCNT0=0x00;
OCR0A=0x5D;
OCR0B=0x00;
// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x0C;
// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;
DIDR0=0x00;
// ADC initialization
// ADC disabled
ADCSRA=0x00;
// Global enable interrupts
#asm("sei")
while (1)
{
/*ТАЙМЕР ВИКЛЮЧЕННЯ ФІЛЬТРА*/
if(!PINB.3){PORTB.2=1;}
if(counter==100){count++;counter=0;}
if(count==10){PORTB.2=0;count=0;}
/*ГЕНЕРАЦІЯ ХВИЛИН І ГОДИН*/
if(m_sec==3000){tim++;} //30-секундний таймер для автокормушки
if(m_sec==6000){m_sec=0;min++;} //1 хвилина
if(min==60){min=0; hour++;} //1 година
/*КОРМУШКА*/
//запуск автоматичної кормушки на 30 секунд
if(hour==0&min==0&tim==0){PORTB.0=1;tim=0;}
else{PORTB.0=0;}
/*СВІТЛО*/
if(hour==0){PORTB.1=1;}//включення світла одразу після запуску
if(hour==4){PORTB.1=0;}//виключення світла через 4 години
if(hour==24){hour=0;} //24 години
/*ОБНУЛЕННЯ ТАЙМЕРА*/
if(!PINB.4){reset();} //обнулення таймера
}
}
На счет того кода, который ты написал, то там действительно ничего нет

Извини за критику

Я сам начинающий, но учусь, учусь и учусь. На счет подключения датчика, погугли в нете, есть готовые примеры подключения к avr, для начала как раз, чтоб в коде разобраться, и скачай Протеус, удобно проверять виртуально работу схемы и программу. Из моего кода выбери себе генерацию времени, и таймер. Да, чуть не забыл - код писан в CodeVisionAVR, Успехов

Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Пт июл 04, 2014 01:11:33
beniamin91
Starmarik Спасибо за помощь, сейчас скачаю протеус и буду тестировать.
Желаю всем удачи.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Сб июл 05, 2014 09:39:43
Chettuser
... новеньких F1 давно вроде не было. Ориентироваться - простое F0, сложнее F3, F4. А F2 да уже и F1, мне лично, пока думаю в ближайшем не потребуются.
И все же - есть ли будущее у массовой F1? В основном на aliexpress продаются как раз таки они, а вот F2 и F3 попадаются не часто. Как насчёт простых F0?
Кстати, цены на более взрослые МК не такие уж и маленькие. А везде пишут о том, что STM дешевле. Возможно это раньше было?
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Сб июл 05, 2014 11:42:03
oleg110592
берем самый дешевый из F1:
STM32F100C4T6B ARM Cortex-M3 32-bit, Flash: 16K, RAM: 4K, UART: 2, АЦП: 10 x 12bit, ШИМ: 6 x 16bit Тип корпуса: LQFP48
Цена 23,00 Грн
сравниваем с F0:
STM32F051C6T6 32бит ARM Cortex M0, 48МГц, 32кб Flash, 4кб ОЗУ, SPI, I2C, I2S, 2xUSART, CEC, 9 таймеров, АЦП 12 бит * 10 каналов, 12бит *ЦАП Тип корпуса: LQFP48
Цена 26,75 Грн
STM32F030C8T6
32бит ARM Cortex M0, 48МГц, 64кб Flash, 8кб ОЗУ, SPI, I2C, I2S, 1xUSART, CEC, 6 таймеров, АЦП 12 бит * 10 каналов, 12бит *ЦАП
Тип корпуса: LQFP48 Цена 26,00 Грн
STM32F030C6T6 32бит ARM Cortex M0, 48МГц, 32кб Flash, 4кб ОЗУ, SPI, I2C, 1xUSART, 4 таймера, АЦП 12 бит * 12 каналов, 39 GPIO, Цена 59.14р (в гривнах не нашел)
Если не волнует Cortex-M3, то какой выбор делаем?
цены на более взрослые МК не такие уж и маленькие
На то они и взрослые - у нас самый дешевый:
STM32F372V8T6 Ядро: ARM Cortex-M4: FLASH: 64 КБайт: RAM: 16 КБайт: АЦПканалов: 25: АЦПразр: 16: ЦАП: 1 Fcore: 72 Мгц
Цена 61,00 Грн
чуть дороже:
STM32F401VBT6 ARM Cortex-M4 Converters : A/D 16x12b; RAM Size : 64K x 8; ;FLASH: 128KB ; Number of I/O : 81; Peripherals : DMA, I2S, POR, PWM, WDTIrDA, LIN, SDIO, SPI, UART/USART, USB OTG; Speed : 84MHz
Цена 76,75 Грн.
В принципе недорого, для сравнения взрослый другой фирмы:
ATmega1280-16AU AVR 8-bit, Flash: 128K, RAM: 8K, EEPROM: 4K, UART: 4, АЦП: 16 x 10bit, ШИМ: 16 x 16bit Тип корпуса: TQFP100 Производитель: ATMEL
Цена 204,50 Грн.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Сб июл 05, 2014 12:06:34
HHIMERA
Берём тот камень, какой нужен... и не паримся...
Нужна периферия... скорость не так нужна... подешевле - F0XX или F100...
Нужна математика (простая) и скорость - F103 или F2XX...
Нужно всё - F4XX...
А перспективность/неперспектипность это от лешего... У всех линеек больше общего, чем разного... Изучая одну линейку неизбежно изучаешь и все остальные...
В принципе недорого
STM32F103VCT6 Микроконтроллер
Микроконтроллер: ARM Cortex-M3 32-bit, Flash: 256K, RAM: 48K, UART: 5, АЦП: 16 x 12bit (1MSPS), ЦАП: 2 x 12bit, ШИМ: 28 x 16bit
Тип корпуса: LQFP100
Цена - 48 грн. ...
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Сб июл 05, 2014 12:21:19
oleg110592
STM32F103VCT6 Микроконтроллер
Надо срочно покупать, а то тут дороже:
http://www.compel.ru/infosheet/ST/STM32F103VCT6/
может наши барыги ценник забыли сменить

Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вс июл 06, 2014 21:13:19
Chettuser
Возник вопрос в очередной раз:
Допустим есть порт PORTB из 8 пин. Соответственно имеем 8 бит регистра.
А мне нужно обращаться к нему как будто к двум портам, например биты 0,1,2,3 этого порта - это некий виртуальный порт PORTX, к которому также хотелось бы обращаться как к регистру. И есть порт PORTY - биты 4,5,6, с аналогичным доступом.
Можно ли это организовать например через #define ? В голову что то ничего не приходит.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вс июл 06, 2014 21:29:10
Alexeyslav
Можно конечно. Только #define это директива препроцессора, позволяющая делать необходимые абстракции для программиста. А на деле всеравно будет сложная работа с битами порта, причем эта директива ограничена однострочными абстракциями, первый вариант еще можно легко реализовать при помощи дефайна, а для второго варианта уже нужен макрос или подпрограмма.
Макрос будет немного быстрее но сильно использует память а подпрограмма выполняться будет дольше но съекономит флеш-память что будет заметно если данная функция используется очень часто. Но на 16 тактов дольше выполнение.
Но лучше этой фигней не страдать, а создать в прошивке некий HAL, где доступ к железу будет разграничен от основного алгоритма и осуществляться через строго заданные интерфейсы. В таком случае у тебя не будет никаких портов, только функции высокого уровня(вроде "отправить байт") а вся реализация будет отделена логически. Вобщем, вариантов может быть масса главный критерий - удобство использования.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вс июл 06, 2014 21:39:18
oleg110592
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Пн июл 07, 2014 06:12:59
Kavka
Alexeyslav писал(а):причем эта директива ограничена однострочными абстракциями, первый вариант еще можно легко реализовать при помощи дефайна, а для второго варианта уже нужен макрос
Хмм... Под "однострочными" вы что имеете в виду? Исходную запись или результат?
А макрос не через define делается?
oleg110592 писал(а):мне нужно обращаться к нему как будто к двум портам, например биты 0,1,2,3 этого порта - это некий виртуальный порт PORTX, к которому также хотелось бы обращаться как к регистру. И есть порт PORTY - биты 4,5,6, с аналогичным доступом.
Если на чтение, то можно, например, вот так сделать (поверх порта A).
#define GET_PORTX (PINA&0x0f)
#define GET_PORTY ((PINA&0x70)>>4)
На запись маленько сложнее...
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Пн июл 07, 2014 06:22:57
Alexeyslav
директива #define пишется только в одну строку, макрос делается при помощи пары директив .macro и .endmacro между ними можно запихнуть целую простыню текста с подставляемыми параметрами.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Пн июл 07, 2014 07:16:18
Kavka
Alexeyslav, вы, наверное, про ассемблер, если .macro упомянули. А я про Си. Именно поэтому я смайликов наставил ранее - непонятно о чём речь.
На Си можно вот так записать.
Код: Выделить всё
#define GET_BITS(port, mask,shift) ( \
(port & mask) >> shift \
)
И поэтому смайлик про однострочность был...
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Пн июл 07, 2014 07:27:51
Alexeyslav
макросы обрабатываются препроцессором, поэтому язык значения не имеет. на С тоже работает.
так дефайном можно сделать пару строк, больше будет очень не удобно... а уж про параметры в такой макроподстановки уже молчу. А вывих мозга получить исследуя программу с такими дефайнами - как нефиг делать.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Пн июл 07, 2014 07:51:21
oleg110592
oleg110592 писал(а):
мне нужно обращаться к нему...
это не моя писал(а)
в последней поделке забил на всякие макросы - по дедовски как то надежнее:
Код: Выделить всё
TIM2->SR1 &= ~TIM2_SR1_UIF; // Очистка флага прерывания по обновлению
UP_GPIO_DDR &= ~UP; // Ножка конфигурируется на ввод
ENT_GPIO_DDR &= ~ENT; // Ножка конфигурируется на ввод
DWN_GPIO_DDR &= ~DWN; // Ножка конфигурируется на ввод
CAT1_GPIO_ODR |= CAT1; // cathodes off
CAT2_GPIO_ODR |= CAT2;
CAT3_GPIO_ODR |= CAT3;
CAT4_GPIO_ODR |= CAT4;
SEGA_GPIO_ODR &= ~SEGA; //segment off
SEGB_GPIO_ODR &= ~SEGB;
SEGC_GPIO_ODR &= ~SEGC;
SEGD_GPIO_ODR &= ~SEGD;
SEGE_GPIO_ODR &= ~SEGE;
SEGF_GPIO_ODR &= ~SEGF;
SEGG_GPIO_ODR &= ~SEGG;
SEGH_GPIO_ODR &= ~SEGH;
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Пн июл 07, 2014 08:41:09
amd9800
А чем тогда макрос от функции отличается?
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Пн июл 07, 2014 08:43:34
Kavka
Alexeyslav писал(а):макросы обрабатываются препроцессором, поэтому язык значения не имеет. на С тоже работает.
Что-то про .macro ничего вот тут, например, нет
https://gcc.gnu.org/onlinedocs/cpp/
Все директивы начинаются с символа #
И в какой среде для языка Си работают макросы в виде .macro .endmacro ???
amd9800, код функции вызывается, а код макроса поставляется каждый раз в то место, где он указывается.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Пн июл 07, 2014 08:45:52
petrenko
А чем тогда макрос от функции отличается?
Макрос - нечто вроде синонима - подставляется вместо него во всех местах, где он встретится тот текст, который в определении оного.
Ну в общем учите матчасть..
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Пн июл 07, 2014 19:50:21
Chettuser
Всё! У меня мысли кончились, прошу помощи.
Для начала несколько картинок:
Так должно быть, это программный вывод SPI 9-бит:
Так выходит с аппаратным выводом тех же 9 бит:
Видны "лишние" короткие импульсы на
чётных данных.
Микроконтроллер PIC16F887, код инициализации SPI:
Спойлер
Код: Выделить всё
//----- SPI -------
SMP = 0; // фиксация данных в середине
CKE = 0; // данные по фронту
SSPEN = 0; // запретить SPI
CKP = 0; // в состоянии покоя низкий уровень
SSPM0 = 0; // F(SPI)=F(OSC)/64 (312.5кГц)
SSPM1 = 1; // (0000 = F/4, 0001 = F/16, 0010 = F/64, 0011= TMR2/2)
SSPM2 = 0;
SSPM3 = 0;
//-----------------------
Выводится инкрементируемая переменная.
Сам вывод:
Спойлер
Код: Выделить всё
void Lcd_write(char cd,unsigned char c)
{
CS = 0; // Разрешаем LCD
SCLK = 0;
SDA = cd; // Передаем 9-й бит вручную
SCLK = 1;
__delay_us(1); // Импульс такта
SCLK = 0;
SSPIF = 0;
SSPEN = 1; // Разрешить SPI
// SSPBUF = ReversByte(c); // Передаем по SPI остальные 8 бит
SSPBUF = c;
while (!SSPIF)
{
asm("nop"); // Ожидаем окончания аппаратной передачи
}
SSPIF = 0;
SSPEN = 0; // Запретить SPI
SDA = 0;
CS = 1;
return;
}
Никто не сталкивался?

Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Пн июл 07, 2014 22:30:09
Alexeyslav
Макросы не имеют никакого отношения к среде и языку на котором пишешь, макросы работают непосредственно перед компиляцией на уровне препроцессора поскольку они ГЕНЕРИРУЮТ исходник.
В макрос можно передать к примеру часть имени функции, склеить внутри полное имя и вызвать эту функцию, что обычным процедурам в рантайме недоступно.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт июл 08, 2014 11:08:02
Kavka
Alexeyslav, препроцессоры бывают разные. Не зря там написано "The C Preprocessor".
AvrAssembler2 умеет обрабатывать определения в стиле Си-шного препроцессора и знает что такое ".marco", однако cpp (GNU C Preprocessor) не знает что такое ".macro".
Не спорю, что само определение макроса можно рассматривать независимо от языка, и можно "ручками" сделать не типичную схему обработки исходника с использованием каких угодно средств. И, соответственно, можно попробовать прикрутить препроцессор от AvrAssembler2 к программе на Си - только зачем?
Alexeyslav писал(а):макрос делается при помощи пары директив .macro и .endmacro
Это для ассемблеров! Типично для ассемблеров.
Для Си, обычно, все делается через "#define". Посмотрите раздел 3 по ссылке про препроцессор для Си - как называется раздел и с помощью каких директив создаются макросы в Си.