Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Чт мар 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 испорчена и не может использоваться
Пт мар 22, 2019 20:38:04
какая то непонятная ерунда. то пишешь код и прерывание работает по приему. то пишешь уже другой код и не работает. не могу понять где допускаю ошибку при написании.
ха. взял объявил
UCSRA=0x00;
UCSRB=0x90;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
в конце списка перед while (1) и все заработало. интересно как и почему это произошло. ну теперь надо дальше уже думать что отправлять и зачем
мое предположение. сначала нужно объявить порты ввода вывода а уже затем только 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 оказывается не ноль, а правильное значение.
Вт апр 09, 2019 15:28:48
Да верно. Я уже потом разобрался. )
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.