Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LCD, AVR и CodeVisionAVR C
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Barni
Господа, кто может переделать файл LCD.LIB из CodeVision AVR C v1.25.8? Дело в том, что по умолчанию используются пины 0,1,2,4,5,6 и 7(3 свободный). А мне в Меге8 нужен кварц - PINB6 и 7, и вход Таймера0 - PIND4. Можно ли поменять в LCD.LIB пины 3 и 4. А то я в ассемблере не силен.
В архиве LCD.LIB
oll
Не понятно - опишите подробнее задачу (где какие пины).
я менял в секции lcd.lib:
#asm
.equ __lcd_direction=__lcd_port-1
.equ __lcd_pin=__lcd_port-2
.equ __lcd_rs=3
.equ __lcd_rd=2
.equ __lcd_enable=1
.equ __lcd_busy_flag=7
#endasm
но с LCD Bolymin 2х20 не заработала эта библиотека (там задержки наверное больше) - сделал задачу в WinAVR, использовав стороннюю библиотеку (в приложении) все нормально работает. Если непонятно с русскими символами - расскажу как.
Barni
Цитата(oll @ Mar 29 2008, 19:34) *
Не понятно - опишите подробнее задачу (где какие пины).
я менял в секции lcd.lib:
#asm
.equ __lcd_direction=__lcd_port-1
.equ __lcd_pin=__lcd_port-2
.equ __lcd_rs=3
.equ __lcd_rd=2
.equ __lcd_enable=1
.equ __lcd_busy_flag=7
#endasm
но с LCD Bolymin 2х20 не заработала эта библиотека (там задержки наверное больше) - сделал задачу в WinAVR, использовав стороннюю библиотеку (в приложении) все нормально работает. Если непонятно с русскими символами - расскажу как.

CodeVision предлагает такое подключение:
Port Bit 0 - RS
Port Bit 1 - RD
Port Bit 2 - EN
Port Bit 3 - Free
Port Bit 4 - Data4
Port Bit 5 - Data5
Port Bit 6 - Data6
Port Bit 7 - Data7
А хотелось бы: Port Bit 3 - Data4; Port Bit 4 - Free, чтобы задействовать вход Таймера0 - PIND4
oll
Трудновато будет - библиотека использует 4 смежных старших бита DATA. Придется сильно лопатить библиотеку - лучше перенести на другой порт или поставить доп. микросхему типа CD4094 типа
http://www.caxapa.ru/sch/lcd3v.html. Наверное библиотеку придется написать самому. А может найдете универсальную (где любые пины).
Barni
Цитата(oll @ Mar 29 2008, 20:38) *
Трудновато будет - библиотека использует 4 смежных старших бита DATA. Придется сильно лопатить библиотеку - лучше перенести на другой порт или поставить доп. микросхему типа CD4094 типа
http://www.caxapa.ru/sch/lcd3v.html. Наверное библиотеку придется написать самому. А может найдете универсальную (где любые пины).

Спасибо. Буду искать. А перенести на другой порт не получится. Можно только PortB и PortD, и на обоих нужные пины заняты.
А можно ли раскидать по разным портам? Вот так:
PortB Bit 0 - RS
PortB Bit 1 - RD
PortB Bit 2 - EN
PortB Bit 3 - Free
PortC Bit 0 - Data4
PortC Bit 1 - Data5
PortC Bit 2 - Data6
PortC Bit 3 - Data7
Или так:
PortB Bit 0 - RS
PortB Bit 1 - RD
PortB Bit 2 - EN
PortB Bit 3 - Free
PortD Bit 0 - Data4
PortD Bit 1 - Data5
PortD Bit 2 - Data6
PortD Bit 3 - Data7
Использовать младшие биты, но смежные. PortB и PortD можно поменять. Главное, что PortB6,7 и PortD4 свободны.
WHALE
Если вы все-таки твердо намерены использовать библиотеку CV,вам надо перенести 4 разряда данных в младшую тетраду,а разряды управления переназначить на свободные разряды порта в старшей,поменять в нужных вам библиотечных функциях направления сдвига нибла и маску.
А вообще библиотечные фукции в CV,ммм,неадекватные.Ресурсы жрут безбожно,т.к сделаны универсальными без привязки к конкретным кристалам.Т.е нигде не используются прерывания,вся времянка формируется только аппаратно,в математике умножение софтовое,куча асмовских кусков
в общем-то даром не нужных и т.д.
ИМХО,все-таки лучше взять готовую адекватную либу и портировать.
oll
Да так можно сделать, но лопатить все равно придется (придется завести вторую переменную __lcd_port типа __lcd_port2)
и в основном файле Си написать что-то типа:

// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x1B ;PORTA
.equ __lcd_port2=0x18;PORTB
#endasm

#include "lcd.h"

дальше в lcd.lib править - если упр. сигналы - __lcd_port, дата - __lcd_port2
учесть что дата у вас младшие разряды
Serj78
Да, там (в штатной библиотеке CV) еще есть место где повиснуть может- программа ждет в бесконечном цикле ready от индикатора. это место я дорабатывал...
WHALE
ну это один из милых приветов библиотек CV- завис контроллер LCD и повесил вусмерть контроллер,а на длинном шлейфе это бывает.не говоря о том,что это нафик не нужно и только безбожно тормозит программу. Организую вывод по таймеру и горя не знаю.
И зачем это надо,когда полно нормально написанных и выложенных в сеть исходников?
Barni
to oll
Спасибо, попробую разобраться.
to WHALE
А можно конкретные ссылки, а то я программист начинающий, и сразу понять что из ху трудно.
WHALE
вверху этого форума есть топик-архив исходников для AVR.Посмотрите-там для LCD HD47780 несколько
штук есть,выберите на свой вкус.Кажется,есть и непосредственно под CV.
Barni
Цитата(WHALE @ Mar 30 2008, 00:13) *
вверху этого форума есть топик-архив исходников для AVR.Посмотрите-там для LCD HD47780 несколько
штук есть,выберите на свой вкус.Кажется,есть и непосредственно под CV.

Завтра(сегодня) буду изучать, а то уже пятый час wacko.gif
Спасибо за помощь.
dENIM
CV либы - отстой полный
свои руками написать быстрее, чем заставить их работать sad.gif
Serj78
Цитата(dENIM @ Mar 30 2008, 00:55) *
CV либы - отстой полный
свои руками написать быстрее, чем заставить их работать sad.gif


Кстати, кто-нибудь разбирался с математическими функциями CV с точки зрения быстродействия?
Альтернативные функции работают быстрее?
Интересует тригонометрия:sin, cos, atan2 ...
oll
Цитата(Serj78 @ Mar 30 2008, 15:07) *
Кстати, кто-нибудь разбирался с математическими функциями CV с точки зрения быстродействия?
Альтернативные функции работают быстрее?
Интересует тригонометрия:sin, cos, atan2 ...

sin cos - не знаю
делал давненько терморегулятор с термопарой на М48 - код+2 полинома в IAR (не помню версию) не влез по объему в M48, тот же код CV легко разместил. Делал по тупому - возведение в степень заменил умножением. Это конечно не показатель - может сейчас IAR лучше.
alex_ac
Цитата(Serj78 @ Mar 30 2008, 13:07) *
Кстати, кто-нибудь разбирался с математическими функциями CV с точки зрения быстродействия?
Альтернативные функции работают быстрее?
Интересует тригонометрия:sin, cos, atan2 ...



Я делал так:

