Страница 511 из 628
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Чт июн 05, 2014 22:10:06
Chettuser
Чет нифига не пойму! В PIC16F887 вообще возможно сохранение таблицы в памяти программ аналогично PIC18м?
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Чт июн 05, 2014 22:17:15
КРАМ
Да, возможно.
Только не очень удобно. Через байт получается 6 бит.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Чт июн 05, 2014 22:17:35
Аlex
Возможно. Но обращение будет не как в PIC18 (табличное чтение), а через retlw. Собственно, при проганье на Си это по барабану

Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Чт июн 05, 2014 22:38:48
КРАМ
Аlex писал(а):Возможно. Но обращение будет не как в PIC18 (табличное чтение), а через retlw.
Именно как в 18-х. Табличное.
887-ой один из первых 16-х ПИКов с самопрограммированием. А значит можно читать флеш как данные через косвенную адресацию
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Чт июн 05, 2014 22:50:06
Аlex
КРАМ писал(а):Именно как в 18-х. Табличное.
Хм... , точно. Поспешил я с ответом, извиняюсь
Параграф
10.0 даташита,
DATA EEPROM AND FLASH PROGRAM MEMORY CONTROL.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Сб июн 07, 2014 20:45:06
Chettuser
Мои нейроны забодала ошибка:
Error [1098] .... conflicting declarations for variable "_Lcd_puts" (D:\My designs\Dozer\Dozer.c:28)
(908) exit status = 1
Вызов этой функции изнутри Lcd_test(); проблем не вызывает, а вручную из void main() валит ошибками.
Заранее спасибо за желание помочь.
Отбой - я не там вписал используемые функции, всего то.

Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вс июн 08, 2014 13:06:21
ximik
Кто нибудь работал с таким синизубым модулем или чем нибудь оналогичным? xs3868 интересует общение по UART, как переименовать , вводить команды... я попробовал, забивать команды из даташита но на команды не реагирует, а отвечает какойто кашей.

