Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Опит за шим...
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=6400
Страница 1 от 1

Автор:  spas92 [ Вто Дек 23, 2008 11:02 pm ]
Заглавие:  Опит за шим...

Зд

от доста време се инатя с тоя ШИМ
успях да си го подкарам на протеус без проблем ... но до там ако можете да кажете каде спроред вас е проблема ???
/кръстил съм проекта proba защото вече имаше 6im/

proba.c
Код:
#include "proba.h"


void main()
{

int p,v,t;
t=10;
p=0;
t=0;

do {
p = input (40);
v = input (41);
if(p==1)
{
while (p==1){
delay_ms(1);
p = input (40);
}
if(t==10){
delay_ms(1000);
}else{
t=t+1;
}
}
if(v==1)
{
while (v==1){
delay_ms(1);
v = input (41);
}if(t==0){
delay_ms(1000);
}else{
t=t-1;
}
}

if(t==0){
output_b(0);
delay_ms(10);
}
if(t==1)
{
output_b(1);
delay_ms(1);
output_b(0);
delay_ms(9);
}

if(t==2){
output_b(1);
delay_ms(2);
output_b(0);
delay_ms(8);
}
if(t==3){
output_b(1);
delay_ms(3);
output_b(0);
delay_ms(7);
}
if(t==4){
output_b(1);
delay_ms(4);
output_b(0);
delay_ms(6);
}
if(t==5){
output_b(1);
delay_ms(5);
output_b(0);
delay_ms(5);
}
if(t==6){
output_b(1);
delay_ms(6);
output_b(0);
delay_ms(4);
}
if(t==7){
output_b(1);
delay_ms(7);
output_b(0);
delay_ms(3);
}
if(t==8)
{
output_b(1);
delay_ms(8);
output_b(0);
delay_ms(2);
}
if(t==9)
{
output_b(1);
delay_ms(9);
output_b(0);
delay_ms(1);
}

if(t==10)
{
output_b(1);
delay_ms(10);
}
} while (1);

}


proba.h

Код:
#include <16F84A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading

#use delay(clock=14310000)


предварително благодаря на всеки който поне се опита да ми помогне
вече съм отчаян....

Автор:  optron [ Сря Дек 24, 2008 1:02 am ]
Заглавие: 

Точно тоя чип е проблемен.
Първо си активирай таймера при включване - спестява доста главоболия. Като допълнително подсигуряване си сложи софтуерно закъснение от примерно четвърт секунда преди да сетваш регистрите. Също, след като изтече това закъснение и сетнеш ТРИС-овете, направи едно четене на входовете, за да се изравнят буфериращите регистри в логиката.
Просто не ме питай как с такова нещо подкарах контролер за дизелов генератор. :roll:

Автор:  zaphod [ Сря Дек 24, 2008 9:41 am ]
Заглавие: 

кода е уникален :)
ето на това му викам ифовщина :lol:

Автор:  spas92 [ Сря Дек 24, 2008 1:06 pm ]
Заглавие: 

ок
успях да си направя сега 6те видим дали 6те стане...

edit
ПАК НЕ СТАВА
. как се задават porta i trisa в ccs

Автор:  Zeus [ Сря Дек 24, 2008 1:19 pm ]
Заглавие: 

set_tris_a (value)
value = input_a()
output_a (value)

Има си help, чети го

Автор:  spas92 [ Сря Дек 24, 2008 4:07 pm ]
Заглавие: 

трасих trist ама от де да знам 4е се задава със set

Автор:  ps66 [ Сря Дек 24, 2008 4:30 pm ]
Заглавие: 

spas92 написа:
... ама от де да знам 4е ..


сигурно не знаеш и за буквите Ч, Ш, ... :)

Автор:  ToHu [ Сря Дек 24, 2008 10:05 pm ]
Заглавие: 

Малко не вдявам каква е идеята тук, вместо тия ифове може да позлваш case. Инче ШИМ е просто нещо, приметно изцяло софтуерен без позлване на таймер, да речем честота 100 хц

#bit out =06.1;
int set, pwm;

out=1;
while(1)
{
if(pwm < 100)
{
if(pwm==set)
{
out=0;
}
pwm++;
}
else
{
pwm =0;
out = 1;
}
delay_ms(10);
}

общо взето е това, порт B.0 ще т е изхода на PWM-а, а set определя заплването от 0- 100.

Автор:  spas92 [ Пон Дек 29, 2008 1:17 am ]
Заглавие: 

тва ок
аз бях решил с 2 пина от а порта да мога да оправлявам каква да е дължината на импулса т.е. а0 ми намаля дължината а а1 ми е увеличава
та да питам за да може целият "а" порт да ми е вход а "б" изход така ли трябва да ми е трис-а
SET_TRIS_A(0x0F);
SET_TRIS_B(0x00);

п.п.
ето това ми е програмата казвайте ако има грешки !

