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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Аватара пользователя
osip
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Ср дек 19, 2012 23:33:41
Откуда: Старый Оскол

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

Сообщение osip »

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

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

Код: Выделить всё

 //таймер на  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);//вывод часов
         ///////////////////////////////лсд
      };
}
Реклама
Fruit007
Родился
Сообщения: 17
Зарегистрирован: Чт янв 03, 2013 18:11:07

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

Сообщение Fruit007 »

Код очень простой, а что ты сам написал из него?
Вроде бы ничего лишнего, за исключением инициализации самого мк, это уже ты смотри по даташиту. К примеру за что отвечают регистры TCCR1A, TCCR1B, TCNT1H, TCNT1L, ICR1H, ICR1L и т.д.
Реклама
Аватара пользователя
osip
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Ср дек 19, 2012 23:33:41
Откуда: Старый Оскол

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

Сообщение osip »

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

Код: Выделить всё

TCCR1A=0x00;//вроде пред делитель (это мне известно)
TCCR1B=0x05; //вроде пред делитель (это мне известно)
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x03; //вот этим я настраивал синхронность времени 
OCR1AL=0xd7; //вот этим я настраивал синхронность времени
TIMSK=0x10;
Fruit007
Родился
Сообщения: 17
Зарегистрирован: Чт янв 03, 2013 18:11:07

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

Сообщение Fruit007 »

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

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

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

Сообщение osip »

я сейчас даташитом и занимаюсь и офигеваю от google переводчика,
спасибо за ответы, по поводу метода тыка мне было необходимо прсто для начала сделать рабочий пример а потом хочу разбирать его по деталькам что за что отвечает ну и так далее.
Реклама
Fruit007
Родился
Сообщения: 17
Зарегистрирован: Чт янв 03, 2013 18:11:07

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

Сообщение Fruit007 »

Можно без гугл переводчика обойтись. Напиши просто в яндексе TCCR1A, много статей про таймеры твоего типа. Даже на Коте есть)
http://radiokot.ru/start/mcu_fpga/avr/11/ читай, вникай, поймешь - всё заработает)
Реклама
Аватара пользователя
korsaj
Потрогал лапой паяльник
Сообщения: 330
Зарегистрирован: Чт июн 23, 2011 07:55:51

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

Сообщение korsaj »

Насчет протеуса поспорю. Отличия во времени работы цифровых схем не наблюдал.
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

OCR1AH=0x03;
OCR1AL=0xcd;

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

Вернуться в «Разные вопросы по МК»