Вроде правильно описал, так и работает..Chip115 писал(а):Проверьте ход мысли, правильно ли я понял.
Мелкие вопросы по МК и ПЛИС.
Re: Мелкие вопросы по МК и ПЛИС.
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
- Реклама
-
Chettuser
Re: Мелкие вопросы по МК и ПЛИС.
Быть может Вам этот код на Си поможет чем-нибудь?Arlleex писал(а):Доброй ночи.
Как первести обычный бинарный код в двоично-десятичный? Причем 0000 0000 это 0000 0000, а, например, 0000 1111 - это уже получится 0011 0001 0011 0101 (для lcd).
на ассемблере пишу.
Это для ATtiny (или Mega8? не помню...):
Код: Выделить всё
/***Использование динамической индикации***/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define valButton_1 30
#define valButton_2 50
// 0 1 2 3 4 5 6 7 8 9
char SEGMENT[ ] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
volatile unsigned char segcounter = 0;
volatile int display1 = 0;
// Обработчик прерывания по переполнению таймера2
ISR (TIMER2_OVF_vect)
{
PORTD = 0xFF; //гасим все разряды
PORTB = (1 << segcounter); //выбираем следующий разряд
switch (segcounter)
{
case 0:
PORTD = ~(SEGMENT[display1 % 10000 / 1000]); // здесь раскладываем число на разряды
break;
case 1:
PORTD = ~(SEGMENT[display1 % 1000 / 100]);
break;
case 2:
PORTD = ~(SEGMENT[display1 % 100 / 10]);
break;
case 3:
PORTD = ~(SEGMENT[display1 % 10]);
break;
}
if ((segcounter++) > 2) segcounter = 0;
}
/***Главная функция***/
int main (void)
{
DDRD |= (1 << PD0)|(1 << PD1)|(1 << PD2)|(1 << PD3)|(1 << PD4)|(1 << PD5)|(1 << PD6);
DDRB |= (1 << PB0)|(1 << PB1)|(1 << PB2)|(1 << PB3);
PORTD = 0x00;
PORTB = 0x00;
TIMSK |= (1 << TOIE2); // разрешение прерывания по таймеру2
TCCR2 |= (1 << CS21); //предделитель на 8
sei(); //глобально разрешаем прерывания
}ЗЫ: Админы, как тут прокрутку на длинные коды поставить? Исправьте, если сможете, плиззз...
Re: Мелкие вопросы по МК и ПЛИС.
к сожалению все намного хужеGudd-Head писал(а):Свежий! Да погоняй ты уже в студии, да посмотри. А если что непонятно — спрашивай.FreshMan писал(а):значит если и приследующей операции сложения результат будет больше 255 то флаг так и останется висет в положении 1, ва если нет то он сбросится аппаратно в ноль ? я правильно разумею ?
в данном случае прочерки означают что эти флаги вообще не используются ?
- Вложения
-
- 777777777777777777777.jpg
- (110.33 КБ) 809 скачиваний
Tell Me The Truth
Re: Мелкие вопросы по МК и ПЛИС.
1. Не могу врубить схему от внешнего питания.
От программатора работает, а от блока питания на 6.3В через стабилизтор (LP2950-ACZ-5.0) на 5В (которого в схеме нету...благодаря чему я первый МК спалил) не работает.
Подозреваю, что надо что то либо с фьюзами делать либо подать высокий потенциал на reset (РС6)?
2. Не получается никак прочитать температуру с датчика ds18b20 (прочел и перепробовал буквально все, что смог найти...даже три датчика переставил). Даже стал обнаруживаться, но температуру не выдает. В приложении код программы...взгляните. Там либа сторонняя...она наиболее вменяемая из всего, что я попробовал и код мой. Выдает код ошибки 3, а температуру 0.
Уже неделю почти бьюсь, а сдвига нет. Индикацию сделал и все дальше ни шагу. Сегодня вот случайно не отключил блок питания и программатор подрубил для прошивки...и выдал код ошибки 2, а температуру -32 градуса...что похоже на правду...только с плюсом (топят сильно дома)...чем можно объяснить это...и можно ли тк вообще включать данную схему от двух источников питания...напряжение вроде бы не должно складываться, а ток должен...значит тока не хватает? Это на данный момент основное предположение. Может такое быть, что МК перегружен индикацией и просто глючит?
Заранее спасибо!
От программатора работает, а от блока питания на 6.3В через стабилизтор (LP2950-ACZ-5.0) на 5В (которого в схеме нету...благодаря чему я первый МК спалил) не работает.
Подозреваю, что надо что то либо с фьюзами делать либо подать высокий потенциал на reset (РС6)?
2. Не получается никак прочитать температуру с датчика ds18b20 (прочел и перепробовал буквально все, что смог найти...даже три датчика переставил). Даже стал обнаруживаться, но температуру не выдает. В приложении код программы...взгляните. Там либа сторонняя...она наиболее вменяемая из всего, что я попробовал и код мой. Выдает код ошибки 3, а температуру 0.
Уже неделю почти бьюсь, а сдвига нет. Индикацию сделал и все дальше ни шагу. Сегодня вот случайно не отключил блок питания и программатор подрубил для прошивки...и выдал код ошибки 2, а температуру -32 градуса...что похоже на правду...только с плюсом (топят сильно дома)...чем можно объяснить это...и можно ли тк вообще включать данную схему от двух источников питания...напряжение вроде бы не должно складываться, а ток должен...значит тока не хватает? Это на данный момент основное предположение. Может такое быть, что МК перегружен индикацией и просто глючит?
Заранее спасибо!
Последний раз редактировалось 3DRaven Пн янв 16, 2012 21:29:43, всего редактировалось 1 раз.
- Реклама
Re: Мелкие вопросы по МК и ПЛИС.
Что касается резистора...то он там такой и стоит...схема из статьи, я просто забыл написать.
Ситуация прояснилась немного. Судя по всему не тянет нагрузку МК. Там индикация все ест.
Индикация с общим анодом. Как ее лучше подключить в обход МК? Попробовал через транзисторы...вообще не работает.
Взял катоды индикатора на порт МК, а другим портом МК рулил транзисторами что бы с +5В выдавать (через резистор)
ток на общие аноды индикатора. Не пашет. Может есть что то получше для подключения подобных вещей.
Вроде как есть какие то "драйверы"...что это?
Поздняя правка.
Вопрос снят. Завтра куплю дешифртор для индикации и проверю. Я только разбираюсь...не знал, что такое бывает
Ситуация прояснилась немного. Судя по всему не тянет нагрузку МК. Там индикация все ест.
Индикация с общим анодом. Как ее лучше подключить в обход МК? Попробовал через транзисторы...вообще не работает.
Взял катоды индикатора на порт МК, а другим портом МК рулил транзисторами что бы с +5В выдавать (через резистор)
ток на общие аноды индикатора. Не пашет. Может есть что то получше для подключения подобных вещей.
Вроде как есть какие то "драйверы"...что это?
Поздняя правка.
Вопрос снят. Завтра куплю дешифртор для индикации и проверю. Я только разбираюсь...не знал, что такое бывает
- Engineer_Keen
- Друг Кота
- Сообщения: 3872
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: Мелкие вопросы по МК и ПЛИС.
Значит не используются.FreshMan писал(а):в данном случае прочерки означают что эти флаги вообще не используются ?
Re: Мелкие вопросы по МК и ПЛИС.
Точнее сказать, никаких флагов там и нет.в данном случае прочерки означают что эти флаги вообще не используются ?
Re: Мелкие вопросы по МК и ПЛИС.
Дорогие друзья помогите разобраться в чем причина! Не могу получить температуру с датчика 18b20. в Code vision через визард указал что он будет на PC5. Далее повесил туда его и подтягивающий резистор на 5к1. В схеме так же есть четыре семисегментных индикатора, один регистр сдвига и кварц на 32768 для асинхронного таймера. При попытке считать температуру выдает результат -9999 что значит ошибка. Так же говорит что подключено 0 датчиков. Я уже ооочень долго с ним бьюсь, подскажите пожалуйста, что я не так делаю.
Для краткости убрал из кода инициализацию портов и тп.
Код: Выделить всё
#include <mega8.h>
#include <1wire.h>
#include <ds18b20.h>
#include <delay.h>
#include <math.h>
int me,md,se,sd;
#define MAX_DEVICES 4
unsigned char rom_codes[MAX_DEVICES][9];
interrupt [TIM2_COMP] void timer2_comp_isr(void) //раз в секунду по прерыванию считывается температура
{
if (ds18b20_temperature(0)==-9999) sd=1 ; //проверяю считывает ли температуру
}
void out(int i) // формирование цифры для семисегментного индикатора
{
if (i==0) PORTD=0b00111111;
if (i==1) PORTD=0b00000110;
if (i==2) PORTD=0b01011011;
if (i==3) PORTD=0b01001111;
if (i==4) PORTD=0x66;
if (i==5) PORTD=0b01101101;
if (i==6) PORTD=0b01111101;
if (i==7) PORTD=0b00000111;
if (i==8) PORTD=0b01111111;
if (i==9) PORTD=0b01101111;
}
void main(void)
{
unsigned char i,devices;
#asm("sei")
devices=w1_search(0xf0,0); //проверяю есть ли датчик
while (1)
{
md=devices;
if (devices==0) se=5; // вывод результата поиска датчика
out(md); //динамическая индикация вывод переменной md на разряд тысяч
PORTB.2=0; //смещение на регистр сдвига
PORTB.1=1; //синхронизация на регистр сдвига
PORTB.1=0;
delay_us(600);
out(me); //динамическая индикация вывод переменной me на разряд сотен
PORTB.2=1;
PORTB.1=1;
PORTB.1=0;
delay_us(600);
out(sd); //динамическая индикация вывод переменной sd на десятичный разряд
PORTB.1=1;
PORTB.1=0;
delay_us(600);
out(se); //динамическая индикация вывод переменной se на единичный разряд
PORTB.1=1;
PORTB.1=0;
delay_us(600);
}
}
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
23DRaven: все красиво подключено. Дело в прошивке. Надо рыть.
2miharus:
2miharus:
Код: Выделить всё
Prior to #include -ing the ds18b20.h file, you must declare which microcontroller port and port bit are used for communication with the DS18B20 through the 1 Wire bus.
Example:
/* specify the Atmega8515 port and bit used for the 1 Wire bus */
#asm
.equ __w1_port=0x18 ;PORTB
.equ __w1_bit=2
#endasm
/* include the DS18B20 functions prototypes */
#include <ds18b20.h>
Docendo discimus
Re: Мелкие вопросы по МК и ПЛИС.
Когда я это вставляю у меня выдает ошибку ассемблера. Ногу я задаю в свойствах проекта, она там сама куда-то вписывается я так понял видимо.pyzhman писал(а):23DRaven:
/* specify the Atmega8515 port and bit used for the 1 Wire bus */
#asm
.equ __w1_port=0x18 ;PORTB
.equ __w1_bit=2
#endasm
[/code]
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
Я вас умоляю... Вписываете/задаете параметры всегда вы. Машина покорно исполняет ваши прихоти.она там сама куда-то вписывается
Весь текст давай.Для краткости убрал из кода инициализацию портов и тп.
Docendo discimus
Re: Мелкие вопросы по МК и ПЛИС.
когда я меняю ТОЛЬКО ЭТОТ параметр в свойствах проекта хекс файл получатся другой, видимо он что-то меняет... вот весь текст
Код: Выделить всё
#include <mega8.h>
#include <1wire.h>
#include <ds18b20.h>
#include <delay.h>
#include <math.h>
int me,md,se,sd;
#define MAX_DEVICES 4
unsigned char rom_codes[MAX_DEVICES][9];
interrupt [TIM2_COMP] void timer2_comp_isr(void) //раз в секунду по прерыванию считывается температура
{
if (ds18b20_temperature(0)==-9999) sd=1 ; //проверяю считывает ли температуру
}
void out(int i) // формирование цифры для семисегментного индикатора
{
if (i==0) PORTD=0b00111111;
if (i==1) PORTD=0b00000110;
if (i==2) PORTD=0b01011011;
if (i==3) PORTD=0b01001111;
if (i==4) PORTD=0x66;
if (i==5) PORTD=0b01101101;
if (i==6) PORTD=0b01111101;
if (i==7) PORTD=0b00000111;
if (i==8) PORTD=0b01111111;
if (i==9) PORTD=0b01101111;
}
void main(void)
{
unsigned char i,devices;
PORTB=0x00;
DDRB=0x07;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0xFF;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x08;
TCCR2=0x05;
TCNT2=0x00;
OCR2=0x32;
MCUCR=0x00;
TIMSK=0x80;
UCSRB=0x00;
ACSR=0x80;
SFIOR=0x00;
ADCSRA=0x00;
SPCR=0x00;
TWCR=0x00;
#asm("sei")
devices=w1_search(0xf0,0); //проверяю есть ли датчик
while (1)
{
md=devices;
if (devices==0) se=5; // вывод результата поиска датчика
out(md); //динамическая индикация вывод переменной md на разряд тысяч
PORTB.2=0; //смещение на регистр сдвига
PORTB.1=1; //синхронизация на регистр сдвига
PORTB.1=0;
delay_us(600);
out(me); //динамическая индикация вывод переменной me на разряд сотен
PORTB.2=1;
PORTB.1=1;
PORTB.1=0;
delay_us(600);
out(sd); //динамическая индикация вывод переменной sd на десятичный разряд
PORTB.1=1;
PORTB.1=0;
delay_us(600);
out(se); //динамическая индикация вывод переменной se на единичный разряд
PORTB.1=1;
PORTB.1=0;
delay_us(600);
}
}
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
Так, еще раз:
Prior to #include -ing the ds18b20.h file, you must declare which microcontroller port and port bit are used for communication with the DS18B20 through the 1 Wire bus.
Docendo discimus
Re: Мелкие вопросы по МК и ПЛИС.
я ж говорю, гкода вставляю этот кусок он выдает ошибку ассемблера дословно вот такую :
"invalid redefinition __w1_port
invalid redefinition __w1_bit "
Либо, когда в свойствах проекта убираю галку 1 Wire и вставляю этот код, ошибку не выдает, но результата все равно нет.
"invalid redefinition __w1_port
invalid redefinition __w1_bit "
Либо, когда в свойствах проекта убираю галку 1 Wire и вставляю этот код, ошибку не выдает, но результата все равно нет.
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
У меня вопрос по Verilog и организации ПЗУ. 
Хочу описать место где будет храниться таблица значений четверть периода синуса вот так:
но синтезатор говорит, что сигнал mem используется, но не инециализируется и ему будет присвоено 0. Соответственно, синтезируется какая-та заглушка, вместо ожидаемого. Что я делаю не так?
Дополнительные сведения:
Файл sin.hex существует и синтезатор его подхватывает (без него ругается на его отсутствие). Содержимое файла в таком виде:
Всего 512 значений.
Тестовая ПЛИС: Xilinx Spartan 3AN xc3s50antqg144-5
P.S.
Если написать так:
То тоже самое.
Тестбенч показывает на выходе неопределённое состояние, при любом входном.
Пока сделал через case. Работает.
Хочу описать место где будет храниться таблица значений четверть периода синуса вот так:
Код: Выделить всё
module sintable(
input [8:0] in,
output [7:0] out
);
reg [7:0] mem [0:511];
assign out = mem[in];
initial $readmemh("sin.hex",mem,0,511);
endmoduleДополнительные сведения:
Файл sin.hex существует и синтезатор его подхватывает (без него ругается на его отсутствие). Содержимое файла в таком виде:
Код: Выделить всё
00 01 02 02 03 04 05 05 06 07 08 09 09 0A 0B 0C 0D 0D 0E 0F 10 10 11 12 ... FF FF FF FF Всего 512 значений.
Тестовая ПЛИС: Xilinx Spartan 3AN xc3s50antqg144-5
P.S.
Если написать так:
Код: Выделить всё
module sintable(
input [8:0] in,
output [7:0] out
);
reg [7:0] mem [0:511];
reg [7:0] Rout;
assign out = Rout;
initial $readmemh("sin.hex",mem,0,511);
always @(in)
Rout <= mem[in];
endmoduleТестбенч показывает на выходе неопределённое состояние, при любом входном.
Пока сделал через case. Работает.
Последний раз редактировалось IfoR Вт янв 17, 2012 15:18:12, всего редактировалось 2 раза.
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
2miharus: мой косяк, не заметил, уперся в DS18B20.
Так и не нашел, где в вашей программе идет определение порта и бита из-за которых вылазит invalid redefinition.
Код: Выделить всё
Prior to #include -ing the 1wire.h file, you must declare which microcontroller port and port bit is used for communication through the 1 Wire protocol.
Example:
/* the 1 Wire bus is connected to ATmega8515 PORTB
the data signal is bit 2 */
#asm
.equ __w1_port=0x18
.equ __w1_bit=2
#endasm
/* now you can include the 1 Wire Functions */
#include <1wire.h>
Docendo discimus
Re: Мелкие вопросы по МК и ПЛИС.
короче, я попробовал еще вот так. Выключил в проекте 1wire и вставил ваш код. Ошибка пропала, но все равно датчик не определяется. Вот новый код.pyzhman писал(а): Так и не нашел, где в вашей программе идет определение порта и бита из-за которых вылазит invalid redefinition.
Код: Выделить всё
#include <mega8.h>
#include <delay.h>
#include <math.h>
#asm
.equ __w1_port=0x15 ;PORTC
.equ __w1_bit=5
#endasm
#include <1wire.h>
#include <ds18b20.h>
int me,md,se,sd;
#define MAX_DEVICES 4
unsigned char rom_codes[MAX_DEVICES][9];
nterrupt [TIM2_COMP] void timer2_comp_isr(void) //раз в секунду по прерыванию считывается температура
{
if (ds18b20_temperature(0)==-9999) sd=1 ; //проверяю считывает ли температуру
}
void out(int i) // формирование цифры для семисегментного индикатора
{
if (i==0) PORTD=0b00111111;
if (i==1) PORTD=0b00000110;
if (i==2) PORTD=0b01011011;
if (i==3) PORTD=0b01001111;
if (i==4) PORTD=0x66;
if (i==5) PORTD=0b01101101;
if (i==6) PORTD=0b01111101;
if (i==7) PORTD=0b00000111;
if (i==8) PORTD=0b01111111;
if (i==9) PORTD=0b01101111;
}
void main(void)
{
unsigned char i,devices;
PORTB=0x00;
DDRB=0x07;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0xFF;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x08;
TCCR2=0x05;
TCNT2=0x00;
OCR2=0x32;
MCUCR=0x00;
TIMSK=0x80;
UCSRB=0x00;
ACSR=0x80;
SFIOR=0x00;
ADCSRA=0x00;
SPCR=0x00;
TWCR=0x00;
#asm("sei")
devices=w1_search(0xf0,0); //проверяю есть ли датчик
while (1)
{
md=devices;
if (devices==0) se=5; // вывод результата поиска датчика
//динамическая индикация вывод переменной md на разряд тысяч
out(md);
PORTB.2=0; //смещение на регистр сдвига
PORTB.1=1; //синхронизация на регистр сдвига
PORTB.1=0;
delay_us(600);
//динамическая индикация вывод переменной me на разряд сотен
out(me);
PORTB.2=1;
PORTB.1=1;
PORTB.1=0;
delay_us(600);
//динамическая индикация вывод переменной sd на десятичный разряд
out(sd);
PORTB.1=1;
PORTB.1=0;
delay_us(600);
//динамическая индикация вывод переменной se на единичный разряд
out(se);
PORTB.1=1;
PORTB.1=0;
delay_us(600);
}
}
- BCluster
- Собутыльник Кота
- Сообщения: 2512
- Зарегистрирован: Пн апр 06, 2009 19:33:29
- Откуда: Молдова, Кишинев
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
А где вывод температуры собственно? Какая версия кодвижна?
Какая частота кристалла? Совпадает ли реальная частота с указанной в проекте? Ибо все остальное как будто правильно.
Какая частота кристалла? Совпадает ли реальная частота с указанной в проекте? Ибо все остальное как будто правильно.
Re: Мелкие вопросы по МК и ПЛИС.
Ну вывода пока нет, я пока что только проверяю сколько датчиков devices=w1_search(0xf0,0) и есть ли ошибка if (ds18b20_temperature(0)==-9999) sd=1. Вот у меня и получается 0 датчиков и ошибка температуры. Пробовал 2 датчика по отдельности. Код вижн 2.05.4. сам контроллер тактируется от внутреннего генератора 4 МГц, плюс стоит кварц 32.768 КГц на асинхронном таймере.



