将字符存储在EEPROM和EEPROM中回声

时间:2010-12-01 09:23:00

标签: c avr-gcc

我正在尝试为AVR STK600板编写一个程序,其中我正在通过LED循环。按下开关时,相应的LED会亮起(到此为止,一切顺利)。现在我正在为电路板添加另一个功能,尝试使用USART(RS232串行通信)。

- 当用户按下某个键时,应该回显(在超级终端上)。 - 当击中crtl-Z时,数据应记录在EEPROM中(再次击中crtl-z应停止记录)。 - 按下crtl-y时,应播放录制的数据。

这里遇到的问题是USART(我确实检查了所有硬件设置,进行了环回测试......一切运行正常)所以代码应该有问题。在EEPROM,USART进展顺利之后,一切顺利。

这是我的代码,我正在使用AVR-GCC。我也没有使用“avrlib”,因为正在采取的课程不允许我们这样做:

#include "header.h"

#define BASE_ADDR   0x20

#define READ_ATMEGA(ADDR)   *((P_CHAR)(BASE_ADDR + ((ADDR) * ADDR_MULTIPLIER)))

#define WRITE_ATMEGA(ADDR, DATA)    *((P_CHAR)(BASE_ADDR + ((ADDR) * ADDR_MULTIPLIER))) = DATA

#define LED_DELAY 10

#define F_CPU 8000000

#define BAUDRATE 9600

#define BAUD_PRESCALER (((F_CPU/(BAUDRATE * 16UL)))-1)

volatile UINT intrs, i = 1, count, switch_pressed = 0, uiAdd, uiAddEnd, flag_led_intr;
volatile UINT record, play_recorded_keys, RX, flag_serial_receiver, TX_complete; 

volatile unsigned char get_switch=0, data;

extern void __vector_23 (void) __attribute__ ((interrupt)); 
extern void __vector_25 (void) __attribute__ ((signal)); 
extern void __vector_27 (void) __attribute__ ((interrupt)); 

void enable_ports(void); 
int get_switchpressed(void);
void call_interruptHandler(void);
void usart_init(void); 
//void usart_bounce();
void initialize(void);
void ReadWriteSerialPort(void);
void EEPROM_write(unsigned int uiAddress, unsigned char ucData);
unsigned char EEPROM_read(unsigned int uiAddress);


void initialize(void)
{
    cli();      //stop all interrupts

    flag_led_intr = 0;
    record = 0;
    play_recorded_keys = 0;
    RX = 0;
    flag_serial_receiver = 0;

    uiAdd = 0;
    uiAddEnd = 0;
    TX_complete = 0;

    enable_ports();
    usart_init();

    sei();
}

void enable_ports() //Enables PORTB, PORTD & TIMER
{ 

    WRITE_ATMEGA(DDRB,0xff);    //PORTB as output for leds 

    WRITE_ATMEGA(PORTB,0xff);   //Initialize PORTB

    WRITE_ATMEGA(DDRD, 0x00);    //PORTD as input for switches

    WRITE_ATMEGA(TCCR0B, 0x05);     //Setting TIMER to 1024 prescaler

    WRITE_ATMEGA(TIMSK0, 0x01); 

    WRITE_ATMEGA(TCNT0, 256-LED_DELAY);

    intrs = 0; 
} 

void usart_init(void) //Enables USART
{ 
   /* Set baud rate */ 

   WRITE_ATMEGA(UBRR0L, BAUD_PRESCALER); 
   WRITE_ATMEGA(UBRR0H,(BAUD_PRESCALER>>8)); 

   /* Set frame format: 8 bit data + start bit + stop bit */ 

   WRITE_ATMEGA(UCSR0C, 0x06);

   /* Enable reciever and transmitter */ 

   WRITE_ATMEGA(UCSR0B, 0xD8); 
} 


void __vector_23 (void)
{ 
   call_interruptHandler();
}

void __vector_25 (void)
{ 
    RX = UDR0;
    flag_serial_receiver = 1;
    sei();
}

void __vector_27 (void)
{
    TX_complete = 1;
}
void call_interruptHandler()
{
    intrs++;
    if(intrs > LED_DELAY)
    {
        WRITE_ATMEGA(PORTB, 0xff<<i);
        i++;

        if(i==10)
        {
            WRITE_ATMEGA(PORTB, 0xff);
            i = 1;
        }
    }

    count = get_switchpressed();

    if(count != 0) 
    {
        WRITE_ATMEGA(PORTB, 0xff<<count); 
        intrs = 0;

    }

   //sei(); 
} 

