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

Отбой - я не там вписал используемые функции, всего то.
- ximik
- Потрогал лапой паяльник
- Сообщения: 301
- Зарегистрирован: Вс ноя 07, 2010 14:48:55
- Откуда: Москва
Re: Мелкие вопросы по МК и ПЛИС.
Кто нибудь работал с таким синизубым модулем или чем нибудь оналогичным? xs3868 интересует общение по UART, как переименовать , вводить команды... я попробовал, забивать команды из даташита но на команды не реагирует, а отвечает какойто кашей.
:kill хелп 
:kill хелп 
Если болит голова, значит она есть!)
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
Скорость передачи нужно правильную установить.
- ximik
- Потрогал лапой паяльник
- Сообщения: 301
- Зарегистрирован: Вс ноя 07, 2010 14:48:55
- Откуда: Москва
Re: Мелкие вопросы по МК и ПЛИС.
Alexeyslav писал(а): правильную установить.
скорость ставил рекомендуемую, я ее выделил, 8 дата бит, 1 стоп бип программа терминал 1.9
- Вложения
-
- 58.jpg
- (24.74 КБ) 215 скачиваний
Если болит голова, значит она есть!)
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
На заборе тоже написано... а там дрова лежат. Твой терминал не ругается на Framing error или другие ошибки? Посмотри осциллографом реально какая скорость в порту на выходе модуля, он ведь может быть настроен на ЛЮБУЮ скорость а не дефолтную. Кто его знает у кого и где он побывал прежде чем попасть к тебе. Обычно они приходят настроенные на 38400.
-
Chettuser
Re: Мелкие вопросы по МК и ПЛИС.
Мучает вопрос - для чего ставятся 2 конденсатора от кварца на общий? Собственно не знаю в какую тему вопрос - поскольку он и генераторов на логике с кварцем тоже касается.
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
Конденсаторы являются частью генератора, они создают необходимый сдвиг фазы для того чтобы генератор смог работать устойчиво на основной частоте кварца. Без них он будет долго раскачиваться и может не завестись вовсе, или завестись на фундаментальной частоте кварца или на одной из его гармоник. Если посмотреть даташит на конкретный кварцевый резонатор там указываются оптимальные значения этих емкостей, с которыми кварц будет работать наиболее устойчиво.
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
Alexeyslav писал(а):Если посмотреть даташит на конкретный кварцевый резонатор
Поправлю - на конкретный микроконтроллер, ибо генератор в микрконтроллере.
Docendo discimus
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
Нет, именно на кварцевый резонатор. эти конденсаторы являются одновременно элементами генератора и элементами эквивалентной схемы резонатора. Из-за их несоответствия резонатору последний может возбуждаться на неродной частоте или вовсе частота уйдет от номинала. В даташите на МК имеются номиналы РЕКОМЕНДУЕМЫЕ, а на кварцевый резонатор - оптимальные.
- sphincs
- Нашел транзистор. Понюхал.
- Сообщения: 174
- Зарегистрирован: Вт сен 11, 2012 09:13:52
- Откуда: Брест, Беларусь
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
почему при передаче по UART получается так: при первой передаче от одного контроллера другому второй на дисплей выводит только 4 символа из N переданных? при последующих передачах все нормально.
передатчик
{
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[i];
USART_transmitter(symbol);
}
//PORTB.0=0;
}
приемник
#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;
}
}
}
скрины протеуса в прикрепленке
этот усарт меня убивает
передатчик
Спойлер
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[i];
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;
}
}
}
скрины протеуса в прикрепленке
этот усарт меня убивает
- Вложения
-
- hello-mir.png
- 2
- (51.22 КБ) 299 скачиваний
-
- hell.png
- 1
- (53.32 КБ) 261 скачивание
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Мелкие вопросы по МК и ПЛИС.
можно попробовать восстановить как нагенерил Codevision
т.е. убрать lcd_out=1;
и так сделать:
а вот когда посылаем надо выдержать паузу между посылками - пока микроконтроллер выводит на индикатор:
т.е. убрать 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);
}- sphincs
- Нашел транзистор. Понюхал.
- Сообщения: 174
- Зарегистрирован: Вт сен 11, 2012 09:13:52
- Откуда: Брест, Беларусь
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
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 раз подряд пишется и с какими-то искажениями уже (индекс в скобках обозначает символ, с которого начинается передача строки. поставил экран побольше и проверил)
ну и задержка в передатчике понадобилась при исправленном приемнике (а то лишнее докидывал передатчик), хотя до этого и без нее обходилось, начиная со второй передачи
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Мелкие вопросы по МК и ПЛИС.
тогда наверное можно просто так выводить строку из массива:
lcd_puts(rx_buffer);
lcd_puts(rx_buffer);
- sphincs
- Нашел транзистор. Понюхал.
- Сообщения: 174
- Зарегистрирован: Вт сен 11, 2012 09:13:52
- Откуда: Брест, Беларусь
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
oleg110592 писал(а):lcd_puts(rx_buffer);
да, действительно работает