Отговори на тема  [ 13 мнения ] 
Опит за шим... 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Дек 08, 2008 11:37 pm
Мнения: 59
Мнение Опит за шим...
Зд

от доста време се инатя с тоя ШИМ
успях да си го подкарам на протеус без проблем ... но до там ако можете да кажете каде спроред вас е проблема ???
/кръстил съм проекта 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)


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


Вто Дек 23, 2008 11:02 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Чет Ное 20, 2008 1:49 pm
Мнения: 276
Местоположение: Бургас
Мнение 
Точно тоя чип е проблемен.
Първо си активирай таймера при включване - спестява доста главоболия. Като допълнително подсигуряване си сложи софтуерно закъснение от примерно четвърт секунда преди да сетваш регистрите. Също, след като изтече това закъснение и сетнеш ТРИС-овете, направи едно четене на входовете, за да се изравнят буфериращите регистри в логиката.
Просто не ме питай как с такова нещо подкарах контролер за дизелов генератор. :roll:

_________________
Digitally yours: Optron


Сря Дек 24, 2008 1:02 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юли 24, 2005 10:28 am
Мнения: 2658
Мнение 
кода е уникален :)
ето на това му викам ифовщина :lol:


Сря Дек 24, 2008 9:41 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Дек 08, 2008 11:37 pm
Мнения: 59
Мнение 
ок
успях да си направя сега 6те видим дали 6те стане...

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


Сря Дек 24, 2008 1:06 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Вто Окт 03, 2006 11:58 am
Мнения: 924
Местоположение: Ботевград
Мнение 
set_tris_a (value)
value = input_a()
output_a (value)

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


Сря Дек 24, 2008 1:19 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Дек 08, 2008 11:37 pm
Мнения: 59
Мнение 
трасих trist ама от де да знам 4е се задава със set


Сря Дек 24, 2008 4:07 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение 
spas92 написа:
... ама от де да знам 4е ..


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


Сря Дек 24, 2008 4:30 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение 
Малко не вдявам каква е идеята тук, вместо тия ифове може да позлваш 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.


Сря Дек 24, 2008 10:05 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Дек 08, 2008 11:37 pm
Мнения: 59
Мнение 
тва ок
аз бях решил с 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); // връщане в началото

}


Пон Дек 29, 2008 1:17 am
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Вто Окт 03, 2006 11:58 am
Мнения: 924
Местоположение: Ботевград
Мнение 
SET_TRIS_A(0xFF);
SET_TRIS_B(0x00);


Пон Дек 29, 2008 2:15 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
"оправлява" и още ......

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


Пон Дек 29, 2008 10:59 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

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

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


Пон Дек 29, 2008 7:13 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Вто Окт 03, 2006 11:58 am
Мнения: 924
Местоположение: Ботевград
Мнение 
Прав си 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. И аз някой път го използвам за някой засукани думи, дето не съм сигурен, така че не е срамно.


Пон Дек 29, 2008 9:33 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 13 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 0 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни