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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение Meteor »

Грендайзер, ничо не понял. Но вот вариант в режиме помощник

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

-- SPI tranmitte/recieve

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

ENTITY SPI IS
PORT(
	clk:std_logic;--clock
	wr:in std_logic;-- data write
	sdin:in std_logic;--serial input pin
	DI:in std_logic_vector(7 downto 0);--data input
	DO:out std_logic_vector(7 downto 0);--data output
	sout:out std_logic;--serial output
	Bend:out std_logic--end serial exchange
	);
END SPI;

ARCHITECTURE spiex OF SPI IS

BEGIN
	PROCESS(clk,wr)
	variable cnt:unsigned(2 downto 0):="000";
	variable bf:std_logic_vector(7 downto 0);
	BEGIN
	if(wr='0')then
		cnt:="111";
		bf:=DI;--write data in buffer
		Bend<='0';
	else
		if(rising_edge(clk))then
			bf(7 downto 1):=bf(6 downto 0);
			bf(0):=sdin;
			sout<=bf(7);
			if(cnt="000")then
				Bend<='1';
			end if;
			cnt:=cnt-1;
		end if;
		DO<=bf;
	end if;
	end process;
end spiex;
Моделирование работы в ModelSim
Изображение
Вложения
spi.JPG
(23.49 КБ) 791 скачивание
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Контактная информация:
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 479
Зарегистрирован: Вт июн 02, 2009 22:38:40
Откуда: Город-герой Москва

Сообщение Грендайзер »

Здорово, спасибо, надо обмозговать эту программулину :) Но вот токо такая проблема, у меня никаких входных данных нет... у меня есть только проводок по которому идут синхроимпульсы, проводок, по которым передаются биты данных, и ещё один провод по которому у меня передаётся разрешающий импульс. За 30 нс до начала передачи данных, нужно установить сигнал разрешения в 0, затем передать данные, последовательно бит за битом, начиная со старшего (я не совсем втыкнул в систему, но по уму за один синхроимпульс передаётся 1 бит данных, верно?) и затем, спустя 30 нс после того, как ушёл последний (младший) бит данных необходимо перевести разрешающий сигнал в 1. Вот такая загангулина, и чёт я никак не допру, как это дело заделать :(
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск

Сообщение Chip115 »

И снова сдрасте )
Продолжаю развлекаться с UART в контроллере C8051F410
Хочу реализовать тупую передачу массива данных 1234 .
Но почему то в терминал приходят 01 01 02 03 04
Не могу разобраться в чем причина. Почему дважды приходит единица? Вот кусок кода.

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

#define EndOfTxFlag	TI0
#define EndOfRxFlag RI0
#define RxTxReg SBUF0
#define OnRx REN0=1;
#define OffRx REN0=0;

unsigned char UART_Buffer[4]={1,2,3,4};
char i=0,stop=0;
...
 while(stop!=1)
   {
   	
		RxTxReg=UART_Buffer[i];
		if(EndOfTxFlag==1 & i<4)
		{	
			i++;
			EndOfTxFlag=0;
		}	
		if (i==4)
			stop=1;		
   }
Задумано так.
Пока весь массив не передадим , продолжаем высылать поочередно данные из массива.
Как только счетчик i выходит за пределы массива - выставляем лог.1 в переменной stop и выходим из главного цикла.
Весь код в приложении.

И еще вопрос. как мне пересылать строки?
создать массив,скажем

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

char str[]="1234";
и аналогично пихать в регистр SBUF0 по одному символу?
Тогда получится что будет бесконечно передаваться '1' .
В АВР видел что через UART передают строки по средсвам

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

getchar(); 

тут такое реально провернуть? Если да,то как грамотно реализовать это?
Вложения
Коту.c
main
(5.44 КБ) 295 скачиваний
Последний раз редактировалось Chip115 Вт фев 22, 2011 20:16:54, всего редактировалось 1 раз.
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Контактная информация:
Родился
Сообщения: 1
Зарегистрирован: Вт фев 22, 2011 19:35:50

Сообщение pvsglks »

