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

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

Сообщение vitalik_1984 »

Sceam73 писал(а): lcd_putchar(display%10000/1000);
lcd_putchar(display%1000/100);
lcd_putsf(",");
lcd_putchar(display%1000/10);

\
Я не зря выделил присмотритесь внимательно.
Вообще проще использовать связку itoa() и lcd_puts();
Вот понятный пример
HHIMERA писал(а):
vitalik_1984 писал(а): То есть MISO-DO, MOSI-DO
(С пониманием) Воскресенье... поздний вечер...
Точно имелось ввиду MISO-DO, MOSI-DI
В поисках истины человек развивается.
Контактная информация:
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 86
Зарегистрирован: Вт авг 28, 2012 21:07:09

Сообщение Sceam73 »

виталик, это намек на то что putchar, выводит только переменные char? за ссылку спасибо) как наступит утро, так и буду пробовать....
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

имхо, это намек на то, что в дисплей нужно выдавать коды с его кодовой страницы -
те не 0 - а 0x30, не 1, а 0x31 соответственно
ваши 0, 1, 2 - в кодовой странице соответствуют символам псевдографики, которая добросовестно и выводится.
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 86
Зарегистрирован: Вт авг 28, 2012 21:07:09

Сообщение Sceam73 »

Даже так ? ....
Я вышел с положения немного подругому! lcd_gotoxy(0,0);
lcd_putchar(display%10000/1000+0x30);
lcd_putchar(display%1000/100+0x30);
lcd_putsf(",");
lcd_putchar(display%1000/10+0x30);

Так можно ?

У меня появились 00,0

Но работать мой вольтметр отказываеться, реакции никакой, при подключении бп на контакты (бп 12 в) показывает все те же нули!
Может это из за неправильной организации вывода цифр на лсд ? Пока попробую найти ошибку сам, но если кто подскажет, буду благодарен!
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Сообщения: 426
Зарегистрирован: Чт авг 09, 2012 08:57:20

Сообщение Nevox »

Здравствуйте еще раз!

Возникла такая идея:

Хотелось бы написать прошивку для модуля ввода(стоит Альтера epm3064 на 44 пина),чтобы при замене на горячую,ложная информация не уходила,пока не успели подключить провода.
а как-нибудь пропускались бы биты и потом можно было бы считывать достоверную информацию,или что-нибудь в этом роде. прошу прощения за немного кривой язык.

вот пример прошивки,которая есть щас,написанная на Verilog.

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

SUBDESIGN SN_DVV_14_220V
(
	RES, INT : INPUT;
	WR		 : INPUT;
	RD		 : INPUT;
	CS		 : INPUT;
	DAT[7..0]: BIDIR;
	A[3..0]	 : INPUT;
	IN[13..0]: INPUT;
)
VARIABLE

 D[7..0]  	: NODE;
BEGIN
  D[7..0] = (16&(A[3..0]==0))#
		    (35&(A[3..0]==1))#
		    (14&(A[3..0]==2))#
		    (8&(A[3..0]==3))#
		    (0&(A[3..0]==4))#
		    (0&(A[3..0]==5))#
		    (0&(A[3..0]==6))#
		    (0&(A[3..0]==7))#
		    (IN[7..0]&(A[3..0]==8));
 D[5..0] = 	(IN[13..8]&(A[3..0]==9));
  
	DAT0 = TRI(D0,!CS&!RD);
	DAT1 = TRI(D1,!CS&!RD);
	DAT2 = TRI(D2,!CS&!RD);
	DAT3 = TRI(D3,!CS&!RD);
	DAT4 = TRI(D4,!CS&!RD);
	DAT5 = TRI(D5,!CS&!RD);
	DAT6 = TRI(D6,!CS&!RD);
	DAT7 = TRI(D7,!CS&!RD);
	
END;
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Я вышел с положения немного подругому! lcd_gotoxy(0,0);
lcd_putchar(display%10000/1000+0x30);
че за бред вы пишете?Я же дал ссылку на нормальный пример, itoa переводит тип int в нормальный понятный для дисплея вид, без всяких дополнительных действий с вашей стороны.если вам нужно вставить запятую между значениями то используйте временную переменную.
код

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

unsigned int I =123;
itoa (I,buffer);
lcd_puts(buffer); 

выведет на экран число 123
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

