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

 
 
 
Reply to this topicStart new topic
> Запуск 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
SysRq
сообщение May 15 2009, 02:29
Сообщение #2


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

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



#include <avr/io.h>
Go to the top of the page
 
+Quote Post
smk
сообщение May 15 2009, 06:41
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата
UCSRA, UCSRB


Вы нолик забыли в названиях.

Код
//UART0 initialize 115200; 8 bit / 1 stop; parity: Disabled
UCSR0C = 0x06;
UBRR0 = 0x2F; //set baud rate lo
UCSR0B = 0xD8;


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
uuu2
сообщение May 15 2009, 16:26
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 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
DpInRock
сообщение May 15 2009, 17:34
Сообщение #5


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Когда кнопка нажата - там 0. Проверять надо на 0.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
smk
сообщение May 16 2009, 08:06
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата
Но когда кнопка не нажата, условие иногда тоже выполяется!

Дело вероятно в схеме подключения кнопки. Включите подтяжку к плюсу и припаяйте параллельно кнопке конденсатор 1 нан или 10 нан ну что-то такое.
Цитата
char EEMEM char1[12]="123456789012"};

А если так: char EEMEM char1[12]={1,2,3,4,5,6,7,8,9,0,1,2};
Вообще-то я всегда пользовался для записи-чтения EEPROM функциями из даташита стр.24 и 25.

Цитата
Код взят из какого-то примера, нарытого в инете.

Инициализируйте правильно UART и возьмите код из примера в даташите стр.177 и далее вниз.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
SysRq
сообщение May 16 2009, 09:30
Сообщение #7


Чайник, 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
uuu2
сообщение May 16 2009, 12:24
Сообщение #8


Участник
*

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



Цитата(SysRq @ May 16 2009, 13:30) *
Замените "if (PIND & 0b00100000)" на "while(PIND & 0b00100000)". Станет так как хотите.
Это тоже не получилось. В итоге кнопка заработала, когда я её поставил на GND через резистор, выдав в PD5 высокий уровень и проверяя на наличие в PIND5 нуля (т.е. кнопка нажата). Если же поставить кнопку на VCC, выдав в PD5 нинзкий уровень и проверять PIND5 на высокий уровень (нажатие кнопки), то кнопка глючит. Т.е. при нажатии она срабаывает, но при отсутствии нажатия тоже иногда срабатывает (через раз).

Цитата(SysRq @ May 16 2009, 13:30) *
Файл этот наравне с кодом надо зашить в EEPROM программатором (файл - обычный .hex, но данные в нем для заливки в EEPROM).
Это понятно. Но я хотел использовать EEPROM в отладочных целях. Т.е. записать туда переменную, которая будет меняться кодом. А потом прочитать эту память программатором и увидеть эту самую переменную.

А если залить в .eep файл в память МК, а потом изменить переменную в коде, то в итоге в EEPROM остаётся старая (зашитая программатором) переменная. Не знаю, почему.
Go to the top of the page
 
+Quote Post
SysRq
сообщение May 16 2009, 12:48
Сообщение #9


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

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



Цитата(uuu2 @ May 16 2009, 16:24) *
Но я хотел использовать EEPROM в отладочных целях.
...
...изменить переменную в коде, то в итоге в EEPROM остаётся старая (зашитая программатором) переменная. Не знаю, почему.
Все должно получаться. Вероятно, записываете в EEPROM неправильно.

Можно или сходу пользоваться готовым в WinAVR:
Код
#include <avr/eeprom.h>
//...
BYTE EE_MyVariable EEMEM = 0;
BYTE MySomeDebugValue;
//...
eeprom_write_byte(&EE_MyVariable, MySomeDebugValue);

Или показывайте как вы пишете...
Go to the top of the page
 
+Quote Post
uuu2
сообщение May 16 2009, 12:58
Сообщение #10


Участник
*

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



Я писал обычное присваивание: EE_MyVariable=10; Как я понимаю, это не правильно? А что тогда происходит после такого присваивания? Куда заносится число 10, если она не попадает в EEPROM? Переменная дублируется в оперативку? Или как?
Go to the top of the page
 
+Quote Post
SysRq
сообщение May 16 2009, 13:09
Сообщение #11


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

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



Цитата(uuu2 @ May 16 2009, 16:58) *
А что тогда происходит после такого присваивания?
avr-gcc (WinAVR 20081205) 4.3.2 такой код просто игнорирует. Т.е. ничего не происходит :)
Go to the top of the page
 
+Quote Post

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

 


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


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