Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

return kodu ve sorunu

Başlatan feslegenli, 27 Şubat 2024, 04:42:19

feslegenli

merhaba arkadaşlar pic16f877a için  iki kodu birleştirmek istedim fakat iki kodu birturlu aynı anda çalıştıramadım ekteki kodda

Print At 1,10,"A=",Dec2 AMPER,".",Dec2 MA
Print At 1,1,"W=",Dec2 GUC   
          Return
Print At 2, 1, "ISI=:"
Print At 2, 9, "HIZ=:"
   
burdaki return kodunu silince kod
 Print At 2, 1, "ISI=:"
Print At 2, 9, "HIZ=:"
bu kod çalısıyor return kodunu yazınca
Print At 1,10,"A=",Dec2 AMPER,".",Dec2 MA
Print At 1,1,"W=",Dec2 GUC   
bu kod çalışıyor bu kodları aynı anda nasıl çalıştırabilirim
     Device 16F877A
     Xtal = 4
Declare LCD_DTPin = PORTD.0
Declare LCD_ENPin PORTC.0
Declare LCD_RSPin PORTC.1
Declare LCD_RWPin PORTB.2
Declare LCD_Interface 4
Declare LCD_Lines 2
Declare Adin_Res 10
Declare Adin_Tad FRC
Declare Adin_Stime 50
ADCON1 = %10000000 ' PORTA ve PORTE analog ölçüm girisler aktif.
TRISA = %11111111   ' PORTA'nın tüm pinlerinin giriş 
TRISB = 0            'PORTB'nin tüm pinlerinin çıkış 
TRISC = 0             'PORTC'nin tüm pinlerinin çıkış
TRISD = 0              'PORTD'nin tüm pinlerinin çıkış


Dim VOLT As Word
Dim HAM As Word
Dim HVD As Word
Dim AMPER As Word
Dim MV As Byte
Dim MA As Byte
Dim GUC As Float
Dim GUCA As Float
Dim GUCV As Float
Dim p As Byte
Dim pa As Byte = 1
Dim analogdeg As Word
Dim temp As SWord
Dim tempu As SWord
Dim tempa As SWord
Dim duty As Byte
Dim aux As Dword
  
 BASLA:
ADIn 0,HAM

BAK:
If ADCON0.2=1 Then BAK
DelayMS 5
 
GoSub HESAPV

ADIn 1,HAM

DelayMS 5
GoSub HESAPA
GoSub EKRAN
DelayMS 1500
GoTo BASLA
EKRAN:
GUC=GUCA*GUCV


Print At 1,10,"A=",Dec2 AMPER,".",Dec2 MA
Print At 1,1,"W=",Dec2 GUC    
          Return
Print At 2, 1, "ISI=:"
Print At 2, 9, "HIZ=:"         

 
  
 Do 
  
   analogdeg = ADIn 7 ' Gerilim ölçüm pini PORTE.2 LM 35 bagli. LM35 10 mv/C olacak sekilde çikis verirR
    aux = analogdeg * 500 / 1023
    temp = aux
       
    If temp <> tempu Then
        tempu = temp
        Print At 2, 5, SDec temp, "C "  
          
        
        Select Case temp
            Case < 40
                p = 0
            Case < 45
                p = 40
            Case < 50
                p = 50
            Case < 55
                p = 75
            Case Else
                p = 100
        End Select

        duty = 255 * p / 100

        
        If Abs(temp - tempa) > 1 And p <> pa Then
            pa = p
            tempa = temp
            Print At 2, 13, Dec p, "% "
            HPWM 1, duty, 5000 
             
           
       
        End If
    End If       
   Loop

 HESAPV:
HVD=((HAM+1)*/875)/10
VOLT=HVD/10
MV=(HVD)//10
GUCV=VOLT+(MV/100)
Return
HESAPA:
HVD=(HAM+1)*/250
AMPER=HVD/100
MA=HVD//100
GUCA=AMPER+(MA/100)
Return

 
End
End
 
proteus şema




Pepe

Do'yu kaldırın ve döngüyü return ile değiştirin

feslegenli

Alıntı yapılan: Pepe - 27 Şubat 2024, 16:41:08Do'yu kaldırın ve döngüyü return ile değiştirin
olmadı hocam

Epsilon

#3
Protonla uzun zamandır ilgilenmiyorum.
Sorunuzu çok anlamayadım ama:
GOSUB HESAPV
kodu RETURN satırına kadar çalışır.RETURN satırından sonra ilk gönderildiği GOSUB HESAPV satırının hemen altındaki satıra gider.
GOTO komutunda ise direkt göndermedir return e falan bakmaz.GOTO ABC  veya GOSUB ABC gibi bir komuta kadar çalışır
Eğer ekranda Volt ,akım ,sıcaklık,watt hepsi birden görülsün istiyorsanız

Print At 1,1,"W=",Dec2 GUC,"Akım:",Dec2 AMPER,".",Dec2 MA
gibi birşey yazmalısınız -57 ve 58 satırı iptal edip yani bu iki satıra ,(üstten tek tırnaktı sanırım) -ekleyeceksiniz.
Bu arada  çok emin değilim ama menüden seçilerek displayde Voltaj Akım,Güç yada Voltaj,Akım ,Sıcaklık değerleri görülüyor olabilir



