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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Чт июн 26, 2014 15:27:55

Сообщение 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, Успехов :)
Реклама
Открыл глаза
Сообщения: 52
Зарегистрирован: Чт дек 12, 2013 02:28:20

Сообщение beniamin91 »

Starmarik Спасибо за помощь, сейчас скачаю протеус и буду тестировать.
Желаю всем удачи.
Реклама
Chettuser

Сообщение Chettuser »

... новеньких F1 давно вроде не было. Ориентироваться - простое F0, сложнее F3, F4. А F2 да уже и F1, мне лично, пока думаю в ближайшем не потребуются.
И все же - есть ли будущее у массовой F1? В основном на aliexpress продаются как раз таки они, а вот F2 и F3 попадаются не часто. Как насчёт простых F0?
Кстати, цены на более взрослые МК не такие уж и маленькие. А везде пишут о том, что STM дешевле. Возможно это раньше было?
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение 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 Грн.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10: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 грн. ...
"Я не даю готовых решений, я заставляю думать!"(С)
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

STM32F103VCT6 Микроконтроллер

Надо срочно покупать, а то тут дороже:
http://www.compel.ru/infosheet/ST/STM32F103VCT6/
может наши барыги ценник забыли сменить :))
Реклама
Chettuser

Сообщение Chettuser »

Возник вопрос в очередной раз:
Допустим есть порт PORTB из 8 пин. Соответственно имеем 8 бит регистра.
А мне нужно обращаться к нему как будто к двум портам, например биты 0,1,2,3 этого порта - это некий виртуальный порт PORTX, к которому также хотелось бы обращаться как к регистру. И есть порт PORTY - биты 4,5,6, с аналогичным доступом.
Можно ли это организовать например через #define ? В голову что то ничего не приходит.
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Можно конечно. Только #define это директива препроцессора, позволяющая делать необходимые абстракции для программиста. А на деле всеравно будет сложная работа с битами порта, причем эта директива ограничена однострочными абстракциями, первый вариант еще можно легко реализовать при помощи дефайна, а для второго варианта уже нужен макрос или подпрограмма.
Макрос будет немного быстрее но сильно использует память а подпрограмма выполняться будет дольше но съекономит флеш-память что будет заметно если данная функция используется очень часто. Но на 16 тактов дольше выполнение.

Но лучше этой фигней не страдать, а создать в прошивке некий HAL, где доступ к железу будет разграничен от основного алгоритма и осуществляться через строго заданные интерфейсы. В таком случае у тебя не будет никаких портов, только функции высокого уровня(вроде "отправить байт") а вся реализация будет отделена логически. Вобщем, вариантов может быть масса главный критерий - удобство использования.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

Мудрый кот
Аватара пользователя
Сообщения: 1815
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение 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)
На запись маленько сложнее...
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

директива #define пишется только в одну строку, макрос делается при помощи пары директив .macro и .endmacro между ними можно запихнуть целую простыню текста с подставляемыми параметрами.
Контактная информация:
Мудрый кот
Аватара пользователя
Сообщения: 1815
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Alexeyslav, вы, наверное, про ассемблер, если .macro упомянули. А я про Си. Именно поэтому я смайликов наставил ранее - непонятно о чём речь.

На Си можно вот так записать.

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

#define GET_BITS(port, mask,shift) ( \
  (port & mask) >> shift \
)
И поэтому смайлик про однострочность был...
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

макросы обрабатываются препроцессором, поэтому язык значения не имеет. на С тоже работает.

так дефайном можно сделать пару строк, больше будет очень не удобно... а уж про параметры в такой макроподстановки уже молчу. А вывих мозга получить исследуя программу с такими дефайнами - как нефиг делать.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

oleg110592 писал(а):
мне нужно обращаться к нему...
это не моя писал(а) :o
в последней поделке забил на всякие макросы - по дедовски как то надежнее:

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

    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;
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

Сообщение amd9800 »

А чем тогда макрос от функции отличается?
Мудрый кот
Аватара пользователя
Сообщения: 1815
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Alexeyslav писал(а):макросы обрабатываются препроцессором, поэтому язык значения не имеет. на С тоже работает.
Что-то про .macro ничего вот тут, например, нет https://gcc.gnu.org/onlinedocs/cpp/
Все директивы начинаются с символа #

И в какой среде для языка Си работают макросы в виде .macro .endmacro ???

amd9800, код функции вызывается, а код макроса поставляется каждый раз в то место, где он указывается.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Друг Кота
Сообщения: 5432
Зарегистрирован: Вт фев 21, 2012 13:51:55
Откуда: Начинающий

Сообщение petrenko »

А чем тогда макрос от функции отличается?
:))) :))) :)))
Макрос - нечто вроде синонима - подставляется вместо него во всех местах, где он встретится тот текст, который в определении оного.
Ну в общем учите матчасть..
< виртуальная "кнопочка" >--( WWW ) <- Убедительная просьба интересующимся старыми компьютерами типа РК86 - не пишите в теме в барахолке, пишите Ваши вопросы в ( лс ) пожалуйста
Контактная информация:
Chettuser

Сообщение Chettuser »

Всё! У меня мысли кончились, прошу помощи.
Для начала несколько картинок:
Так должно быть, это программный вывод SPI 9-бит:
screenshot_1.png
(64.43 КБ) 382 скачивания
Так выходит с аппаратным выводом тех же 9 бит:
screenshot_2.png
(65.01 КБ) 337 скачиваний
Видны "лишние" короткие импульсы на чётных данных.

Микроконтроллер 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;
}
Никто не сталкивался? :oops:
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

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

Сообщение Kavka »

Alexeyslav, препроцессоры бывают разные. Не зря там написано "The C Preprocessor".
AvrAssembler2 умеет обрабатывать определения в стиле Си-шного препроцессора и знает что такое ".marco", однако cpp (GNU C Preprocessor) не знает что такое ".macro".
Не спорю, что само определение макроса можно рассматривать независимо от языка, и можно "ручками" сделать не типичную схему обработки исходника с использованием каких угодно средств. И, соответственно, можно попробовать прикрутить препроцессор от AvrAssembler2 к программе на Си - только зачем?
Alexeyslav писал(а):макрос делается при помощи пары директив .macro и .endmacro
Это для ассемблеров! Типично для ассемблеров.
Для Си, обычно, все делается через "#define". Посмотрите раздел 3 по ссылке про препроцессор для Си - как называется раздел и с помощью каких директив создаются макросы в Си.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Ответить

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