int get_switchpressed()
{ 

    get_switch = READ_ATMEGA(PIND);

    switch(get_switch) {

        case 0xFE:  
                switch_pressed = 1;
                break;

        case 0xFD:  
                switch_pressed = 2;
                break;

        case 0xFB:  
                switch_pressed = 3;
                break;

        case 0xF7:  
                switch_pressed = 4;
                break;

        case 0xEF:
                switch_pressed = 5;
                break;

        case 0xDF:
                switch_pressed = 6;
                break;

        case 0xBF:
                switch_pressed = 7;
                break;

        case 0x7F:
                switch_pressed = 8;
                break;

    };

    return (switch_pressed);
}

void ReadWriteSerialPort(void)
{
    if(RX == 0x1A)
    {
        record = !record;
        play_recorded_keys = 0;
    }

    else if(RX == 0x19)
    {
        record = 0;
        play_recorded_keys = !play_recorded_keys;
    }

    if(record)
    {
        EEPROM_write(uiAdd++, RX);
    }
    if(uiAdd == 4096)
    {
        record = 0;
        uiAddEnd = 4096;
    }
    else
        uiAddEnd = uiAdd;
}   

void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
    while(EECR & (1<<EEPE));            /* Wait for completion of previous write */

    WRITE_ATMEGA(EEARH,(uiAddress>>8)); /* Set up address and Data Registers */
    WRITE_ATMEGA(EEARL, uiAddress);

    WRITE_ATMEGA(EEDR, ucData);

    WRITE_ATMEGA(EECR, (EECR |(1<<EEMPE))); /* Write logical one to EEMPE */

    WRITE_ATMEGA(EECR, (EECR |(1<<EERE)));  /* Start eeprom write by setting EEPE */
}

unsigned char EEPROM_read(unsigned int uiAddress)
{
    while(EECR & (1<<EEPE));    /* Wait for completion of previous write */

    WRITE_ATMEGA(EEARH,(uiAddress>>8));     /* Set up address register */
    WRITE_ATMEGA(EEARL,uiAddress);

    WRITE_ATMEGA(EECR, (EECR |(1<<EERE)));      /* Start eeprom read by writing EERE */
    return EEDR;            /* Return data from Data Register */
}

int main(void) 
{ 
   initialize(); 
   while(1) 
   { 
        if(flag_serial_receiver == 1)
        {
            flag_serial_receiver = 0;
            ReadWriteSerialPort();
        }
        if(play_recorded_keys)
        {
            unsigned char TX = EEPROM_read(uiAdd++);

            if(uiAdd == 4096 || uiAdd >= uiAddEnd)
            {
                play_recorded_keys = 0;
                uiAdd = 0;
            }

            while((UCSR0A & (1<<UDRE0)) == 0);
            WRITE_ATMEGA(UDR0,TX);

            while(TX_complete == 0);
                TX_complete;
        }

   } 
return(0);
}

这是header.h文件

#ifndef HEADER_H

#define HEADER_H

/*******PORTS******************/

#define PINA  0x0
#define DDRA  0x1
#define PORTA 0x2

#define PINB  0x3
#define DDRB  0x4
#define PORTB 0x5

#define PINC  0x6
#define DDRC  0x7
#define PORTC 0x8

#define PIND  0x9
#define DDRD  0xA
#define PORTD 0xB

#define PINE  0xC
#define DDRE  0xD
#define PORTE 0xE

#define PINF  0xF
#define DDRF  0x10
#define PORTF 0x11

#define PING  0x12
#define DDRG  0x13
#define PORTG 0x14

#define PINH  0xE0
#define DDRH  0xE1
#define PORTH 0xE2

#define PINJ  0xE3
#define DDRJ  0xE4
#define PORTJ 0xE5

#define PINK  0xE6
#define DDRK  0xE7
#define PORTK 0xE8

#define PINL  0xE9
#define DDRL  0xEA
#define PORTL 0xEB


/************TIMERS ************/
#define TCCR0A  0x24  
#define TCCR0B  0x25  
#define TCNT0   0x26  
#define OCR0A   0x27  
#define OCR0B   0x28  
#define TIMSK0  0x4E  
#define TIFR0   0x15  
#define COM0A1  0x7   
#define COM0A0  0x6   
#define COM0B1  0x5   
#define COM0B0  0x4   
#define WGM02   0x3   
#define WGM01   0x1   
#define WGM00   0x0   
#define CS02    0x2   
#define CS01    0x1   
#define CS00    0x0   
#define OCIE0B  0x2   
#define OCIE0A  0x1   
#define TOIE0   0x0   