:kill хелп

Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вс июн 08, 2014 13:32:53
Alexeyslav
Скорость передачи нужно правильную установить.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вс июн 08, 2014 14:04:56
ximik
Alexeyslav писал(а): правильную установить.
скорость ставил рекомендуемую, я ее выделил, 8 дата бит, 1 стоп бип программа терминал 1.9
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вс июн 08, 2014 14:57:34
Alexeyslav
На заборе тоже написано... а там дрова лежат. Твой терминал не ругается на Framing error или другие ошибки? Посмотри осциллографом реально какая скорость в порту на выходе модуля, он ведь может быть настроен на ЛЮБУЮ скорость а не дефолтную. Кто его знает у кого и где он побывал прежде чем попасть к тебе. Обычно они приходят настроенные на 38400.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Пн июн 09, 2014 13:20:14
Chettuser
Мучает вопрос - для чего ставятся 2 конденсатора от кварца на общий? Собственно не знаю в какую тему вопрос - поскольку он и генераторов на логике с кварцем тоже касается.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Пн июн 09, 2014 15:09:20
pyzhman
Это своеобразный кикстартер.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Пн июн 09, 2014 15:23:18
Alexeyslav
Конденсаторы являются частью генератора, они создают необходимый сдвиг фазы для того чтобы генератор смог работать устойчиво на основной частоте кварца. Без них он будет долго раскачиваться и может не завестись вовсе, или завестись на фундаментальной частоте кварца или на одной из его гармоник. Если посмотреть даташит на конкретный кварцевый резонатор там указываются оптимальные значения этих емкостей, с которыми кварц будет работать наиболее устойчиво.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Пн июн 09, 2014 15:29:55
pyzhman
Alexeyslav писал(а):Если посмотреть даташит на конкретный кварцевый резонатор
Поправлю - на конкретный микроконтроллер, ибо генератор в микрконтроллере.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Пн июн 09, 2014 17:39:05
Alexeyslav
Нет, именно на кварцевый резонатор. эти конденсаторы являются одновременно элементами генератора и элементами эквивалентной схемы резонатора. Из-за их несоответствия резонатору последний может возбуждаться на неродной частоте или вовсе частота уйдет от номинала. В даташите на МК имеются номиналы РЕКОМЕНДУЕМЫЕ, а на кварцевый резонатор - оптимальные.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт июн 10, 2014 15:52:00
sphincs
почему при передаче по UART получается так: при первой передаче от одного контроллера другому второй на дисплей выводит только 4 символа из N переданных? при последующих передачах все нормально.
передатчик
Спойлер
void USART_transmitter(unsigned char data)
{
while ( ! ( UCSRA & (1<<UDRE)));
UCSRB &= ~(1<<TXB8);
if ( data & 0x100)
UCSRB |= (1<<TXB8);
UDR = data;
// PORTB.0=1;
}
void main(void)
unsigned char d[]={'h','e','l','l','o','-','m','i','r','\0'};
while (1)
if (PINC.2==1)
{
for (i=0; i<10; i++)
{
unsigned char symbol = d;
USART_transmitter(symbol);
}
//PORTB.0=0;
}
приемник
Спойлер
// USART Receiver buffer
#define RX_BUFFER_SIZE 10
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE <= 256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index++]=data;
lcd_out=1;
#if RX_BUFFER_SIZE == 256
// special case for receiver buffer size=256
if (++rx_counter == 0) rx_buffer_overflow=1;
#else
if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
}
#endif
}
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index++];
#if RX_BUFFER_SIZE != 256
if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#endif
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
// Standard Input/Output functions
#include <stdio.h>
// Declare your global variables here
void main(void)
{
lcd_clear();
while (1)
{
// Place your code here
if (lcd_out==1)
{
lcd_clear();
lcd_puts(&rx_buffer[0]);
delay_ms(200);
lcd_out = 0;
rx_wr_index= 0;
rx_counter = 0;
}
}
}
скрины протеуса в прикрепленке
этот усарт меня убивает 
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт июн 10, 2014 16:32:39
oleg110592
можно попробовать восстановить как нагенерил Codevision
т.е. убрать lcd_out=1;
и так сделать:
Код: Выделить всё
if (rx_buffer_overflow)
{
lcd_clear();
for (i=0; i<10; i++)
{
lcd_puts(&rx_buffer[i]);
}
//delay_ms(200); это зачем - пока пауза могут прийти данные с компорта многократно
rx_buffer_overflow = 0;
rx_wr_index= 0;
rx_counter = 0;
}
а вот когда посылаем надо выдержать паузу между посылками - пока микроконтроллер выводит на индикатор:
Код: Выделить всё
while (1)
if (PINC.2==1)
{
for (i=0; i<10; i++)
{
unsigned char symbol = d[i];
USART_transmitter(symbol);
}
delay_ms(200);
}
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт июн 10, 2014 17:07:34
sphincs
oleg110592 писал(а)://delay_ms(200); это зачем - пока пауза могут прийти данные с компорта многократно
я отправляю по нажатию кнопки пока что. паузы были потому что отслеживал выполнение программы светодиодами
премного благодарен. все заработало, но с небольшими комментариями:
конструкция
Код: Выделить всё
for (i=0; i<10; i++)
{
lcd_puts(&rx_buffer[i]);
}
не нужна. в rx_buffer хранится вся принятая строка и выходит так, что она целиком выводится на дисплей командой lcd_puts(&rx_buffer[0]). в случае for'a она просто 10 раз подряд пишется и с какими-то искажениями уже (индекс в скобках обозначает символ, с которого начинается передача строки. поставил экран побольше и проверил)
ну и задержка в передатчике понадобилась при исправленном приемнике (а то лишнее докидывал передатчик), хотя до этого и без нее обходилось, начиная со второй передачи

Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт июн 10, 2014 23:24:28
oleg110592
тогда наверное можно просто так выводить строку из массива:
lcd_puts(rx_buffer);
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Ср июн 11, 2014 09:20:36
sphincs
oleg110592 писал(а):lcd_puts(rx_buffer);
да, действительно работает