Xenom0rph 0 23 ноября, 2008 Опубликовано 23 ноября, 2008 · Жалоба В устройстве требуются простенькие часы. Я задал структуру: typedef struct{ unsigned char sec; //Cекунды unsigned char min; //Минуты unsigned char hour; //Часы }time; time t; Прерывание по переполнению таймера. interrupt [TIM1_COMPA] void timer1_compa_isr(void) { if (++t.sec==60) { t.sec=0; if (++t.min==60) { t.min=0; if (++t.hour == 24) { t.hour =0; } } } } Допустим, отправляю UDR = t.sec. (t.sec к примеру = 7) И на выходе я получаю символ “.” C хекс кодом 07, и так с любым числом, всегда точки. Вот вопрос как передать это по USART? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 23 ноября, 2008 Опубликовано 23 ноября, 2008 · Жалоба Если вы хотите получить в терминале символьное значение, то до того как передавать, преобразуйте число в символьную строку. И передавайте всю символьную строку байт за байтом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aesthete Animus 0 23 ноября, 2008 Опубликовано 23 ноября, 2008 · Жалоба ...а для этого изучите например функции *printf. Кстати, рекоммендую хранить время не в структуре, а ввиде UNIX TimeStamp. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenom0rph 0 23 ноября, 2008 Опубликовано 23 ноября, 2008 · Жалоба Если вы хотите получить в терминале символьное значение, то до того как передавать, преобразуйте число в символьную строку. И передавайте всю символьную строку байт за байтом. А не могли бы вы привести пример кода, использую CVAVR и как то у меня не получается подружиться с этими символьными строками! 2Aesthete Animus UNIX TimeStamp вроде как сложновато, посмотрел примеры, слишком код большой, а у меня уже 85% памяти МК занято, мне что нить попроще! да не айс, подключил библиотеку для использования printf, и все не хватает памяти (( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NullPointer 0 23 ноября, 2008 Опубликовано 23 ноября, 2008 · Жалоба В лоб: void send_value(unsigned char value) { while(!(UCSRA & _BV(UDRE))); UDR = value / 10 + (unsigned char) 0x30; while(!(UCSRA & _BV(UDRE))); UDR = value % 10 + (unsigned char) 0x30; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenom0rph 0 24 ноября, 2008 Опубликовано 24 ноября, 2008 · Жалоба В лоб:void send_value(unsigned char value) { while(!(UCSRA & _BV(UDRE))); UDR = value / 10 + (unsigned char) 0x30; while(!(UCSRA & _BV(UDRE))); UDR = value % 10 + (unsigned char) 0x30; } Спасибо, то что надо, ещё сразу вопрос while(!(UCSRA & _BV(UDRE))); эта строка в не для CVAVR! нашел замену (пример из книги) #DEFINE UDRE 5 while(!(UCSRA & (1<<UDRE))); c ней у меня вообще ничего не передаёт! сделал вот так while(UCSRA.5 != 1) {} Все передает, но меня мучает вопрос правильно ли это? Незнаю как это узнать! Но вроде передает без ошибок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NullPointer 0 24 ноября, 2008 Опубликовано 24 ноября, 2008 · Жалоба МК у вас какой? Смысл этой строки - проверить свободен ли UDR для записи. Конкратнея реализаци здесь - ждать флага Data Register Empty.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shasik 0 24 ноября, 2008 Опубликовано 24 ноября, 2008 · Жалоба В лоб:void send_value(unsigned char value) { while(!(UCSRA & _BV(UDRE))); UDR = value / 10 + (unsigned char) 0x30; while(!(UCSRA & _BV(UDRE))); UDR = value % 10 + (unsigned char) 0x30; } Небольшое замечание ('SysRq' мне друг, но истина дороже): работает только с числами меньше 100. Для работы "больше 100", нужно еще пару строк (и т.д. для 1000, 10000, ...). Более общий подход для таких дел: использовать BCD. IMHO. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenom0rph 0 24 ноября, 2008 Опубликовано 24 ноября, 2008 · Жалоба МК у вас какой? Смысл этой строки - проверить свободен ли UDR для записи. Конкратнея реализаци здесь - ждать флага Data Register Empty.. мк тини 2313 про строку я знаю, но вроде как моя строчка тоже должна работать, как UDRE =1, так можно слать новый байт. Небольшое замечание ('SysRq' мне друг, но истина дороже): работает только с числами меньше 100. Для работы "больше 100", нужно еще пару строк (и т.д. для 1000, 10000, ...). Более общий подход для таких дел: использовать BCD. IMHO. Мне достаточно до 100 ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Paulina 0 24 ноября, 2008 Опубликовано 24 ноября, 2008 (изменено) · Жалоба или так (без деления): void uchartostr(unsigned char arg) { unsigned char ones, tens; ones=arg; tens=0; while(ones>10) { ones-=10; tens++; //десятки } //в ones теперь - еденицы tens+=0x30; //преобразуем в ascii ones+=0x30; //преобразуем в ascii while(!(UCSRA&(1<<5))); UDR=tens; while(!(UCSRA&(1<<5))); UDR=ones; } и вызывайте, соответственно: uchartostr(t.sec); Изменено 24 ноября, 2008 пользователем Paulina Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NullPointer 0 24 ноября, 2008 Опубликовано 24 ноября, 2008 · Жалоба или так (без деления)... GCC именно так сам и сделает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Paulina 0 24 ноября, 2008 Опубликовано 24 ноября, 2008 · Жалоба GCC именно так сам и сделает. CodeVision тоже так сделает, это просто для образовательных целей :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Okada 0 6 февраля, 2010 Опубликовано 6 февраля, 2010 · Жалоба В продолжение темы. Начал изучать AVR. Есть ATmega8 на макетке, программатор, IAR Assembler for AVR 5.30.0 (5.30.0.50166), AVR студия 4.16 Кавыряюсь над задачей, как с МК передавать на ПК значения. Прочел документацию, написал прогу. Эроров нет. Но не работает. При дэбаге показывает зависание на попытке отослать третий байт, останавливаясь на условии while(!(UCSRA&(1<<5))); Если поставить бит руками, то итерация в дэбаге проходит. На ситуацию не влияют: - степень оптимизации кода - вид функции (передача за вызов одного байта или разбитие и передача нескольких байт за один вызов) UDRE не устанавливается... Подскажите, что не так. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smac 0 6 февраля, 2010 Опубликовано 6 февраля, 2010 · Жалоба UDRE не устанавливается... Подскажите, что не так. Вы наверное в студийном симуляторе прогу прогоняете? Если да, то ждете наверное мало, AVR студия 4.16 не в реальном времени считает, ждать долго надо. А вообще, прогу в железо и посмотрите, ну и код что-ли выложите весь, может что подскажут. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Okada 0 9 февраля, 2010 Опубликовано 9 февраля, 2010 · Жалоба Вы наверное в студийном симуляторе прогу прогоняете? Если да, то ждете наверное мало, AVR студия 4.16 не в реальном времени считает, ждать долго надо. А вообще, прогу в железо и посмотрите, ну и код что-ли выложите весь, может что подскажут. Железка выдаёт два байта и виснет. Трасировал пошагово. проджект прилагаю. UART_AVR_in_r1.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться