Ik ben bezig met picbasic te leren. Nu heb ik het voor mekaar om een servo signaal in te lezen en op lcd te zetten en door te zetten naar een uitgang.

Echter wil ik nu een failsave inbouwen.

Maar kennelijk doe ik wat fout?

Ik krijg 2 verschillende effecten:

Met onderstaande code werkt niets en staat de servo stil


While 1=1
If Servo1 < 10 Then
Servo PORTA.0, 1500

Else
Servo1   = PulsIn PORTB.0 , 1
Print At 1,1,Dec Servo1,"  " 

Servo PORTA.0, Servo1 * 10    
DelayMS 20 
EndIf         

Wend 

End                          

Met deze code werkt alles goed behalve de failsave. De servo blijft in failsave mode weglopen naar links. Waarom is mij een raadsel.


Device 16F648A                ;16F648A PIC
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
TRISA = %00000000
TRISB = %00000001 ; ontvanger op poort B.0
PORTA = %00000000
PORTB = %00000000

Dim Servo1 As Word ; variabele var1

Clear

DelayMS 500                   ;LCD stabilisering

test: ; begin test
Cls


While 1=1
If Servo1 < 10 Then
Servo PORTA.0, 1500
EndIf

Servo1   = PulsIn PORTB.0 , 1
Print At 1,1,Dec Servo1,"  " 

Servo PORTA.0, Servo1 * 10    
DelayMS 20          

Wend 

End                          

Heb hier nog een voorbeeld 3. Deze werkt al beter dan bovenstaande 2 opties. Echter komt deze niet in de basispositie terecht. Hij staat weer meer naar links. Maar blijft wel op deze positie staan. Als ik hem handmatig???? verdraai dan zoekt die weer die positie op. De kracht is nagenoeg weg in deze software maar dat is niet erg.


Device 16F648A                ;16F648A PIC
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
TRISA = %00000000
TRISB = %00000001 ; ontvanger op poort B.0
PORTA = %00000000
PORTB = %00000000

Dim Servo1 As Word ; variabele var1

Clear

DelayMS 500                   ;LCD stabilisering

test: ; begin test
Cls


While 1=1

Servo1   = PulsIn PORTB.0 , 1
Print At 1,1,Dec Servo1,"  " 

If Servo1 < 10 Then
Servo PORTA.0, 1500
DelayMS 50
Else

Servo PORTA.0, Servo1 * 10    
DelayMS 20          

EndIf
Wend 

End                          

Iemand enig idee wat ik fout doe? Ben vandaag pas begonnen met basic.

Probleem 2:
Ik heb een extern kristal aangesloten om een hogere precisie te behalen. Echter ondanks dat ik het volgende gedefineerd heb


Device 16F648A                ;16F648A PIC
Config WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF, HS_OSC ;INTRC_OSC_NOCLKOUT verwijderd 
ALL_DIGITAL TRUE              ;Alle ingangen digitaal
XTAL 20                       ;Kristal van 20MHz

Doet de software 5x zo snel?????

In plaats van 150 meet ik nu 750 op het display.

EDIT: met de multiplier te verlagen van x10 naar x2 ondervang ik dit probleem.. En los ik het middenstand probleem van de servo op. Alleen loop ik nog tegen het probleem aan dat het display 750 meet in plaats van de 500.


'****************************************************************
'*  Name    : Test.bas                                          *
'*  Author  : Wetronic NL                                       *
'*  Notice  : Copyright (c) 2009 www.wetronic.nl                *
'*          : All Rights Reserved                               *
'*  Date    : 30-4-2009                                         *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Device 16F648A                ;16F648A PIC
Config WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF, HS_OSC ;INTRC_OSC_NOCLKOUT verwijderd 
ALL_DIGITAL TRUE              ;Alle ingangen digitaal
XTAL 20

TRISA = %00000000
TRISB = %00000001 ; ontvanger op poort B.0
PORTA = %00000000
PORTB = %00000000

Dim ServoX1 As Word ; variabele var1
Dim ServoX2 As Word
Dim ServoX3 As Word
Dim ServoX4 As Word
Dim Servo1 As Word
Dim Servo2 As Word
Dim Servo3 As Word
Dim Servo4 As Word

Clear
DelayMS 500                   ;LCD stabilisering
DelayMS 500
DelayMS 500
DelayMS 500
DelayMS 500
DelayMS 500

;Cls

While 1=1
  ServoX1   = PulsIn PORTB.0 , 1
  Servo1 = ServoX1 / 5
  ServoX2   = PulsIn PORTB.0 , 1
  Servo2 = ServoX2 / 5
  ServoX3   = PulsIn PORTB.0 , 1
  Servo3 = ServoX3 / 5
;  Print At 1,1,Dec Servo1,"  " 

  If Servo1 < 10 Then
    Servo PORTA.0, 1500
    Servo PORTA.1, 1500
    Servo PORTA.2, 1500
  Else
    Servo PORTA.0, Servo1 * 10
    Servo PORTA.1, Servo2 * 10
    Servo PORTA.2, Servo3 * 10 
  EndIf
     
Wend
End                          

Inmiddels werkend zoals ik wil.

Echter is dit een te zware belasting op de processor.... Hierdoor lopen de servos niet soepel...

is er efficientere servo PWM software?

EDIT:


'****************************************************************
'*  Name    : Test.bas                                          *
'*  Author  : Wetronic NL                                       *
'*  Notice  : Copyright (c) 2009 www.wetronic.nl                *
'*          : All Rights Reserved                               *
'*  Date    : 30-4-2009                                         *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Device 16F648A                ;16F648A PIC
Config WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF, HS_OSC ;INTRC_OSC_NOCLKOUT verwijderd 
ALL_DIGITAL TRUE              ;Alle ingangen digitaal
XTAL 20

TRISA = %00000000
TRISB = %00000000 ; ontvanger op poort B.0
PORTA = %00000000
PORTB = %00000000

Dim x As Byte
Dim pbm1 As Byte
Dim pbm2 As Byte
Dim pbm3 As Byte
Dim pbm4 As Byte
Dim PWM_cycles As Byte
'Benoeming uitgangen
Symbol pen_a = PORTA.0
Symbol pen_b = PORTA.1
Symbol pen_c = PORTA.2
Symbol pen_d = PORTA.3

pbm1 = 50 'Waarde 1
pbm2 = 40 'Waarde 2
pbm3 = 60 'Waarde 3
pbm3 = 128 'Waarde 4
PWM_cycles = 255
x = 0
Output pen_a
Output pen_b
Output pen_c
Output pen_d

PBM:
DelayUS 700
  High pen_a
  High pen_b
  High pen_c
  High pen_d

For x = 0 To PWM_cycles
DelayUS 6
If x >= pbm1 Then
  Low pen_a
EndIf
  If x >= pbm2 Then
    Low pen_b
  EndIf
    If x >= pbm3 Then
      Low pen_c
    EndIf
      If x >= pbm4 Then
        Low pen_d
      EndIf 

Next
GoTo PBM

End                                       

Dit werkt al efficienter... Echter 1 nadeel ik krijg het niet voor mekaar om hem goed afgeregeld te krijgen...

Ik moet in 20ms een puls geven van 0.7 - 2,3 us.

EDIT2:

Ok werkende software inmiddels en een conclusie rijker

Pulsin commando is de boosdoener.. Deze moet efficienter. Iemand enig idee hoe ik dat kan doen? Om de tijd te meten met zo min mogelijk delay?