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

 
 
> Запуск UART на atmega48
uuu2
сообщение May 15 2009, 01:19
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 23-04-09
Пользователь №: 48 156



Компилятор GCC/WinAVR.

При компиляции программы пишет, что UCSRA, UCSRB и прочие регистры не задекларированы. Залез в iom48.h - там таких регистров нет. В документации к atmega48 регистры указаны. В чем тут дело?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
uuu2
сообщение May 15 2009, 16:26
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 23-04-09
Пользователь №: 48 156



Так, кое-что прояснилось, но опять какие-то глюки.

1) Настраиваю пин PD5 на вход, вешаю на него кнопку (к VCC). В коде записываю условие: "if (PIND & 0b00100000) { ... }". Когда кнопка нажата, условие всегда выполняется. Но когда кнопка не нажата, условие иногда тоже выполяется! Вот код:

Код
while (1) {              

            //PORTD = 0xff;    // "1" в порт D
            PORTD |= 1<<3;   // "1" в PD3
            PORTD &= ~(1<<4);  // "0" в PD4
            _delay_ms(250);  // 0.25 сек.

            //PORTD = 0x00;       // "0" в порт D
            PORTD |= 1<<4;   // "1" в PD4
            PORTD &= ~(1<<3);  // "0" в PD3
            _delay_ms(250);   // 0.25 сек.
            
            if (PIND & 0b00100000) {
              //j = PIND;
              PORTD |= 1<<3;   // "1" в PD3
              PORTD |= 1<<4;   // "1" в PD4
              _delay_ms(250);
            }


Мигают лампочки PD3 и PD4. Если кнопка нажата, должны загореться обе лампочки. В реальности происходит следующее: загорается первая, вторая, первая, вторая, обе, первая, вторая, первая, вторая, обе и т.д. почему?

2) Пытаюсь создать переменную в EEPROM:

char EEMEM char1[12]="123456789012";

Прошиваю программу, а потом считываю программатором EEPROM-память. Там все биты равны xFF. А где моя переменная?

3) Пытаюсь отправить байт по UART:

Код
#define USART_BAUD 9600ul
#define USART_UBBR_VALUE ((F_CPU/(USART_BAUD<<4))-1)

void USART_vInit(void)
{
    // Set baud rate
    unsigned short int UBRRH = USART_UBBR_VALUE>>8;
    unsigned short int UBRRL = USART_UBBR_VALUE;

    // Set frame format to 8 data bits, no parity, 1 stop bit
    UCSR0C = (0<<USBS0)|(1<<UCSZ00)|(1<<UCSZ00);

    // Enable receiver and transmitter
    UCSR0B = (1<<RXEN0)|(1<<TXEN0);
}

void USART_vSendByte(unsigned short int u8Data)
{
    // Wait if a byte is being transmitted
    while((UCSR0A&(1<<UDRE0)) == 0);
    // Transmit data
    UDR0 = u8Data;
}

unsigned short int USART_vReceiveByte()
{
    // Wait until a byte has been received
    while((UCSR0A&(1<<RXC0)) == 0);
    // Return received data
    return UDR0;
}
  
// В основой программе
USART_vInit();
USART_vSendByte('A');
...


По UART МК должен соединиться с микросхемой FT232BL (конвертер FIFO-USB), переслать этот байт, а потом софт на ПК должен этот байт прочитать. Драйверы микросхемы установились, микросхема с ПК видна. Но этот самый байт не читается. Код взят из какого-то примера, нарытого в инете.
Go to the top of the page
 
+Quote Post
SysRq
сообщение May 16 2009, 09:30
Сообщение #3


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(uuu2 @ May 15 2009, 20:26) *
Мигают лампочки PD3 и PD4. Если кнопка нажата, должны загореться обе лампочки. В реальности происходит следующее: загорается первая, вторая, первая, вторая, обе, первая, вторая, первая, вторая, обе и т.д. почему?
Замените "if (PIND & 0b00100000)" на "while(PIND & 0b00100000)". Станет так как хотите.

Цитата(uuu2 @ May 15 2009, 20:26) *
Прошиваю программу, а потом считываю программатором EEPROM-память. Там все биты равны xFF. А где моя переменная?
Если написать код:
Код
BYTE EE_EchoAmplitude[8] EEMEM = {130, 130, 130, 130, 130, 130, 130, 130};
//...
value = eeprom_read_byte(&EE_EchoAmplitude[channel]);
то WinAVR создает .eep файл с начальными значениями переменных, которые в программе вы таким образом располагаете в EEPROM. Файл этот наравне с кодом надо зашить в EEPROM программатором (файл - обычный .hex, но данные в нем для заливки в EEPROM).

Цитата(uuu2 @ May 15 2009, 20:26) *
Пытаюсь отправить байт по UART...
Из очевидного только это:
Цитата(uuu2 @ May 15 2009, 20:26) *
Код
unsigned short int UBRRH = USART_UBBR_VALUE>>8;
unsigned short int UBRRL = USART_UBBR_VALUE;
Здесь "unsigned short int" ни в одной строке не нужно, при условии что вы код показываете as is.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 12:33
Рейтинг@Mail.ru


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