feslegenli

Alıntı yapılan: Epsilon - 28 Şubat 2024, 17:57:55Protonla uzun zamandır ilgilenmiyorum.
Sorunuzu çok anlamayadım ama:
GOSUB HESAPV
kodu RETURN satırına kadar çalışır.RETURN satırından sonra ilk gönderildiği GOSUB HESAPV satırının hemen altındaki satıra gider.
GOTO komutunda ise direkt göndermedir return e falan bakmaz.GOTO ABC  veya GOSUB ABC gibi bir komuta kadar çalışır
Eğer ekranda Volt ,akım ,sıcaklık,watt hepsi birden görülsün istiyorsanız

Print At 1,1,"W=",Dec2 GUC,"Akım:",Dec2 AMPER,".",Dec2 MA
gibi birşey yazmalısınız -57 ve 58 satırı iptal edip yani bu iki satıra ,(üstten tek tırnaktı sanırım) -ekleyeceksiniz.
Bu arada  çok emin değilim ama menüden seçilerek displayde Voltaj Akım,Güç yada Voltaj,Akım ,Sıcaklık değerleri görülüyor olabilir



cevabınız için teşekkür ederim

Pepe

;-------------------------------------------------------------------------------
;**** Added by Fuse Configurator ****
; Use the Fuse Configurator plug-in to change these settings

Device = 16F877A

Config FOSC_HS, WDTE_OFF, PWRTE_OFF, BOREN_OFF, LVP_OFF, CPD_OFF, WRT_OFF, DEBUG_OFF, CP_OFF

;**** End of Fuse Configurator Settings ****
;-------------------------------------------------------------------------------

Xtal = 4
Declare Create_Coff On
Declare Bootloader off
Declare Watchdog off
Declare Float_Display_Type = Fast
Declare Dead_Code_Remove = 1        ' Remove dead code
Declare Reminders Off
Declare Hints Off

Declare LCD_DTPin = PORTD.0
Declare LCD_ENPin PORTC.0
Declare LCD_RSPin PORTC.1
Declare LCD_RWPin PORTB.2
Declare LCD_Interface 4
Declare LCD_Lines 2
Declare LCD_Type  0


Declare Adin_Res 10
Declare Adin_Tad FRC
Declare Adin_Stime 50
ADCON1 = %10000000 ' PORTA ve PORTE analog ölçüm girisler aktif.
TRISA = %11111111 'PORTA'nin tüm pinlerinin giris
TRISB = 0         'PORTB'nin tüm pinlerinin çikis 
TRISC = 0              'PORTC'nin tüm pinlerinin çikis
TRISD = 0            'PORTD'nin tüm pinlerinin çikis
Dim VOLT As Word
Dim HAM As Word
Dim HVD As Word
Dim AMPER As Word
Dim MV As Byte
Dim MA As Byte
Dim GUC As Float
Dim GUCA As Float
Dim GUCV As Float
Dim p As Byte
Dim pa As Byte = 1
Dim analogdeg As Word
Dim temp As SWord
Dim tempu As SWord
Dim tempa As SWord
Dim duty As Byte
Dim aux As Dword
Print At 1,10,"A="
Print At 1,1,"W="
Print At 2,1,"T="
Print At 2,8,"HIZ=:"

BASLA:
ADIn 0,HAM
BAK:
If ADCON0.2=1 Then BAK
DelayMS 5
GoSub HESAPV
ADIn 1,HAM
DelayMS 5
GoSub HESAPA
GoSub EKRAN
DelayMS 1500
GoTo BASLA
EKRAN:
GUC=GUCA*GUCV
Print At 1,12,Dec2 AMPER,".",Dec2 MA
Print At 1,3,Dec2 GUC

analogdeg = ADIn 7 ' Gerilim ölçüm pini PORTE.2 LM 35 bagli. LM35 10 mv/C olacak sekilde çikis verirR
aux = analogdeg * 500 / 1023
temp = aux
       If temp <> tempu Then
                            tempu = temp
                            Print At 2,3,SDec temp,"C "
                         
                            Select Case temp
                            Case < 40
                               p = 0
                            Case < 45
                               p = 40
                            Case < 50
                               p = 50
                            Case < 55
                               p = 75
                            Case Else
                               p = 100
                            EndSelect
                            
                            duty = 255 * p / 100
                             
                             If Abs(temp-tempa)>1 And p<>pa Then
                                                                pa = p
                                                                tempa = temp
                                                                Print At 2, 13, Dec p, "%   "
                                                                HPWM 1, duty, 5000
                             EndIf
   EndIf       
   Return
HESAPV:
HVD=((HAM+1)*/875)/10
VOLT=HVD/10
MV=(HVD)//10
GUCV=VOLT+(MV/100)
Return
HESAPA:
HVD=(HAM+1)*/250
AMPER=HVD/100
MA=HVD//100
GUCA=AMPER+(MA/100)
Return
End