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

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

Сообщение vitalik_1984 »

Сейчас только что создал проект все работает. Только подтяжка не активирована, для симуляции нужно вручную PIND выставить в 1
Пробуйте так, у меня работает. Немного упростил - выбросил лишний цикл.
Спойлер

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

.include "m328pdef.inc"
.def temp = r16
.def temp1 = r17
.def reg_led = r20
.equ START = 0


;***Векторы прерываний***
 .org $0000
   rjmp INIT
 .org $0002
   rjmp STOP_PRESSED

;***Инициализация***
INIT:in temp,MCUCR
	andi temp,~(1<<PUD)
	out MCUCR, temp
	ldi reg_led, 0xFE
	ldi temp, $5F
	out SPL, temp
	ldi temp, $02
	out SPH, temp
	sec
	set
	ser temp
	out DDRB, temp
	out PORTB, temp
	clr temp
	out DDRD, temp
	ldi temp, 0x05
	out PORTD, temp
	ldi temp, (1<< INT0) 
	out EIMSK, temp      ;Разрешаем прерывание INT0
	ldi temp, 0x00 
	sts EICRA, temp      ;Прерывание по низкому уровню сигнала INT0
	sei


;***Обработка прерывания (INT0) от кнопки STOP***
STOP_PRESSED:
	sbic PIND,START ;***Ждем нажатия кнопки START***
	rjmp STOP_PRESSED
	reti

;***Переключаем светодиоды
LOOP: out PORTB, reg_led
	rcall DELAY
	ser temp
	out PORTB,temp
	brts LEFT
	sbrs reg_led,0
	set
	ror reg_led
	rjmp LOOP
LEFT:
	sbrs reg_led,7
	clt
	rol reg_led
	rjmp LOOP

;***Задержка***
DELAY:
	ldi r17,2
d1: ldi r18,2
d2:	dec r18
	brne d2
	dec r17
	brne d1
	ret
Контактная информация:
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1815
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

vitalik_1984 писал(а):***Векторы прерываний***
Ну что вы советуете неправильно. :)) Шутка.

Kostya_Kasp, посмотрите вот эту тему. Пару страниц всего. Там описан более грамотный способ объявления таблицы прерываний.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Родился
Сообщения: 9
Зарегистрирован: Ср фев 13, 2013 11:47:56

Сообщение uuuu »

привет всем!кто подскажет,как переключаться между тремя портами по сигналу .


DDRB=0x00;
DDRD=11111111;
PORTD=11111111;
ACSR=0x80;

while(1)
{
while(PINB==0b00000001)
{PORTD=0b11111110;}
if(PINB==0b00000000) {}


while(PINB==0b00000010)
{PORTD=0b11111101;}
if(PINB==0b00000000)
{}

while(PINB==0b00000100)
{PORTD=0b11111011;}
if(PINB==0b00000100)
{}

}
у меня получилось,если на первом порту 1,то при нажатии кнопки на второй порт,не переключается на второй ,а включен всё время первый.что нужно добавить в код?
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

учитывая очевидность ответа на ваш вопрос, прошу добавить схему по которой у вас что-то не работает
Ставим плюсы: )
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

uuuu писал(а):как переключаться между тремя портами по сигналу
зачем так много действий, и зачем вообще if, которые ничего не делают?

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

while(1)
{
	PORTD = ~PINB;
}
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Реклама
Мучитель микросхем
Сообщения: 400
Зарегистрирован: Сб апр 17, 2010 10:30:13

Сообщение misterkuk »

Собрал схему и запитал pic16f628a от 3.7 вольт. Но он не запускается от этого напряжения, а от 5в работает на рас. Может что-то программно в нём включать или выставлять? Схемы самой нет, еотил сразу печатку ведь там проц и 3 74HC595 которые зажигают светодиоды. Питание- литий полимерный аккумулятор.
Контактная информация:
Реклама
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

Смотрите BOR и Brown-out Reset Voltage... 3.65 Vmin ... 4.35 Vmax ...
"Я не даю готовых решений, я заставляю думать!"(С)
Родился
Сообщения: 1
Зарегистрирован: Ср фев 13, 2013 19:25:40

Сообщение Faton_11 »

Добрый вечер!