Привет всем. Подскажите, существует ли возможность в ATMega8 по сигналу ICP1 произвести сброс таймера аппаратно? Задача состоит в том, чтобы измерить период следования импульсов на ICP1, при этом нужно, чтобы после каждого заполнения ICR1, таймер обнулялся. Т.е. при обращении в любой момент времени к ICR1, можно было бы знать период последнего колебания. Применение прерываний в моем случае крайне нежелательно. Спасибо.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Chip115 писал(а):while(stop!=1)
{
if (i==4)
stop=1;
}
1) Я, конечно, не знаток СИ... Но почему бы просто не написать

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

while(stop!=4)
   {
	stop++;		
   }
Chip115, у вас программатор наверняка с отладчиком!?! Поставьте точки останова и смотрите :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск

Сообщение Chip115 »

ну я с отладчиком не очень... Пишу в оболочке Keil.
В отладчике не принимает/посылает данные в UART. И не знаю как сделать точки остановки да и имею смутное представление о их назначении :(
Поможете разобраться ?:)
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Chip115 писал(а):Пишу в оболочке Keil.
А у меня ихняя Silicon Laboratories IDE, но СИшный компилятор тоже Кейл... На работе (дома только оболочка).
Chip115 писал(а):В отладчике не принимает/посылает данные в UART. И не знаю как сделать точки остановки да и имею смутное представление о их назначении :(
Поможете разобраться ?:)
Конечно помогу :) Нужно только уйти из общей темы чтобы не мешали :wink:
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Вт янв 25, 2011 04:48:40

Сообщение 124bit »

Ребята, я правильно понимаю, что частота МК во время работы зависит от напряжения?\
к примеру
подал 3 V - 10 мгц, подал 5 V -20 стало и тп?
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Ребята, я правильно понимаю, что частота МК во время работы зависит от напряжения?\
Как сказать... зависит, но во-первых, если МК тактируется от RC-генератора, во-вторых не так существенно.

Так, как вы сказали, может зависеть максимальная частота, т.е. МК с максимальной тактовой частотой 20МГц на ней будет работать только при 5В питании, а при 3В - не запустится вообще. Зато на 8МГц он будет работать при любом питании.

Если используется кварцевый резонатор для тактирования, то частота от напряжения питания не зависит ни как.
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Ср ноя 17, 2010 15:38:40

Сообщение mrkea »

каким должен быть log при правильной компиляции программой AVReal?
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Вт янв 25, 2011 04:48:40

Сообщение 124bit »

Вот предположим у меня есть микропроцессор с макс. частотой 20mhz, есть прошивка.
Я прошил всунул в примитивную схему с питание в 3 вольта и без каких либо резонаторов.
Все работает - я радуюсь.


Нооо у меня есть еще один МК, такой же, но с буквочкой V в конце. Т.е. его максимальная частота 10 mhz
внимание вопрос:
могу ли я второй тоже использовать в такой же схеме или надо чего-то поглядеть в прошивке?

(в данном случае у меня мк тини861)
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Вот предположим у меня есть микропроцессор с макс. частотой 20mhz, есть прошивка.
Я прошил всунул в примитивную схему с питание в 3 вольта и без каких либо резонаторов.
Без резонатора он не будет работать на 20МГц, а будет на 1-4-8 (в основном такие частоты)
Нооо у меня есть еще один МК, такой же, но с буквочкой V в конце. Т.е. его максимальная частота 10 mhz
внимание вопрос:
могу ли я второй тоже использовать в такой же схеме или надо чего-то поглядеть в прошивке?
т.к. первый будет работать, допустим, на 4МГц, то и второй заработает.

А вот если первый вы принудительно заставите работать на 20МГц, поставив кварц, то:
1. Возможно, при 3В он не запустится (в даташите написано)
2. Если запустится - будет работать не стабильно
3. Второй на этой частоте не будет работать.

Да, и частоты (параметры тактирования и другие служебные вещи) не задаются в прошивке, они задаются битами конфигурации - фьюзами.
Мучитель микросхем
Аватара пользователя
Сообщения: 479
Зарегистрирован: Вт июн 02, 2009 22:38:40
Откуда: Город-герой Москва