вопрос по Atmega8
если я делаю аппаратный TWI то 4 и 5 пины порта С конфигурировать на выход или оставить все по нулям DDRC=0x00;
PORTC=0x00; ?
http://rghost.ru/42342241.view
Tell Me The Truth
Встал на лапы
Аватара пользователя
Сообщения: 86
Зарегистрирован: Вт авг 28, 2012 21:07:09

Сообщение Sceam73 »

cvavr ругаеться на itoa ...undefined symbol
Встал на лапы
Аватара пользователя
Сообщения: 132
Зарегистрирован: Вс сен 23, 2012 05:51:35

Сообщение black_lizard »

cvavr ругаеться на itoa ...undefined symbol
#include <stdlib.h>
Собираю самопальный мини-компьютер
Встал на лапы
Аватара пользователя
Сообщения: 132
Зарегистрирован: Вс сен 23, 2012 05:51:35

Сообщение black_lizard »

Никогда не думал, что работа с файловой системой флешки, а именно фат настолько геморна и будет самым проблемным местом моего проекта.
Кое как научил мк бегать по папкам командами dir и cd, как в досе.
Но есть пара вопросов, дабы не плодить тем, ответы на которые в инете я не нашёл.

Как высчитывается смещение до корневой директории?
Где записан размер кластера?
Где находится пресловутая таблица файлов, когда начало флешки просто забито сплошными FF? Вроде как, она должна располагаться в начале.
Размер кластера(или сектора, так и не понял) - 0х2000, выяснен экспериментальным путём. Как тогда корневая директория может быть в 0x5B200? Я могу понять, что первые 0x200 это данные ФС, которых кот наплакал, но как прибавляя 0x2000 можно получить 5B200 для меня осталось загадкой. Разве размер кластера не фиксирован?

Думал, что fat простой, потому что древний. Зря я так думал.
Собираю самопальный мини-компьютер
Встал на лапы
Аватара пользователя
Сообщения: 86
Зарегистрирован: Вт авг 28, 2012 21:07:09

Сообщение Sceam73 »

с

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

ADCSRA =(1 << 1)|(1 << 2)|(1 << 3)|(1 << 5)|(1 << 6)|(1 << 7)|;
ADMUX = (1 << 1)|(1 << 2)|(0 << 4)|(0 << 5)|(0 << 6)|(0 << 7) ;
на жк появляется число постоянное и неизменное 2813! проглядите пожалуйста код... посмотрите где налажал...
Спойлерinterrupt [ADC_INT] void adc_isr(void)
{
unsigned int adc_data;
// Read the AD conversion result
adc_data=ADCW;
// Place your code here
value = value + (adc_data*11/4);
adc_counter++;

}

ADCSRA =(1 << 1)|(1 << 2)|(1 << 3)|(1 << 5)|(1 << 6)|(1 << 7);
ADMUX = (1 << 1)|(1 << 2)|(0 << 4)|(0 << 5)|(0 << 6)|(0 << 7) ;

lcd_init(16);

// Global enable interrupts
#asm("sei")

delay_ms(50);

while(1)
{
if (adc_counter > 300)
{
display = value/adc_counter;
adc_counter = 0;
value = 0;
}
delay_ms(50);
lcd_gotoxy(0,0);
lcd_clear();
itoa (display,buffer);
lcd_puts(buffer);

}
}
Последний раз редактировалось Sceam73 Ср дек 19, 2012 13:40:24, всего редактировалось 1 раз.
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Сообщение a_skr »

а ничего, что 1<<8 = 0x100 = 256 и в однобайтовый регистр не влезет?
Друг Кота
Аватара пользователя
Сообщения: 20132
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

FreshMan писал(а):если я делаю аппаратный TWI то 4 и 5 пины порта С конфигурировать на выход или оставить все по нулям DDRC=0x00
Насколько я помню, при включении периферии она перехватывает пины, и на них уже никак не повлиять. Т.е. конфигурировать их специально не надо.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Встал на лапы
Аватара пользователя
Сообщения: 86
Зарегистрирован: Вт авг 28, 2012 21:07:09

Сообщение Sceam73 »

a_skr писал(а):а ничего, что 1<<8 = 0x100 = 256 и в однобайтовый регистр не влезет?
я об этом думал... но это 1<<8 ни на что не повлияет, еденица просто уйдет.....
Это не столь важно, меня больше интересует, почему у меня моя программа не работает ? Я уже себе весь мозг поломал!
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Сообщение a_skr »