output reg [length-1:0] adr1_out,//регистр со значением адреса
output wire [length-1:0] adr1_bus,//8-разрядная шина адреса

Значения с шины можно записать в регистр таким образом:
adr1_out<=adr1_bus;

Но мне нужно наоборот, записать данные из регистра на шину. Насколько я понимаю, такая форма записи не приемлема:
adr1_bus<=adr1_out;

Изучаю недавно, подскажите, как можно записать правильно?
Родился
Сообщения: 9
Зарегистрирован: Ср фев 13, 2013 11:47:56

Сообщение uuuu »

unalex писал(а):зачем так много действий, и зачем вообще if, которые ничего не делают?

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

while(1)
{
	PORTD = ~PINB;
}
мне нужно от переключателя с тремя положениями управлять led индикатором,и чтоб на входах была логическая 1 ,а на выходах 0(led индикатор с общим анодом)

на самом деле на портах D будет не по одному нулю,а больше .один ноль -один сегмент индикатора,я ещё не определился какиеножки порта d будут активны,но не в этом загвоздка,как переключаться между ними?if я убрал,получилось так:
while(1)
{
while(PINB==0b00000001)
{PORTD=0b11111110;}



while(PINB==0b00000010)
{PORTD=0b11111101;}



while(PINB==0b00000100)
{PORTD=0b11111011;},но как между ними переключаться то?
Последний раз редактировалось Gudd-Head Чт фев 14, 2013 09:12:23, всего редактировалось 2 раза.
Причина: Нарушение пп. 2.2 и 2.7 Правил Форума
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

честно говоря вообще вопрос какой то непонятный-" как между ними переключаться?"
в вашем случае лучше использовать маску для входа, так как выключатель выдает три единицы по очереди, а вы читаете весь порт.
Маска накладывается так

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

#define MASK  0b00000111
temp =PINB &MASK; 
далее по идее знаки для сегментного индикатора лучше хранить в массиве, сколько знаков, столько и элементов массива

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

 char show[]={0b00000001, 0b00000010, 0b00000100, 0b00000111}  
дальше, чтобы не использовать лишних циклов пишем так
Спойлер

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

 
 #define MASK  0b00000111 
// объявление переменных
 char temp=0,show[]={0b11111110, 0b11111101, 0b11111011, 0b00000111};
//-------------основной цикл
temp =PINB &MASK; 
switch (temp){
       case (0b00000001): PORTD =show[1];break;
       case (0b00000010): PORTD =show[2];break;
       case (0b00000100): PORTD =show[3];break; 
default : PORTD =show[4] ;
}//end of switch        
Последний раз редактировалось vitalik_1984 Пт фев 15, 2013 00:00:26, всего редактировалось 3 раза.
Контактная информация:
Родился
Сообщения: 9
Зарегистрирован: Ср фев 13, 2013 11:47:56

Сообщение uuuu »

vitalik_1984 писал(а):
Спойлер

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

 
 #define MASK  0x00000111 
// объявление переменных
 char show[]={0x11111110, 0x11111101, 0x11111011, 0x00000111};                       //Error: must declare first in block
//-------------основной цикл
temp =PINB &MASK;                                                                              //Error: undefined symbol 'temp'
switch (temp){                                                                                   //Error: undefined symbol 'temp'
       case (0x00000001): PORTD =show[1];break;
       case (0x00000010): PORTD =show[2];break;
       case (0x00000100): PORTD =show[3];break; 
default : PORTD =show[4] ;
}//end of switch        
СпойлерCODE VISION ВЫРУГАЛСЯ ОШИБКАМИ НА ВАШ КОД,Я ИХ НАПИСАЛ НАПРОТИВ ТЕХ СТРОК.МНЕ НУЖНО ЕСЛИ ПЕРЕКЛЮЧАТЕЛЬ В ПЕРВОМ ПОЛОЖЕНИИ -ГОРИТ ЦИФРА 1,ВО ВТОРОМ-ЦИФРА 2,В ТРЕТЬЕМ-ЦИФРА 3.В ПРИНЦИПЕ МОЙ КОД ПРАВИЛЬНЫЙ,РАБОТАЕТ ,НО ОН НЕ ПЕРЕКЛЮЧАЕТ.Т.Е.ЕСЛИ ПЕРЕКЛЮЧАТЕЛЬ ВКЛЮЧЕН В ПЕРВОЕ ПОЛОЖЕНИЕ,ЗАГОРАЮТСЯ СЕГМЕНТЫ ,КОТОРЫЕ Я УКАЖУ В PORTD,НО КАК ТОЛЬКО Я ВКЛЮЧАЮ ВО ВТОРОЕ ИЛИ ТРЕТЬЕ ПОЛОЖЕНИЕ ПЕРЕКЛЮЧАТЕЛЬ ПРОГРАММА НЕ ПЕРЕХОДИТ СООТВЕТСТВЕННО ВО ВТОРУЮ И ТРЕТЬЮ ЧАСТЬ,А ПРОДОЛЖАЕТ ВЫПОЛНЯТЬСЯ ПЕРВАЯ.
Последний раз редактировалось Gudd-Head Чт фев 14, 2013 15:59:16, всего редактировалось 1 раз.
Причина: Нарушение п.2.7 Правил Форума
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

а догадаться нельзя? раз пишет неопределенный символ, значит нужно его определить

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

//определение переменных
unsigned char temp =0; 
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

uuuu, замени все иксы "х" на "b"
Открыл глаза
Сообщения: 47
Зарегистрирован: Чт янв 21, 2010 21:39:22

Сообщение grindripperMi »

Здравия, хвостатые!;) Подогнались микроконтроллеры: ATMEL 121,122, 322, 552, 618 с "расширением" 24 CO 1A, и AT 89C52(S52) все 24PC или PI. В разделе "для дома, для семьи" их можно как нибудь пристроить? Посоветуйте со схемами и с программами, если не затруднит кого нибудь из почтенного общества. Без издёвок! С уважением Михаил!
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

