Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

проверка кода

Вт янв 08, 2013 23:52:57

я только начал пробовать себя в программировании мк, вот код сам конечно не писал а брал из разных примеров по кускам т правил всё методом тыка но в протеусе всё пашет время только за пол часа спешит на секунду ну это я думаю настрою, прозьба проверить код, может там мусора лишнего куча так как многое я совсем не знаю или что не так (не забываем я учюсь)

вот код может что лишнее или чего не хватает, или вообще не правильно (но в протеусе работает)

Код:
 //таймер на  mega8535
#include <mega8535.h>
#asm
   .equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>
int s = 0;
int m = 0;
int ch = 0;
const int sim=-2;
// начало прерывания
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
   s++;

   if(s>59)
   {
      s=0;
      m++; 
   }
   else if(m>59)
   {m=0;
   ch++;}
   else if(ch>59)
   {ch=0;}
  TCNT1H=0;
  TCNT1L=0;
}
// конец прерывания
void main(void)
{

TCCR1A=0x00;
TCCR1B=0x05; //вроде пред делитель (это мне известно)
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x03; //вот этим я настраивал синхронность времени
OCR1AL=0xcd; //вот этим я настраивал синхронность времени
TIMSK=0x10;
lcd_init(8);
#asm("sei")//разрешаем прерывания (это мне известно)
while (1)
      {
      ////////////////////////////////////лсд
       lcd_gotoxy(0,0); 
        lcd_putchar(s/10+0x30); //вывод секунд
        lcd_putchar(s%10+0x30); //вывод секунд
        lcd_putchar(sim%10+0x30);//вывод точка разделитель
        lcd_putchar(m/10+0x30);  //вывод минут
        lcd_putchar(m%10+0x30); //вывод минут
        lcd_putchar(sim%10+0x30); //вывод точка разделитель
        lcd_putchar(ch/10+0x30); //вывод часов
        lcd_putchar(ch%10+0x30);//вывод часов
         ///////////////////////////////лсд
      };
}

Re: проверка кода

Ср янв 09, 2013 00:00:41

Код очень простой, а что ты сам написал из него?
Вроде бы ничего лишнего, за исключением инициализации самого мк, это уже ты смотри по даташиту. К примеру за что отвечают регистры TCCR1A, TCCR1B, TCNT1H, TCNT1L, ICR1H, ICR1L и т.д.

Re: проверка кода

Ср янв 09, 2013 00:06:44

только добавил переменные для минут и часов и вывел их в lsd, ну и с настройкой времени потыкался старлся синхронизировать, пока потеря 2 сек в час ну это я думаю вкурю.
здесь где коментарии есть я вроде не мног понял а остальное темный лес.
Код:
TCCR1A=0x00;//вроде пред делитель (это мне известно)
TCCR1B=0x05; //вроде пред делитель (это мне известно)
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x03; //вот этим я настраивал синхронность времени
OCR1AL=0xd7; //вот этим я настраивал синхронность времени
TIMSK=0x10;

Re: проверка кода

Ср янв 09, 2013 00:22:19

Немного не в том направлении идешь. Я тоже не знаю за что отвечают данные регистры, т.к. я не знаком с данным МК. Это ты уже открывай даташит по нему и смотри за что отвечают биты данных регистров.
Во-вторых ты не должен на авось "подбирать" синхронизацию, она точно задаётся пользователем.
Код у тебя правильный (ну на первый взгляд все верно), только изучай сам МК чтобы небыло тёмного леса. Программист в коде должен знать за что отвечает каждая строчка. Если что-то не знаешь, то тут возможен провал.
В-третьих проект протеус может и отличаться по времени работы от реальным мк.

Если ты вообще тёмный лес в работе с МК вкратце расскажу что означает выражение "OCR1AL=0xd7". Конкретно за что регистр OCR1AL я не знаю, но такой регистр может вместить в себя 1 байт данных (т.е. 8 бит). Переводим 16-ричное число d7 в двоичный код и получаем 11010111. А тут то каждый бит отвечает за что-то отдельное. Биты нумеруются с права на лево начиная с 0 заканчивая 7. Теперь открывай даташит и смотри за что отвечает каждый бит в этом регистре, раставляй единицы и нули куда необходимо, переводи получившееся число в шестандцатеричный код.

Re: проверка кода

Ср янв 09, 2013 00:30:35

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

Re: проверка кода

Ср янв 09, 2013 00:38:37

Можно без гугл переводчика обойтись. Напиши просто в яндексе TCCR1A, много статей про таймеры твоего типа. Даже на Коте есть)
http://radiokot.ru/start/mcu_fpga/avr/11/ читай, вникай, поймешь - всё заработает)

Re: проверка кода

Ср янв 09, 2013 13:28:25

Насчет протеуса поспорю. Отличия во времени работы цифровых схем не наблюдал.

Re: проверка кода

Ср янв 09, 2013 16:50:32

OCR1AH=0x03;
OCR1AL=0xcd;

Задают регистр сравнения для 16-битного таймера. Он должен быть настроен на счет до регистра сравнения и сброс, таким образом устанавливая регистр сравнения этого таймера мы изменяем интервал с которым таймер сбрасывается и вызывает прерывание. Это должно происходить ровно 1 раз в секунду(судя по тому что в прерывании сразу счет идет секунд). Если общий коэффициент деления предделителя таймера и OCR1A не поделит частоту кварца нацело чтобы получить 1 секунду - погрешность неизбежна как бы ты не настраивал эти цифры. причем коэффициент OCR1A не может превышать 65535 а предделитель таймера имеет коэффициент кратный степени 2-ки(2, 4, 8, 16, 32 и т.д.).
Ответить