реклама на сайте
подробности

 
 
> опять USART на 16 меге, прерывание по приёму
*SERG
сообщение Jan 29 2006, 08:11
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 274
Регистрация: 10-08-05
Из: Екатеринбург
Пользователь №: 7 517



Регистры настроил так:

UCSRA=0x00;
UCSRB=0B11011000;
UCSRC=0B10000110;
UBRRH=0x00;
UBRRL=0x65;

подпрограммы прерывания

interrupt [USART_RXC] void usart_rx_isr(void)
{

prinat_ussap=UDR;
est_dannie=1;
zapis_end=0;

}


// USART Transmitter interrupt service routine
interrupt [USART_TXC] void usart_tx_isr(void)
{
#asm
nop;
#endasm
}

Пишу в CVAVR.

Проблемма в том, что когда приходит первый байт, прерывание не происходит, а вот когда уже второй байт пришёл, то происходит прерывание, переменной "prinat_ussap" присваивается значение первого байта blink.gif
А теоретически при приходе первого байта доложно происходить прерывание. Регистр UCSRB, больше не трогаю, все прерывания разрешаю в самом начале, больше не запрещаю.
Где собака порылась??? smile.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Spider
сообщение Feb 1 2006, 08:50
Сообщение #2


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



А что если у меня при следующем коде программы постоянно с проца приходит символ?

Код
/*********************************************
* Chip type           : ATmega16
* Clock frequency     : 16,000000 MHz
*********************************************/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <inttypes.h>
#include <avr/iom16.h>

#define F_OSC 16000000                   /* oscillator-frequency in Hz */
#define UART_BAUD_RATE 9600
#define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC) ((F_OSC)/((UART_BAUD_RATE)*16l)-1)

void delay_ms(unsigned short ms) {
    unsigned short outer1, outer2;
    outer1 = 200;
    while (outer1) {
        outer2 = 1000;
        while (outer2) {
            while ( ms ) ms--;
            outer2--;
        }
        outer1--;
    }
}

void usart_putc(unsigned char c) {
   // wait until UDR ready
    while(!(UCSRA & (1 << UDRE)));
    UDR = c;    // send character
}

void uart_puts (char *s) {
    //  loop until *s != NULL
    while (*s) {
        usart_putc(*s);
        s++;
    }
}

void init(void) {
    // set baud rate
    UBRRH = (uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_OSC)>>8);
    UBRRL = (uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_OSC);

    // Enable receiver and transmitter; enable RX interrupt
    UCSRB = (1 << RXEN) | (1 << TXEN) | (1 << RXCIE);

    //asynchronous 8N1
    UCSRC = (1 << URSEL) | (3 << UCSZ0);
}

// INTERRUPT can be interrupted
// SIGNAL can't be interrupted
SIGNAL (SIG_UART_RECV) { // USART RX interrupt
    unsigned char c;
    c = UDR;
    usart_putc(c);
}

int main(void) {
    init(); // init USART

    // send initial character
    while(!(UCSRA & (1 << UDRE)));
    UDR = 0x43; // "C"
    while(!(UCSRA & (1 << UDRE)));
    UDR = 0x0d;

    uart_puts("Test\n\r");

    sei();  // enable interrupts

    // enable  PD5 as output
    DDRD |= (1<<PD5);
    while (1) {
        // PIN5 PORTD clear -> LED off
        PORTD &= ~(1 << PD5);
        delay_ms(500);
        // PIN5 PORTD set -> LED on
        PORTD |= (1 << PD5);
        delay_ms(500);    
    }
    return 0;
}


До мерцания диода даже не доходит. В терминалке на компе вижу:
Цитата
Test
tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt
t....

и так бесконечно.
help.gif
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 18:24
Рейтинг@Mail.ru


Страница сгенерированна за 0.0139 секунд с 7
ELECTRONIX ©2004-2016