Отговори на тема  [ 20 мнения ]  Отиди на страница Предишна  1, 2
Използване ан PIC16f84 като два генератора ......... 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 17, 2005 5:07 pm
Мнения: 813
Местоположение: Сливен
Мнение 
Dimiter написа:
имащ грешка!

void Key_procedure(void)
{
if (input(pin_a0)) {val1 = val1 +10;}

if (input(pin_a1)) {val1 = val1 -10;}

if (input(pin_a2)) {val2 = val1 +10;} // <---- val2=val2+10

if (input(pin_a3)) {val2 = val1 -10;} // <---- val2=val2-10



}


ООпс извинявай но това е за втория генератор а аз правя сега проби само с единия засега.
И при натискане на бутона за увеличаване с 10 става увеличаване с стойност зависеща от времето за което съм натиснал бутона ,т.е случайна и може би кратна на 10
Напълно се забатачих :oops:
Кво да правя?
Все пак Dimiter много ти благодаря за търпението с което учиш един новобранец заслужаваш гооооляма почерпка.Ако идваш към Сливен се обади :wink:


Пон Ное 21, 2005 5:22 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение 
Пробвай това:
#include <16F84.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=4000000)

#BYTE PORTB=6
#BIT out1=PORTB.0
#BIT out2=PORTB.1


#define hi output_high
#define low output_low
#define some_time 100


int val1=1000;// for example
int val2=1500;

int count1,count2;

char keybuf,;

void Key_procedure(void)
{

if (PORTA = keybuf) {return;}
keybuf = PORTA;
//delay 20ms//

if (input(pin_a0)) {val1 = val1 +10;}

if (input(pin_a1)) {val1 = val1 -10;}

if (input(pin_a2)) {val2 = val2 +10;}

if (input(pin_a3)) {val2 = val2 -10;}


}






void main()
{

keybuf = 0;

count1=val1;count2=val2;
set_tris_b(0xfc); // PORTB 0,1 will be outputs

while(1)//main loop
{
if(count1){count1--;}else{count1=val1;out1=!out1;}
if(count2){count2--;}else{count2=val2;out2=!out2;}
Key_procedure();
}
}

Тези редове дето аз сам ги добавил, не съм сигурен дали се пишат така, защото не работя с този компилатор (и даже не знам кой е :-)). Т.е. провери синтаксиса и го коригирай ако е нужно.
Проблема ти е, че проца много бързо преминава през процедурата за клавиатурата и при едно натискане на бутон, ще натрупа няколко пъти стойността, а може и да преълни съответния val.


Пон Ное 21, 2005 5:32 pm
Профил ICQ
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Пет Фев 04, 2005 3:18 pm
Мнения: 309
Местоположение: Sofia
Мнение 
Между другото защо не изхвърлиш този 16ф84?
не знам как не ти са се скъсали нервите докъто го чакаш да се препрограмира!?

Хвани се за някой друг от рода на 16ф74 ,872,873 или 16ф877а
именно докато се учиш и препрограмираш през няколко минути това 20 секундно
чакане може тотално да ти убие мерака!

препоръчвам ти да е с буквичка А (дори и 16ф84)
а най добре 18ф452 щом програмираш на С (той си е оптимизиран за С)
:wink:


Пон Ное 21, 2005 6:12 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 17, 2005 5:07 pm
Мнения: 813
Местоположение: Сливен
Мнение 
Dimiter написа:
Между другото защо не изхвърлиш този 16ф84?
не знам как не ти са се скъсали нервите докъто го чакаш да се препрограмира!?

Хвани се за някой друг от рода на 16ф74 ,872,873 или 16ф877а
именно докато се учиш и препрограмираш през няколко минути това 20 секундно
чакане може тотално да ти убие мерака!

препоръчвам ти да е с буквичка А (дори и 16ф84)
а най добре 18ф452 щом програмираш на С (той си е оптимизиран за С)
:wink:

