Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить

UART проблема

Чт мар 21, 2019 10:55:16

Написал такой код.
Спойлер#include <mega8.h>

#include <alcd.h>
#include <delay.h>
#include <stdio.h>



unsigned int temp=0;
interrupt [USART_RXC] void se (void)
{ temp=30;
PORTC.5=~PORTC.5;}

void wait (void)
{TCNT1=0;
while (TCNT1<13){};
}






void main(void)
{
unsigned char string[20];
UCSRA=(0<<MPCM|0<<U2X|0<<UPE|0<<DOR|0<<FE|0<<UDRE|0<<TXC|0<<RXC);
UCSRB=(0<<TXB8|0<<RXB8|0<<UCSZ2|0<<TXEN|1<<RXEN|0<<UDRIE|0<<TXCIE|1<<RXCIE);
UCSRC=(0<<UCPOL|1<<UCSZ0|1<<UCSZ1|0<<USBS|0<<UPM0|0<<UPM1|0<<UMSEL|0<<URSEL);
UBRRH=0;
UBRRL=51;



PORTB=0x00;
DDRB=0x00;

PORTC=0x00;
DDRC=0xFF;

PORTD=0xFF;
DDRD=0x00;

TCCR0=0x00;
TCNT0=0x00;


TCCR1A=0x00;
TCCR1B=0x03;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

MCUCR=0x00;

TIMSK=0x00;

UCSRB=0x00;

ACSR=0x80;
SFIOR=0x00;


ADCSRA=0x00;

SPCR=0x00;

TWCR=0x00;

lcd_init(16);

while (1)
{#asm ("sei");

lcd_gotoxy(0,0);
sprintf(string,"%05x\n",temp);
lcd_puts(string);
delay_ms(1000);
lcd_clear();
PORTC.4=0;
wait ();
PORTC.4=0;
wait ();
PORTC.4=1;
wait ();
PORTC.4=0;
wait ();
PORTC.4=1;
};

}

не понимаю почему нет прерывания. Как понимаю после того как URD принимает байт должно вызваться прерывание и как я написал ножка порта инвертироваться. То есть мигать по сути. Как передатчик использовал другую ногу как TxD. В чем может быть причина.



в общем то у меня получилось отправлять и принимать данные. причем повесил сравнение на принятый байт и действие. но сегодня написав код на другом компе получилась непонятная абра кадабра. прерывания совсем никак не хотели появляться. сравнив код разницы не заметил. для управления выбраны те же самые биты в регистрах. все совершенно одинаково.

а на данный момент codevishion пишет что библиотека alcd.lib испорчена и не может использоваться

Re: UART проблема

Пт мар 22, 2019 20:38:04

какая то непонятная ерунда. то пишешь код и прерывание работает по приему. то пишешь уже другой код и не работает. не могу понять где допускаю ошибку при написании.

ха. взял объявил

UCSRA=0x00;
UCSRB=0x90;
UCSRC=0x86;

UBRRH=0x00;
UBRRL=0x33;


в конце списка перед while (1) и все заработало. интересно как и почему это произошло. ну теперь надо дальше уже думать что отправлять и зачем

мое предположение. сначала нужно объявить порты ввода вывода а уже затем только UART. иначе не получается

Re: UART проблема

Пн апр 08, 2019 20:58:32

Вы сначала пишете:
Код:
UCSRA=(0<<MPCM|0<<U2X|0<<UPE|0<<DOR|0<<FE|0<<UDRE|0<<TXC|0<<RXC);
UCSRB=(0<<TXB8|0<<RXB8|0<<UCSZ2|0<<TXEN|1<<RXEN|0<<UDRIE|0<<TXCIE|1<<RXCIE); //Вот тут разрешается прерывание по приёму (RXCIE)
UCSRC=(0<<UCPOL|1<<UCSZ0|1<<UCSZ1|0<<USBS|0<<UPM0|0<<UPM1|0<<UMSEL|0<<URSEL);


А потом зачем-то:
Код:
UCSRB=0x00;


После этого прерывания USART все запрещены. Если же переставить верхние три строчки перед while(1), в UCSRB оказывается не ноль, а правильное значение.

Re: UART проблема

Вт апр 09, 2019 15:28:48

Да верно. Я уже потом разобрался. )
Ответить