/****** Interrupts *******/
#define EICRA   0x49  
#define EICRB   0x4A  
#define EIMSK   0x1D  

#define PCICR   0x48
#define PCMSK0  0x4B
#define PCMSK1  0x4C
#define PCMSK2  0x4D

/************EEPROM************/

#define EECR    0x1F

#define EEDR    0x20

#define EEARL   0x21

#define EEARH   0x22

#define EEAR0   0
#define EEAR1   1
#define EEAR2   2
#define EEAR3   3
#define EEAR4   4
#define EEAR5   5
#define EEAR6   6
#define EEAR7   7
#define EEAR8   8
#define EEAR9   9
#define EEAR10  10
#define EEAR11  11

#define LSB     0
#define MSB     7

#define EERE    0
#define EEPE    1
#define EEMPE   2
#define EERIE   3
#define EEPM0   4
#define EEPM1   5



/************UART Status Control Registers & Data Registers **************/

/** USART3 **/
#define UCSR3A      0x130 
#define UCSR3B      0x131 
#define UCSR3C      0x132 
#define UBRR3L      0x134 
#define UBRR3H      0x135 
#define UDR3        0x136 
#define UDR3_TXB    UDR3  /* transmit data buffer register */
#define UDR3_RXB    UDR3  /* receive data buffer register  */

/** USART2 **/

#define UDR2        0xD6
#define UBRR2H      0xD5
#define UBRR2L      0xD4
#define UCSR2C      0xD2
#define UCSR2B      0xD1
#define UCSR2A      0xD0
#define UDR2_TXB    UDR2  /* transmit data buffer register */
#define UDR2_RXB    UDR2  /* receive data buffer register  */

/** USART1 **/
#define UDR1        0xCE    
#define UBRR1H      0xCD
#define UBRR1L      0xCC    
#define UCSR1C      0xCA
#define UCSR1B      0xC9
#define UCSR1A      0xC8
#define UDR1_TXB    UDR1  /* transmit data buffer register */
#define UDR1_RXB    UDR1  /* receive data buffer register  */

/** USART0 **/
#define UDR0        0xC6    
#define UBRR0H      0xC5
#define UBRR0L      0xC4    
#define UCSR0C      0xC2
#define UCSR0B      0xC1
#define UCSR0A      0xC0
#define UDR0_TXB    UDR0  /* transmit data buffer register */
#define UDR0_RXB    UDR0  /* receive data buffer register  */

#define TXB80       0
#define RXB80       1
#define UCSZ02      2
#define TXEN0       3
#define RXEN0       4
#define UDRIE0      5
#define TXCIE0      6
#define RXCIE0      7

#define MPCM0   0
#define U2X0    1
#define UPE0    2
#define DOR0    3
#define FE0     4
#define UDRE0   5
#define TXC0    6
#define RXC0    7

#define UCPOL0  0
#define UCSZ00  1
#define UCSZ01  2
#define USBS0   3
#define UPM00   4
#define UPM01   5
#define UMSEL00 6
#define UMSEL01 7

/******************************/

# define sei()  __asm__ __volatile__ ("sei" ::)

# define cli()  __asm__ __volatile__ ("cli" ::)


/* vectors in AVR are hard cided to a function by name */
extern void __vector_23 (void) __attribute__ ((interrupt));

/* interrupt is disabled at initilization */
extern void __vector_11 (void) __attribute__ ((interrupt));


/*******ADDR_MULTIPLIER********/

#define ADDR_MULTIPLIER     1


/*******Type Declaration*******/

#define UINT unsigned int
#define P_CHAR volatile unsigned char *



/***LEDs ON-OFF Declaration****/

#define LED_ON      0x00
#define LED_OFF     0xff

#endif

如果有人可以帮助我解决这个难题,我会非常感激,因为我很难淹没它。

提前致谢。

1 个答案:

答案 0 :(得分:1)

嗯,检查整个代码有点困难,这很长,当然AVR上可能会有很多不好的东西......

我认为你应该首先删除所有LED的代码,然后单独尝试使用UART录像机,直到它工作。

我唯一看到的就是你:

unsigned char TX = EEPROM_read(uiAdd ++);

但是你没有将uiAdd设置为从0开始......

无论如何,我不确定,因为很难遵循程序流程。