Мелкие вопросы по МК и ПЛИС.
Чет нифига не пойму! В PIC16F887 вообще возможно сохранение таблицы в памяти программ аналогично PIC18м?
- Реклама
Возможно. Но обращение будет не как в PIC18 (табличное чтение), а через retlw. Собственно, при проганье на Си это по барабану 
Именно как в 18-х. Табличное.Аlex писал(а):Возможно. Но обращение будет не как в PIC18 (табличное чтение), а через retlw.
887-ой один из первых 16-х ПИКов с самопрограммированием. А значит можно читать флеш как данные через косвенную адресацию
Хм... , точно. Поспешил я с ответом, извиняюсьКРАМ писал(а):Именно как в 18-х. Табличное.
Параграф 10.0 даташита, DATA EEPROM AND FLASH PROGRAM MEMORY CONTROL.
- Реклама
Мои нейроны забодала ошибка:
Вызов этой функции изнутри 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() валит ошибками.
Заранее спасибо за желание помочь.
Отбой - я не там вписал используемые функции, всего то.
Кто нибудь работал с таким синизубым модулем или чем нибудь оналогичным? xs3868 интересует общение по UART, как переименовать , вводить команды... я попробовал, забивать команды из даташита но на команды не реагирует, а отвечает какойто кашей.
:kill хелп 

Если болит голова, значит она есть!)
Скорость передачи нужно правильную установить.
скорость ставил рекомендуемую, я ее выделил, 8 дата бит, 1 стоп бип программа терминал 1.9Alexeyslav писал(а): правильную установить.
- Вложения
-
- 58.jpg
- (24.74 КБ) 217 скачиваний
Если болит голова, значит она есть!)
На заборе тоже написано... а там дрова лежат. Твой терминал не ругается на Framing error или другие ошибки? Посмотри осциллографом реально какая скорость в порту на выходе модуля, он ведь может быть настроен на ЛЮБУЮ скорость а не дефолтную. Кто его знает у кого и где он побывал прежде чем попасть к тебе. Обычно они приходят настроенные на 38400.
Мучает вопрос - для чего ставятся 2 конденсатора от кварца на общий? Собственно не знаю в какую тему вопрос - поскольку он и генераторов на логике с кварцем тоже касается.
Это своеобразный кикстартер.
Docendo discimus
Конденсаторы являются частью генератора, они создают необходимый сдвиг фазы для того чтобы генератор смог работать устойчиво на основной частоте кварца. Без них он будет долго раскачиваться и может не завестись вовсе, или завестись на фундаментальной частоте кварца или на одной из его гармоник. Если посмотреть даташит на конкретный кварцевый резонатор там указываются оптимальные значения этих емкостей, с которыми кварц будет работать наиболее устойчиво.
Поправлю - на конкретный микроконтроллер, ибо генератор в микрконтроллере.Alexeyslav писал(а):Если посмотреть даташит на конкретный кварцевый резонатор
Docendo discimus
Нет, именно на кварцевый резонатор. эти конденсаторы являются одновременно элементами генератора и элементами эквивалентной схемы резонатора. Из-за их несоответствия резонатору последний может возбуждаться на неродной частоте или вовсе частота уйдет от номинала. В даташите на МК имеются номиналы РЕКОМЕНДУЕМЫЕ, а на кварцевый резонатор - оптимальные.
почему при передаче по 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;
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;
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 скачивание
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
можно попробовать восстановить как нагенерил 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);
}я отправляю по нажатию кнопки пока что. паузы были потому что отслеживал выполнение программы светодиодами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 раз подряд пишется и с какими-то искажениями уже (индекс в скобках обозначает символ, с которого начинается передача строки. поставил экран побольше и проверил)
ну и задержка в передатчике понадобилась при исправленном приемнике (а то лишнее докидывал передатчик), хотя до этого и без нее обходилось, начиная со второй передачи
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
тогда наверное можно просто так выводить строку из массива:
lcd_puts(rx_buffer);
lcd_puts(rx_buffer);
да, действительно работаетoleg110592 писал(а):lcd_puts(rx_buffer);