zero648 писал(а):uuuu, замени все иксы "х" на "b"
:facepalm: чет запарился, хотя вроде не должно быть при этом сильных косяков, 111 не превышает 255, просто гореть будет не то, что предполагается.
В поисках истины человек развивается.
Контактная информация:
Опытный кот
Сообщения: 758
Зарегистрирован: Вс фев 10, 2013 15:26:00

Сообщение nirq »

24C01 - память, в гугле про неё есть. Небольшая.
89x52 - устаревшее и/или на любителя, программатор мутить специально для.

Схема с программой рожается из головы для решения поставленной задачи, иначе смысл процесса.... присоединять деталь А к детали Б по инструкции, чтоб добро не пропадало?
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

uuuu

эта конструкция делает все то, что вы написали выше(порт D ножки 0 1 2 выдают ноль ели на соответствующих ногах порта B единички(кнопка замыкает на массу), на остальных ногах порта D всегда висят единички),
проверьте сначала, потом пишите что не так

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

while(1)
{
   PORTD = ~(PINB & 0x07);
}
Последний раз редактировалось unalex Пт фев 15, 2013 02:58:15, всего редактировалось 1 раз.
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

uuuu писал(а):char show[]={0x11111110, 0x11111101, 0x11111011, 0x00000111};
ну тут явно больше 255

да и вообще к чему такие громоздкие конструкции, когда мой пример делает то же самое в одну строчку
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Нашел транзистор. Понюхал.
Сообщения: 172
Зарегистрирован: Пн мар 19, 2012 13:04:11

Сообщение MS24 »

Ребят подскажите, нужно соединить HCPL-0931 и MAX13487. Делаю преобразователь USB - RS485. HCPL гальваническая развязка, MAX13487 - согласователь уровней с автоопределением направления. В даташите есть принципиальная схема включения на оптронах, а как Максимку подключить к HCPL-0931 я никак не могу понять.

Вот такой вариант будет работать?
http://we.easyelectronics.ru/GYUR22/max ... s-485.html
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

MAX13487 1(RO) ->- HCPL-9031 2(IN1), HCPL-9031 7(OUT1) ->- RXD
MAX13487 4(DI) -<- HCPL-9031 3(OUT2), HCPL-9031 6(IN2) -<- TXD

или

MAX13487 1(RO) ->- HCPL-9031 6(IN2), HCPL-9031 3(OUT2) ->- RXD
MAX13487 4(DI) -<- HCPL-9031 7(OUT1), HCPL-9031 2(IN1) -<- TXD

как удобнее
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Ответить

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