Ами честно да ти кажа "печката "я ползвам след като съм "доизкосурил" програмата.
А за проби и симулация ползвам Proteus и да ти кажа правичката досега не ме е лъгал.Но докога ли :roll:
Все пак благодаря за помощта.
А между другото тоз генератор не мога да го подкарам на високи честоти (8 - 10 kHz),Защо ли?


Вто Ное 22, 2005 2:56 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Авг 19, 2005 11:38 am
Мнения: 978
Местоположение: Europe -> BG
Мнение 
Относно проблема с така нареченото "претрупване" се прави (чувал и съм чел , че я наричат) софтуерна защита за лъжлив контакт (т.е затворен/натиснат) бутон и нищо сложно - чакаш 16мс и пак проверяваш.

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

Значи това време 16мс зависи от бутона/контакта, но засега на мен ми е вършело работа (т.е явява се някаква средна - стандартна стойност). :)

на асм:

(бтв: може да ползва РБ4:7 и даденото прекъсване за бутоните за + и - на двата генератора ;) :) )

Код:

BANK0

       bcf   STATUS,RP1
       bcf   STATUS,RP0
       ENDM

BANK1
     
       bcf   STATUS,RP1
       bsf   STATUS,RP0
       ENDM

WAIT16MS_TMR0   MACRO   ;16300us = 16.3ms

       bcf     INTCON,GIE  ; no ints
       bcf     INTCON,T0IF ; clear flag bit, because we don't know it's state

   BANK0

   clrf   TMR0
      
   BANK1

   movlw   B'10000101'     ; pull-ups on PORTB "OFF" (не знам как ти е схемата , за това са изкл.) , TMR0 (PS) 1:64
   movwf   OPTION_REG

   btfss   INTCON,T0IF
   goto   $-1   

   bcf      INTCON,T0IF

   ENDM

WAIT16MS_REGS   MACRO

;must define WAIT1 and WAIT2 REGs
        local    wait16_regsloop

        movlw  D'21'
        movwf WAIT1
       
wait16_regslopp:

         movlw 0xFF   ; D'255'
        movwf WAIT2
        decfsz  WAIT2,F
        goto $-1

        decfsz   WAIT1,F
        goto      wait16_regsloop

       ENDM

------------------------------

;(получаваш interrupt)
; това е единият начин  и само ти нахвърлям идеята как нещата трябва да станат
;може долното да се направи на макрос и да подават бутоните като аргументи или пък да си направиш ~ функция :)
     
    movlw 1
    movwf IMPULSES ; бутон е натиснат , ще се види кой и със сигурност даденият бутон ще е натиснат поне веднъж

     btfss   BUTTONX
     goto   next_button
     WAIT16MS

loop:

     btfss  BUTTONX     ; още ли е вкл ?
     goto   do_themath ; не ок отиди и прибави увеличението
     incf    IMPULSES,F ; да вкл,.  , добави още един импулс/път увеличение
     WAIT16MS            ; защитата за претрепване
     goto   loop            ; т.е чака се докато бутона не бъде пуснат, но е различно от горе, защот онова горе прави проверката за милионни от секундата, докато тук има едно изчакване достатъчно да се установи бутона "в 0" или ако е 1 , да е сигурно  ,че  е 1, така че да се прибави още един път
------

do_themath

     movlw   D'10'
     addwf    SIGNAL1
     decfsz   IMPULSES,F
     goto     do_the_math
---


Значи както казах само съм нахвърлял идеята, която хич не е нещо кой знае какво, но по-важното надявам се да си ме разбрал и ако не я ползваш, то поне да ти даде идея за нещо по-добро :)

Успех.

_________________
един факт :-)
Съжалявам , че исках да помогна ...


Вто Ное 22, 2005 7:21 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 20 мнения ]  Отиди на страница Предишна  1, 2

Кой е на линия

Потребители разглеждащи този форум: Google [Bot] и 3 госта


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

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