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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
МитяРа
Модератор
Сообщения: 11492
Зарегистрирован: Чт дек 11, 2008 14:52:26
Откуда: град Нижний

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

Сообщение МитяРа »

Chip115 писал(а):Проверьте ход мысли, правильно ли я понял.
Вроде правильно описал, так и работает.. :tea:
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
Chettuser

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

Сообщение Chettuser »

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(); //глобально разрешаем прерывания

}

ЗЫ: Админы, как тут прокрутку на длинные коды поставить? Исправьте, если сможете, плиззз...
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

Gudd-Head писал(а):
FreshMan писал(а):значит если и приследующей операции сложения результат будет больше 255 то флаг так и останется висет в положении 1, ва если нет то он сбросится аппаратно в ноль ? я правильно разумею ? :write:

Свежий! Да погоняй ты уже в студии, да посмотри. А если что непонятно — спрашивай.

к сожалению все намного хуже :( я и погонять то незнаю как :oops:

Изображение
в данном случае прочерки означают что эти флаги вообще не используются ?
Вложения
777777777777777777777.jpg
(110.33 КБ) 784 скачивания
Tell Me The Truth
3DRaven
Грызет канифоль
Сообщения: 294
Зарегистрирован: Пт мар 11, 2011 08:51:55

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

Сообщение 3DRaven »

1. Не могу врубить схему от внешнего питания.
От программатора работает, а от блока питания на 6.3В через стабилизтор (LP2950-ACZ-5.0) на 5В (которого в схеме нету...благодаря чему я первый МК спалил) не работает.
Подозреваю, что надо что то либо с фьюзами делать либо подать высокий потенциал на reset (РС6)?
2. Не получается никак прочитать температуру с датчика ds18b20 (прочел и перепробовал буквально все, что смог найти...даже три датчика переставил). Даже стал обнаруживаться, но температуру не выдает. В приложении код программы...взгляните. Там либа сторонняя...она наиболее вменяемая из всего, что я попробовал и код мой. Выдает код ошибки 3, а температуру 0.

Уже неделю почти бьюсь, а сдвига нет. Индикацию сделал и все дальше ни шагу. Сегодня вот случайно не отключил блок питания и программатор подрубил для прошивки...и выдал код ошибки 2, а температуру -32 градуса...что похоже на правду...только с плюсом (топят сильно дома)...чем можно объяснить это...и можно ли тк вообще включать данную схему от двух источников питания...напряжение вроде бы не должно складываться, а ток должен...значит тока не хватает? Это на данный момент основное предположение. Может такое быть, что МК перегружен индикацией и просто глючит?
Заранее спасибо!
Вложения
avr2.zip
(5.09 КБ) 142 скачивания
Sch.GIF
(26.62 КБ) 326 скачиваний
Последний раз редактировалось 3DRaven Пн янв 16, 2012 21:29:43, всего редактировалось 1 раз.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

R5 4k7
Docendo discimus
3DRaven
Грызет канифоль
Сообщения: 294
Зарегистрирован: Пт мар 11, 2011 08:51:55

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

Сообщение 3DRaven »

Что касается резистора...то он там такой и стоит...схема из статьи, я просто забыл написать.
Ситуация прояснилась немного. Судя по всему не тянет нагрузку МК. Там индикация все ест.
Индикация с общим анодом. Как ее лучше подключить в обход МК? Попробовал через транзисторы...вообще не работает.
Взял катоды индикатора на порт МК, а другим портом МК рулил транзисторами что бы с +5В выдавать (через резистор)
ток на общие аноды индикатора. Не пашет. Может есть что то получше для подключения подобных вещей.
Вроде как есть какие то "драйверы"...что это?

Поздняя правка.
Вопрос снят. Завтра куплю дешифртор для индикации и проверю. Я только разбираюсь...не знал, что такое бывает :)
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

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

Сообщение Engineer_Keen »

