|
|
  |
Запуск UART на atmega48 |
|
|
|
May 15 2009, 01:19
|
Участник

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

|
Компилятор GCC/WinAVR.
При компиляции программы пишет, что UCSRA, UCSRB и прочие регистры не задекларированы. Залез в iom48.h - там таких регистров нет. В документации к atmega48 регистры указаны. В чем тут дело?
|
|
|
|
|
May 15 2009, 06:41
|
Гуру
     
Группа: Свой
Сообщений: 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;
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
May 15 2009, 16:26
|
Участник

Группа: Участник
Сообщений: 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), переслать этот байт, а потом софт на ПК должен этот байт прочитать. Драйверы микросхемы установились, микросхема с ПК видна. Но этот самый байт не читается. Код взят из какого-то примера, нарытого в инете.
|
|
|
|
|
May 16 2009, 08:06
|
Гуру
     
Группа: Свой
Сообщений: 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 и далее вниз.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
May 16 2009, 09:30
|

Чайник, 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.
|
|
|
|
|
May 16 2009, 12:24
|
Участник

Группа: Участник
Сообщений: 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 остаётся старая (зашитая программатором) переменная. Не знаю, почему.
|
|
|
|
|
May 16 2009, 12:48
|

Чайник, 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); Или показывайте как вы пишете...
|
|
|
|
|
May 16 2009, 12:58
|
Участник

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

|
Я писал обычное присваивание: EE_MyVariable=10; Как я понимаю, это не правильно? А что тогда происходит после такого присваивания? Куда заносится число 10, если она не попадает в EEPROM? Переменная дублируется в оперативку? Или как?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|