Сообщение Грендайзер »

124bit писал(а):Вот предположим у меня есть микропроцессор с макс. частотой 20mhz, есть прошивка.
Я прошил всунул в примитивную схему с питание в 3 вольта и без каких либо резонаторов.
Все работает - я радуюсь.


Нооо у меня есть еще один МК, такой же, но с буквочкой V в конце. Т.е. его максимальная частота 10 mhz
внимание вопрос:
могу ли я второй тоже использовать в такой же схеме или надо чего-то поглядеть в прошивке?

(в данном случае у меня мк тини861)
Нет, если различие контроллеров лишь в максимальной тактовой частоте. Правда есть нюансы, а именно:
1) В программе могут быть реализованы какие-либо временные задержки, которые заточены скажем на 20МГц, и если ты всунишь туда 10МГЦ естественно всё поплывёт... однако, если схемы работают от внутренних генераторов, то для тини и мега частота генератора составляет 1 МГц, так, что всё пучком :)
2) Необходимо убедиться, что работают контроллеры именно от внутренних генераторов, тобиш проверить как там фьюзы запрограммированы
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Вт янв 25, 2011 04:48:40

Сообщение 124bit »

супер. пасиба за исчерпывающии ответы
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение Meteor »

Грендайзер писал(а):Здорово, спасибо, надо обмозговать эту программулину
Тут один регистр, в который заталкиваются данные и из него же выталкиваются.
Грендайзер писал(а): Но вот токо такая проблема, у меня никаких входных данных нет... у меня есть только проводок по которому идут синхроимпульсы, проводок, по которым передаются биты данных, и ещё один провод по которому у меня передаётся разрешающий импульс.
Тут тоже sdin-вход последовательных данных
sout-выход последовательных данных
clk- синхроимпульс
Грендайзер писал(а): За 30 нс до начала передачи данных, нужно установить сигнал разрешения в 0, затем передать данные, последовательно бит за битом, начиная со старшего (я не совсем втыкнул в систему, но по уму за один синхроимпульс передаётся 1 бит данных, верно?) и затем, спустя 30 нс после того, как ушёл последний (младший) бит данных необходимо перевести разрешающий сигнал в 1. Вот такая загангулина, и чёт я никак не допру, как это дело заделать :(
Да в этом проекте передача идет старшим битом вперед. На каждый бит дается один синхроимпульс.
Если не знаете с чего начать проектирование - нарисуйте (не описывайте словами) временную диаграмму. На ней должны быть те сигналы которые уже известны: тактовый, передающий, приемный, выбор. Ну а далее останется добавить сигналы (внутренние / внешние) для организации процесса.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Ср ноя 17, 2010 15:38:40

Сообщение mrkea »

mrkea покажите, как инициализируете. Но в этой теме
ploop, так же как написано в обучалке
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Ну дайте же наконец кусок кода!
И не забывайте - если памяти больше 256 байт, идут двухбайтные адреса, что надо учитывать при инициализации:

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

LDI temp, low(RAMEND)   
OUT SPL, temp  	 
LDI temp, high(RAMEND)
OUT SPH, temp
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Ср ноя 17, 2010 15:38:40

Сообщение mrkea »

ploop, заменил на твой код и все заработало :)) .Спасибо за помощь!
Мучитель микросхем
Аватара пользователя
Сообщения: 479
Зарегистрирован: Вт июн 02, 2009 22:38:40
Откуда: Город-герой Москва

Сообщение Грендайзер »

Meteor, спасибо, начал потихоничку догонять... А то у меня таланта на написание програм совсем нет... да и практики тоже :( , дополнительное спасибо за разъяснения, а то я от этого дела спился бы :(
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

ploop, заменил на твой код и все заработало .Спасибо за помощь!
Дык всегда пожалуйста!
Но ты хоть понял, почему так, а не по другому? :)
Важно не то, что заработал, важно понять, почему (не)заработал!
Ответить

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