Код:
#include <16F84A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#use delay(clock=14310000)
void main()
{

int p,v,t;

SET_TRIS_A(0x0F); //тука не знам дали няква грешка
SET_TRIS_B(0x00);

delay_ms(250);

t=10;//казвам му първоначално да работи постоянно за да може да се види че въобще работи
p=0;
t=0;

do {
p = input (40);
v = input (41);//проверявам 2та пина
if(p==1)//ако а0 е 1
{
while (p==1){// тука зацикля докато не пусне6 бутона защото иначе се получава овеличаване от 0 на 10 за части от секундата
delay_ms(1);
p = input (40);
}
if(t==10){//проверка дали промеливата която оправлява дължината не е на мах
delay_ms(1000);
}else{
t=t+1;
}
}
if(v==1)//тук аналогично на първата
{
while (v==1){
delay_ms(1);
v = input (41);
}if(t==0){
delay_ms(1000);
}else{
t=t-1;
}
}

if(t==0){//тук вече е самият шим
output_b(0);
delay_ms(10);
}
if(t==1)
{
output_b(1);
delay_ms(1);
output_b(0);
delay_ms(9);
}

if(t==2){
output_b(1);
delay_ms(2);
output_b(0);
delay_ms(8);
}
if(t==3){
output_b(1);
delay_ms(3);
output_b(0);
delay_ms(7);
}
if(t==4){
output_b(1);
delay_ms(4);
output_b(0);
delay_ms(6);
}
if(t==5){
output_b(1);
delay_ms(5);
output_b(0);
delay_ms(5);
}
if(t==6){
output_b(1);
delay_ms(6);
output_b(0);
delay_ms(4);
}
if(t==7){
output_b(1);
delay_ms(7);
output_b(0);
delay_ms(3);
}
if(t==8)
{
output_b(1);
delay_ms(8);
output_b(0);
delay_ms(2);
}
if(t==9)
{
output_b(1);
delay_ms(9);
output_b(0);
delay_ms(1);
}

if(t==10)
{
output_b(1);
delay_ms(10);
}
} while (1); // връщане в началото

}

Автор:  Zeus [ Пон Дек 29, 2008 2:15 am ]
Заглавие: 

SET_TRIS_A(0xFF);
SET_TRIS_B(0x00);

Автор:  Nikola Kirov [ Пон Дек 29, 2008 10:59 am ]
Заглавие: 

"оправлява" и още ......

Спасе това може да означава само че си доста тъпо парче. Изобщо не знам що колегите си губят времето да ти помагат. Ама и то от акъл.

Автор:  ToHu [ Пон Дек 29, 2008 7:13 pm ]
Заглавие: 

Zeus ти го е написал, но по този начин на писане нема стигнеш далеч. В най-общия случай е това което си написал, ама все оюе не схващам що не позлваш case което е доста по прегледно. После по този начин написан ШИМ е доста непостоянен, дори по непостонен от изцяло софтуерния който съм ти написал аз, и на послендо място, идеята да управляваш еидн бит по този начин, е меко казано глупава. Така променяш целия порт В, а на теб ти трябва само еидн пин, има си както команда за сетване на бит, така можеш и директно да манипулираш бита, = false/ true = 0/1 .... Ако ще правиш някакви операции с целия порт е по добре да позлваш AND и OR команди, примерно & 0хFE за да стане 0 и || 0x01 за да стане 1, така няма да променяш състоянието на всики останали пинове по порта.

п.с. Ники, сигурно сме мазахости, или пък тъпи мазохисти ... ;) знайш ли , може да стане човек.

Автор:  Zeus [ Пон Дек 29, 2008 9:33 pm ]
Заглавие: 

Прав си ToHu, че това е доста кофти начин за реализация на ШИМ. Но не забравям, че в началото и аз имах проблем със софтуерната му реализация и този форум доста ми помогна. Отворих едни мой стар проект със 18F88 и малко го паснах, понеже беше за 8 ШИМ-а.

#include <16F84a.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=4000000)
#bit p1=0x06.0 // PORTB най младшия бит, на него ще ти излиза ШИМ
int x; // продължителност на положителния фронт на импулса
int y; // продължителност на нулев фронт на импулса

#int_TIMER0
void clock_isr()
{
disable_interrupts(INT_TIMER0);
if(y>x) p1=0;
if(y++>254)
{
y=0;
if(x>0) p1=1;
};
set_timer0(200); //честота на импулсите (0 до 255)
//по големи стойности, по-висока честота
enable_interrupts(INT_TIMER0);
}

void main()
{

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);

set_tris_b(0x00);
y=0;
x=50; //тук задаваш съотношението на фронтовете (1 до 254)
while(true)
{
//тук слагаш твоята програма
};
}

Не съм сигурен за FUSES, понеже нямам време да правя платка да го пробвам. На Протеуса тръгва. Исках просто да схване идеята.
spas92,ако имаш въпроси питай, каквото мога ще ти отговоря. Не се сърди относно забележките на колегите за правописа. Тук са все сериозни хора и тези неща не правят добро впечатление. Ако не си сигурне за правописа на някоя дума, изпозвай Word и FlexWord. И аз някой път го използвам за някой засукани думи, дето не съм сигурен, така че не е срамно.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/