Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Вт янв 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);//вывод часов
///////////////////////////////лсд
};
}
Ср янв 09, 2013 00:00:41
Код очень простой, а что ты сам написал из него?
Вроде бы ничего лишнего, за исключением инициализации самого мк, это уже ты смотри по даташиту. К примеру за что отвечают регистры TCCR1A, TCCR1B, TCNT1H, TCNT1L, ICR1H, ICR1L и т.д.
Ср янв 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;
Ср янв 09, 2013 00:22:19
Немного не в том направлении идешь. Я тоже не знаю за что отвечают данные регистры, т.к. я не знаком с данным МК. Это ты уже открывай даташит по нему и смотри за что отвечают биты данных регистров.
Во-вторых ты не должен на авось "подбирать" синхронизацию, она точно задаётся пользователем.
Код у тебя правильный (ну на первый взгляд все верно), только изучай сам МК чтобы небыло тёмного леса. Программист в коде должен знать за что отвечает каждая строчка. Если что-то не знаешь, то тут возможен провал.
В-третьих проект протеус может и отличаться по времени работы от реальным мк.
Если ты вообще тёмный лес в работе с МК вкратце расскажу что означает выражение "OCR1AL=0xd7". Конкретно за что регистр OCR1AL я не знаю, но такой регистр может вместить в себя 1 байт данных (т.е. 8 бит). Переводим 16-ричное число d7 в двоичный код и получаем 11010111. А тут то каждый бит отвечает за что-то отдельное. Биты нумеруются с права на лево начиная с 0 заканчивая 7. Теперь открывай даташит и смотри за что отвечает каждый бит в этом регистре, раставляй единицы и нули куда необходимо, переводи получившееся число в шестандцатеричный код.
Ср янв 09, 2013 00:30:35
я сейчас даташитом и занимаюсь и офигеваю от google переводчика,
спасибо за ответы, по поводу метода тыка мне было необходимо прсто для начала сделать рабочий пример а потом хочу разбирать его по деталькам что за что отвечает ну и так далее.
Ср янв 09, 2013 00:38:37
Можно без гугл переводчика обойтись. Напиши просто в яндексе TCCR1A, много статей про таймеры твоего типа. Даже на Коте есть)
http://radiokot.ru/start/mcu_fpga/avr/11/ читай, вникай, поймешь - всё заработает)
Ср янв 09, 2013 13:28:25
Насчет протеуса поспорю. Отличия во времени работы цифровых схем не наблюдал.
Ср янв 09, 2013 16:50:32
OCR1AH=0x03;
OCR1AL=0xcd;
Задают регистр сравнения для 16-битного таймера. Он должен быть настроен на счет до регистра сравнения и сброс, таким образом устанавливая регистр сравнения этого таймера мы изменяем интервал с которым таймер сбрасывается и вызывает прерывание. Это должно происходить ровно 1 раз в секунду(судя по тому что в прерывании сразу счет идет секунд). Если общий коэффициент деления предделителя таймера и OCR1A не поделит частоту кварца нацело чтобы получить 1 секунду - погрешность неизбежна как бы ты не настраивал эти цифры. причем коэффициент OCR1A не может превышать 65535 а предделитель таймера имеет коэффициент кратный степени 2-ки(2, 4, 8, 16, 32 и т.д.).
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.