atmega2560中的串行输出异常

时间:2015-01-19 07:10:48

标签: serial-port avr atmega

我遇到了atmega2560串行输出端口的问题。当我将AVRISPmkII编程器连接到atmega2560时,所有串口都以指定的波特率提供输出数据,但是当我断开编程器时,没有输出但是1秒LED闪烁。我不认为这是代码问题!m。我没有和其他程序员一起尝试,因为这就是我的全部。无论如何,代码非常简单 - 1秒钟闪烁,通过RS232端口输出。 无论编程器是否连接,复位引脚上的电压为5V,而sck的电压约为1.19V。 这有什么问题?

enter image description here

该图显示了ISP和串行端口电路。

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <string.h>

void USART0_init(void) /*************** USART 0 ***********************/
{    
    UCSR0A = 0x00;
    UCSR0B = 0b00011000;
    UCSR0C = 0b00000110;        
    UBRR0H = 0x00;
    UBRR0L = 103;   //baud rate: 9600, right - rx, tx, gnd - left
}

void USART0_putc(char data)
{
    while(!(UCSR0A&0x20));
    UDR0=data;
}

void USART0_puts(char* str){
    while(*str) {USART0_putc(*str++);}
}

void USART1_init(void)  /*************** USART 1 ***********************/
{   
    UCSR1A =  0x00;
    UCSR1B =  0b10011000;
    UCSR1C =  0b00000110;    

    UBRR1H = 0x00;
    UBRR1L = 103;   //baudrate: 9600
}

void USART1_putc(char data)
{
    while(!(UCSR1A&0x20));
    UDR1=data;
}

void USART1_puts(char* str){
    while(*str) {USART1_putc(*str++);}
}

char t = 0;
char rx_buf1[50];
ISR(USART1_RX_vect)
{
    cli();
    t = UDR1;
    rx_buf1[cnt1++] = t;    

    if (t == 0x0a){ // detect EOL \n FOR NOW
        rx_buf1[cnt1] = '\0';
        sprintf(out_buf1, "\r\nS1, ");
        strcat(out_buf1, (const char*)rx_buf1);
        sprintf(out_buf1, ", /");

        USART0_puts(out_buf1);
        cnt1 = 0;
        rx_complete1 = 1;       
    }
    if (cnt1 >= 50){
        cnt1 = 0;           
    }           
    sei();      
}
void timer_init(void)
{
    cli();   
    TCCR1B = (1<<WGM12);        //CTC mode        
    OCR1A = 1561;       //100 ms
    TIMSK1 |= (1<<OCIE1A);
    TCCR1B |= (1<<CS12)|(0<<CS11)|(1<<CS10);    
}

void dev_init(void)
{
    DDRA = 0x0F;
    PORTA = 0x00;
    timer_init();
    stdout = &uart0_str;
    stderr = &uart1_str;
    USART0_init();
    USART1_init();
    sei();
}

int main(void)
{            
    dev_init();

    while(1)
    {   
        process();                                  
    }
    return 0;
}

volatile unsigned char tick_100ms;
char out_buf[100];
float speed = 4.3;

void process(void){
    static unsigned char lc=1;
    static uint8_t tick_cnt = 0;

    if (tick_100ms){
        tick_100ms = 0;
        tick_cnt++;             

        if (tick_cnt == 10){
            tick_cnt = 0;
            PORTA = ~lc; /* this code is for blinking 4 LEDS */
            lc = lc*2;   /* very 1 seconds alternately*/
            if (lc >8) lc = 1;          
            sprintf(out_buf, "S1, speed: %05.2f/\r\n", (double)speed);
            USART0_puts(out_buf);
            USART1_puts(out_buf);
        }
    }
}

我在下面发布了我的代码。 由于没有传入数据,因此不需要uart 1中断代码。禁用它们没有任何区别。

0 个答案:

没有答案