ADMUX = (1 << 1)|(1 << 2)|(0 << 4)|(0 << 5)|(0 << 6)|(0 << 7) ;
= 0x06 - зачем выбирать вход PC6, если используется PC0?
выбран внешний источник опорного напряжения, а оно не подведено!
и еще математику проверьте. не будет ли переполнения при суммировании результатов.
Встал на лапы
Аватара пользователя
Сообщения: 86
Зарегистрирован: Вт авг 28, 2012 21:07:09

Сообщение Sceam73 »

Такс... щас буду с битами розбераться, видимо ошибся!
По поводу математеки, вродебы правильно посчитал, у меня как раз две области в которых я разобрался не до конца! Это собственно биты, и что как розсчитывать!


Мучался мучался, гуглил гуглил, в итоге наткнулся на готовый проект вольтметра на светодиодах! (ацп 8бит)
Немного подправил код под ЛСД!
Пока что решил опустить все танцы с бубном, и выводить просто показания ацп! Схему включения оставил старую, а код подправил...
Спойлерchar buffer[3];
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
static unsigned char input_index=0;
// Read the 8 most significant bits
// of the AD conversion result
adc_data[input_index]=ADCH;
// Select next ADC input
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
input_index=0;
ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff))+input_index;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
}

ADMUX=FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff);
ADCSRA=0xCC;

delay_ms(50);
lcd_gotoxy(0,0);
lcd_clear();
itoa (adc_data[0],buffer);
lcd_puts(buffer);
в результате получаю 255 на дисплее!
Я если я все правильно понимаю, то это говорит о том, что к моему пину подключено максимальные 2.5 вольта ?
но пин свободный....
То что нога подключена (pull-up), влияет ли это на работу аdc ? мог ли я запороть свой ADC ?
Уже даже фьюзы на 8 мгц выставил, вместо родных 2х!
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Может и сожгли, смотря что на него подавали, попробуйте притянуть резистором ~.1кОм к минусу будем считать, что это нижнее плечо делителя напряжения. Вы ведь пользуетесь делителем? Должны, так как где то видел, что вход подключается к 12 вольтам.
Но работать мой вольтметр отказываеться, реакции никакой, при подключении бп на контакты (бп 12 в) показывает все те же нули!
зачем умножать каждый раз при сложении
value = value + (adc_data*11/4);
и тратить лишние такты и к тому же увеличивая почти в три раза саму переменную, норовя нарваться на переполнение, в то время как можно просто
value+ =adc_data;
if(adc_counter<300)
display = (11*value)/(4*adc_counter);}

И вообще разве так считается вольтаж?
должно быть Vin =adc_result*c_delen*(Vop/(bits^2-1));
Все, кроме результата Ацп является константой, поэтому компилятор просто посчитает нужное значение и подставит его.
bits это количество используемых бит
Vop величина опорного напряжения
c_delen это коэффициент деления делителя напряжения.
Vin то напряжение, что нужно узнать.
Последний раз редактировалось vitalik_1984 Ср дек 19, 2012 20:58:03, всего редактировалось 1 раз.
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 86
Зарегистрирован: Вт авг 28, 2012 21:07:09

Сообщение Sceam73 »

Да, делителем пользуюсь, 1 и 10 Ком, и подстроечный на 5 ком! Вычитал что AVCC это как бы точка сравнения, и кинул ее на +5, как это делают в самых простых схемах! без всяких конденцаторов! Результат ? Работает! контроллер вываливает мне на экранн данные ацп 8ми битные! Если не ошибаюсь, в 8ми битном режиме, 255 должно показывань на 25.5 вольтах, при условии делителя 1:10! у меня на 12 показывает 50, Дело за малым, просчитать все хорошенько, и выводить на здоровье себе напряжение:) главное то что я заставил его работать :) Пока что все, буду переходить к следующему шагу!
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Блин не успел отредактировать.Формулу расчета решил привести.
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 86
Зарегистрирован: Вт авг 28, 2012 21:07:09

Сообщение Sceam73 »

Разве мой вариант ошибочный ? В реализации моего варианта, показания по сравнению с самым дешевым китайским брехометром, розходятся в одну-2 десятки вольта!
Ответить

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