float sin (float alfa)
{
int i;
for (i = 0; i <90; i ++)
{
if (alfa > i + 0.5)
{
if (alfa < i + 1.5)
{
switch (i + 1)
{
case 0: return 0; break;
case 1: return 0.0175; break;
case 2: return 0.0349; break;
case 3: return 0.0523; break;
case 4: return 0.0698; break;
case 5: return 0.0872; break;
case 6: return 0.1045; break;
case 7: return 0.1219; break;
case 8: return 0.1392; break;
case 9: return 0.1564; break;
case 10: return 0.1736; break;
case 11: return 0.1908; break;
case 12: return 0.2079; break;
case 13: return 0.2250; break;
case 14: return 0.2419; break;
case 15: return 0.2588; break;
case 16: return 0.2756; break;
case 17: return 0.2924; break;
case 18: return 0.3090; break;
case 19: return 0.3256; break;
case 20: return 0.3420; break;
case 21: return 0.3584; break;
case 22: return 0.3746; break;
case 23: return 0.3907; break;
case 24: return 0.4067; break;
case 25: return 0.4226; break;
case 26: return 0.4384; break;
case 27: return 0.4540; break;
case 28: return 0.4695; break;
case 29: return 0.4848; break;
case 30: return 0.5000; break;
case 31: return 0.5150; break;
case 32: return 0.5299; break;
case 33: return 0.5446; break;
case 34: return 0.5592; break;
case 35: return 0.5736; break;
case 36: return 0.5878; break;
case 37: return 0.6018; break;
case 38: return 0.6157; break;
case 39: return 0.6293; break;
case 40: return 0.6428; break;
case 41: return 0.6561; break;
case 42: return 0.6691; break;
case 43: return 0.6820; break;
case 44: return 0.6947; break;
case 45: return 0.7071; break;
case 46: return 0.7193; break;
case 47: return 0.7314; break;
case 48: return 0.7431; break;
case 49: return 0.7547; break;
case 50: return 0.7660; break;
case 51: return 0.7771; break;
case 52: return 0.7880; break;
case 53: return 0.7986; break;
case 54: return 0.8090; break;
case 55: return 0.8192; break;
case 56: return 0.8290; break;
case 57: return 0.8387; break;
case 58: return 0.8480; break;
case 59: return 0.8572; break;
case 60: return 0.8660; break;
case 61: return 0.8746; break;
case 62: return 0.8829; break;
case 63: return 0.8910; break;
case 64: return 0.8988; break;
case 65: return 0.9063; break;
case 66: return 0.9135; break;
case 67: return 0.9205; break;
case 68: return 0.9272; break;
case 69: return 0.9336; break;
case 70: return 0.9397; break;
case 71: return 0.9455; break;
case 72: return 0.9511; break;
case 73: return 0.9563; break;
case 74: return 0.9613; break;
case 75: return 0.9659; break;
case 76: return 0.9703; break;
case 77: return 0.9744; break;
case 78: return 0.9781; break;
case 79: return 0.9816; break;
case 80: return 0.9848; break;
case 81: return 0.9877; break;
case 82: return 0.9903; break;
case 83: return 0.9925; break;
case 84: return 0.9945; break;
case 85: return 0.9962; break;
case 86: return 0.9976; break;
case 87: return 0.9986; break;
case 88: return 0.9994; break;
case 89: return 0.9998; break;
case 90: return 1.0000; break;
}
}
}
}
if (alfa > 90)
{
if (alfa <= 180){ return sin(alfa - 90);}
else if (alfa <= 270){ return -sin(alfa - 90);}
else if (alfa <= 360){ return -sin(alfa - 270);}
else return sin( alfa - 360);
}
}

float cos(float alfa)
{
if (alfa <= 90) return sin (90 - alfa);
else if (alfa <= 180) return -cos(alfa - 90);
else if (alfa <= 270) return -cos(alfa - 180);
else if (alfa <= 360) return cos(alfa - 270);
else return cos(alfa - 360);
}

Могут быть некоторые ошибки, или что-то криво написанно, критикуйте и напишите если у вас вариант лучше.
aesok
Цитата(alex_ac @ Sep 27 2008, 13:11) *
Я делал так:

float sin (float alfa)
.....


Могут быть некоторые ошибки, или что-то криво написанно, критикуйте и напишите если у вас вариант лучше.


Это ПОЗОРИЩЕ. Этот код медленный, длинный и дает неточный результат.

Анатолий.
Syberian
при использовании оператора switch прога перебирает все кейсы до искомого, что есть ужасно тормознуто.

Проще будет создать таблицу в прогмем с 256 значениями синуса в интервале от 0 до 180 град.
Далее делаем так:

float sintbl (float degree)
{
long adr;
adr=degree- (long)(degree/360)*360;
if (adr<180) return(sintab[(255*adr)/180]);
else return(-sintab[(255*(adr-180))/180]);
}


При желании можно увеличить точность с помощью линейной интерполяции:
y=y1+(y2-y1)*(x-x1)/(x2-x1), где
y-искомое значение
х - текущий аргумент
y1 и y2 - ближайшие значения функции,
х1 и х2 - ближайшие значения аргумента.
В нашем случае (целочисленные индексы) формула будет такова:
y=y1+(y2-y1)*(x-x1)

... но я использую обычно табло из 1024 значений. Этого хватает для простых вычислений.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.