Перейти к содержанию
    

В устройстве требуются простенькие часы.

Я задал структуру:

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?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если вы хотите получить в терминале символьное значение, то до того как передавать, преобразуйте число в символьную строку. И передавайте всю символьную строку байт за байтом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...а для этого изучите например функции *printf. Кстати, рекоммендую хранить время не в структуре, а ввиде UNIX TimeStamp.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если вы хотите получить в терминале символьное значение, то до того как передавать, преобразуйте число в символьную строку. И передавайте всю символьную строку байт за байтом.

А не могли бы вы привести пример кода, использую CVAVR и как то у меня не получается подружиться с этими символьными строками!

 

2Aesthete Animus

UNIX TimeStamp вроде как сложновато, посмотрел примеры, слишком код большой, а у меня уже 85% памяти МК занято, мне что нить попроще!

 

да не айс, подключил библиотеку для использования printf, и все не хватает памяти ((

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В лоб:

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;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В лоб:
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) {}

Все передает, но меня мучает вопрос правильно ли это? Незнаю как это узнать! Но вроде передает без ошибок.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

МК у вас какой? Смысл этой строки - проверить свободен ли UDR для записи. Конкратнея реализаци здесь - ждать флага Data Register Empty..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В лоб:
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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

МК у вас какой? Смысл этой строки - проверить свободен ли UDR для записи. Конкратнея реализаци здесь - ждать флага Data Register Empty..

мк тини 2313 про строку я знаю, но вроде как моя строчка тоже должна работать, как UDRE =1, так можно слать новый байт.

 

Небольшое замечание ('SysRq' мне друг, но истина дороже): работает только с числами меньше 100. Для работы "больше 100", нужно еще пару строк (и т.д. для 1000, 10000, ...).

Более общий подход для таких дел: использовать BCD. IMHO.

Мне достаточно до 100 ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

или так (без деления):

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);

Изменено пользователем Paulina

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

GCC именно так сам и сделает.

 

CodeVision тоже так сделает, это просто для образовательных целей :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В продолжение темы.

 

Начал изучать AVR.

Есть ATmega8 на макетке, программатор, IAR Assembler for AVR 5.30.0 (5.30.0.50166), AVR студия 4.16

 

Кавыряюсь над задачей, как с МК передавать на ПК значения.

Прочел документацию, написал прогу. Эроров нет.

Но не работает.

 

При дэбаге показывает зависание на попытке отослать третий байт, останавливаясь на условии

while(!(UCSRA&(1<<5)));

 

Если поставить бит руками, то итерация в дэбаге проходит.

 

На ситуацию не влияют:

- степень оптимизации кода

- вид функции (передача за вызов одного байта или разбитие и передача нескольких байт за один вызов)

 

 

UDRE не устанавливается...

 

 

Подскажите, что не так.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

UDRE не устанавливается...

Подскажите, что не так.

 

Вы наверное в студийном симуляторе прогу прогоняете? Если да, то ждете наверное мало, AVR студия 4.16 не в реальном времени считает, ждать долго надо. А вообще, прогу в железо и посмотрите, ну и код что-ли выложите весь, может что подскажут.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы наверное в студийном симуляторе прогу прогоняете? Если да, то ждете наверное мало, AVR студия 4.16 не в реальном времени считает, ждать долго надо. А вообще, прогу в железо и посмотрите, ну и код что-ли выложите весь, может что подскажут.

 

Железка выдаёт два байта и виснет.

Трасировал пошагово.

 

проджект прилагаю.

UART_AVR_in_r1.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...