FreshMan писал(а):в данном случае прочерки означают что эти флаги вообще не используются ?

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

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

Сообщение ploop »

в данном случае прочерки означают что эти флаги вообще не используются ?

Точнее сказать, никаких флагов там и нет.
Аватара пользователя
miharus
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Пт фев 18, 2011 12:04:23

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

Сообщение miharus »

Дорогие друзья помогите разобраться в чем причина! Не могу получить температуру с датчика 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: Мелкие вопросы по МК и ПЛИС.

Сообщение pyzhman »

23DRaven: все красиво подключено. Дело в прошивке. Надо рыть.
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
Аватара пользователя
miharus
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Пт фев 18, 2011 12:04:23

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

Сообщение miharus »

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: Мелкие вопросы по МК и ПЛИС.

Сообщение pyzhman »

она там сама куда-то вписывается

Я вас умоляю... Вписываете/задаете параметры всегда вы. Машина покорно исполняет ваши прихоти.
Для краткости убрал из кода инициализацию портов и тп.

Весь текст давай.
Docendo discimus
Аватара пользователя
miharus
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Пт фев 18, 2011 12:04:23

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

Сообщение miharus »

когда я меняю ТОЛЬКО ЭТОТ параметр в свойствах проекта хекс файл получатся другой, видимо он что-то меняет... вот весь текст

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

#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: Мелкие вопросы по МК и ПЛИС.

Сообщение pyzhman »

Так, еще раз:
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
Аватара пользователя
miharus
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Пт фев 18, 2011 12:04:23

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

Сообщение miharus »

я ж говорю, гкода вставляю этот кусок он выдает ошибку ассемблера дословно вот такую :
"invalid redefinition __w1_port
invalid redefinition __w1_bit "

Либо, когда в свойствах проекта убираю галку 1 Wire и вставляю этот код, ошибку не выдает, но результата все равно нет.
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

У меня вопрос по Verilog и организации ПЗУ. :)

Хочу описать место где будет храниться таблица значений четверть периода синуса вот так:

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

module sintable(
    
input [8:0in,
    
output [7:0out
    
);
    
    
reg [7:0mem [0:511];
    
    
assign out mem[in];
    
    
initial $readmemh("sin.hex",mem,0,511);
endmodule


но синтезатор говорит, что сигнал mem используется, но не инециализируется и ему будет присвоено 0. Соответственно, синтезируется какая-та заглушка, вместо ожидаемого. Что я делаю не так?
Дополнительные сведения:
Файл 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 раза.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

2miharus: мой косяк, не заметил, уперся в DS18B20.

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

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>

Так и не нашел, где в вашей программе идет определение порта и бита из-за которых вылазит invalid redefinition.
Docendo discimus
Аватара пользователя
miharus
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Пт фев 18, 2011 12:04:23

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

Сообщение miharus »

pyzhman писал(а):Так и не нашел, где в вашей программе идет определение порта и бита из-за которых вылазит invalid redefinition.


короче, я попробовал еще вот так. Выключил в проекте 1wire и вставил ваш код. Ошибка пропала, но все равно датчик не определяется. Вот новый код.

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

#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: Мелкие вопросы по МК и ПЛИС.

Сообщение BCluster »

А где вывод температуры собственно? Какая версия кодвижна?
Какая частота кристалла? Совпадает ли реальная частота с указанной в проекте? Ибо все остальное как будто правильно.
Аватара пользователя
miharus
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Пт фев 18, 2011 12:04:23

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

Сообщение miharus »

Ну вывода пока нет, я пока что только проверяю сколько датчиков devices=w1_search(0xf0,0) и есть ли ошибка if (ds18b20_temperature(0)==-9999) sd=1. Вот у меня и получается 0 датчиков и ошибка температуры. Пробовал 2 датчика по отдельности. Код вижн 2.05.4. сам контроллер тактируется от внутреннего генератора 4 МГц, плюс стоит кварц 32.768 КГц на асинхронном таймере.
Ответить

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