16f628a servo control

ik ben bezig met het maken van een servo control in proton pic basic.met de 16F628a

ik rijg output naar poort b2, maar hoe krijg ik die output ook op poorta4

ik moet de ontvangerpuls inlezen en sturen naar 2 servo's , waarvan 1 in reverse.
Ook moet er bij de uiterste uitslag geen puls meer op de servo staan.
probeercode:
DEVICE 16F628A ;Gebruik een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
;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

;Alle uitgangen op de chip declareren.
Symbol zwaardL = PORTB.2
Symbol zwaardR = PORTA.4

;Alle ingangen declareren
Symbol InputCH7 = PORTB.0

DIM Positie AS WORD ;variabele bevat de positie van de motor-as
DIM Positie2 AS WORD ;variabele bevat de positie van de motor-as

Symbol True = 1
Symbol False = 0

; 76543210
PORTA = %00000000 ;Maak alle 8 bits van poortregister PORTA laag
PORTb = %00000000 ;Maak alle 8 bits van poortregister PORTB laag
TRISA = %00000000 ;Alles uitgangen op poort A
TRISB = %00000001 ;B0 is een ingang

;Hoofdprogramma
WHILE 1 = 1 ;Oneindige lus
FOR Positie = 1000 TO 2000 STEP 20 ;Omhoog tellen met stapjes van 20uSec
SERVO zwaardr, Positie ;Stuur 'Positie' pulsjes naar PORTA.4
DELAYMS 20 ;20mSec = 50Hz, eventueel wijzigen bij ander type motor
NEXT

FOR Positie = 2000 TO 1000 STEP -20 ;Terug tellen met stapjes 20uSec
SERVO zwaardr, Positie ;Stuur 'Positie' pulsjes naar PORTA.4
DELAYMS 20 ;20mSec = 50Hz, eventueel wijzigen bij ander type motor
NEXT
FOR Positie2 = 1000 TO 2000 STEP 20 ;Omhoog tellen met stapjes van 20uSec
SERVO zwaardl, Positie2 ;Stuur 'Positie' pulsjes naar PORTB.2
DELAYMS 20 ;20mSec = 50Hz, eventueel wijzigen bij ander type motor
NEXT

FOR Positie2 = 2000 TO 1000 STEP -20 ;Terug tellen met stapjes 20uSec
SERVO zwaardl, Positie2 ;Stuur 'Positie' pulsjes naar PORTB.2
DELAYMS 20 ;20mSec = 50Hz, eventueel wijzigen bij ander type motor
NEXT
WEND ;Terug naar WHILE

Arco

Special Member

Ik heb geen flauw idee wat je met 'output rijgen' mag bedoelen... ;)
Om PORTA.4 gelijk te maken aan PORTB.2

pic basic code:


PORTA.4 = PORTB.2

Voor tegengestelde waarde

pic basic code:


PORTA.4 = NOT PORTB.2
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

nog even sorry voor de kleine type fouten, maar het prog is:

Device 16F628A ;Gebruik een 16F628A type
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
;CONFIG WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF, HS_OSC

ALL_DIGITAL True ;Alle ingangen digitaal
;Alle uitgangen op de chip declareren.
Symbol zwaardL = PORTB.2
Symbol zwaardR = PORTA.4

;Alle ingangen declareren
Symbol InputCH7 = PORTB.0

Dim Positie As Word ;variabele bevat de positie van de motor-as
Dim Positie2 As Word ;variabele bevat de positie van de motor-as

Symbol True = 1
Symbol False = 0

; 76543210
PORTA = %00000000 ;Maak alle 8 bits van poortregister PORTA laag
PORTB = %00000000 ;Maak alle 8 bits van poortregister PORTB laag
TRISA = %00000000 ;Alles uitgangen op poort A
TRISB = %00000001 ;B0 is een ingang

;Hoofdprogramma
While 1 = 1
For Positie = 1000 To 2000 Step 20
Servo zwaardR, Positie
DelayMS 20
Next

For Positie = 2000 To 1000 Step -20
Servo zwaardR, Positie
DelayMS 20
Next
For Positie2 = 1000 To 2000 Step 20
Servo zwaardL, Positie2
DelayMS 20
Next

For Positie2 = 2000 To 1000 Step -20
Servo zwaardL, Positie2
DelayMS 20
Next
Wend

Arco

Special Member

Houdt er wel rekening mee dat port A4 een OD (open drain) is, en dus alleen kan sinken...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

waarom het je de XTAL declaratie weggehaald?
Die is nodig voor het uitvoeren van de delayms instructies.

Just find out what you like and let it kill you

ik gebruikte even de interne osc

Arco

Special Member

Dan moet nog XTAL erbij staan, anders werkt de boel niet goed.
(toegegeven, XTAL is een wat vreemde naam omdat 'ie voor alle type oscillators geldt, maar dat zal wel historisch zo gegroeid zijn...)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

hier de juiste code:

DEVICE 16F628A ;Gebruik een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE ;Alle ingangen digitaal

;Alle uitgangen op de chip declareren.
Symbol zwaardL = PORTB.2
Symbol zwaardR = PORTA.0

DIM Positie AS WORD ;variabele bevat de positie van de motor-as

; 76543210
PORTA = %00000000 ;Maak alle 8 bits van poortregister PORTA laag
PORTb = %00000000 ;Maak alle 8 bits van poortregister PORTB laag
TRISA = %00000000 ;Alles uitgangen op poort A
TRISB = %00000000 ;Alles uitgangen op poort B

;Hoofdprogramma
WHILE 1 = 1 ;Oneindige lus
FOR Positie = 1000 TO 2000 STEP 20 ;Omhoog tellen met stapjes van 20uSec

SERVO zwaardL, Positie ;Stuur 'Positie' pulsjes naar PORTB.2

DELAYMS 20 ;20mSec = 50Hz, eventueel wijzigen bij ander type motor
NEXT

FOR Positie = 2000 TO 1000 STEP -20 ;Terug tellen met stapjes 20uSec
SERVO zwaardL, Positie ;Stuur 'Positie' pulsjes naar PORTB.2

DELAYMS 20 ;20mSec = 50Hz, eventueel wijzigen bij ander type motor

wend ;naar WHILE

Arco

Special Member

XTAL ontbreekt nog steeds... :)
Voor aansturen porta.4 zie voorbeeld bovenstaand.

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

xtal is niet nodig bij interne osc.
voor de port a4, gebruik ik nu a0
dit werkt beter.
Nu verder uitbreiden

Arco

Special Member

XTAL moet altijd. Dat het soms goed gaat zonder houdt nog niet in dat het ook zo moet.
De compiler heeft dat nodig om de delayloops uit te rekenen. (is niet helderziend en weet de oscillatorfrequentie niet...)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Niet eigenwijs zijn, toch de XTAL 4 er in zetten voor de compiler!!!

[Edit]
Arco was me net voor...

[Bericht gewijzigd door Roches op woensdag 3 augustus 2016 22:18:48 (20%)

Domoticz en ESP8266, goede combo!!!

net xtal erbij gezet, maar dat werkt zeker niet.
dus weer weggehaald

Arco

Special Member

Je bent wel behoorlijk eigenwijs, he... :)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

kan er niets aan doen, maar het werkt echt niet met xtal.
daarom xtal weggehaald en met de interne osc gewerkt.
dat werkt.
sorry, dan maar eigenwijs, of zie ik iets over het hoofd?
bij frits kieftenbelt zie je dat ook ( picbasic.nl)

Arco

Special Member

De cursus op Picbasic gaat over een oeroude versie van die compiler, toen hoefde dat niet.
Nu is de XTAL declare verplicht, als je betrouwbare resultaten wilt. Als het niet werkt, doe je wat verkeerd.

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

ik probeer iets te maken met de software wat ik heb.
wat is de andere mogelijkheid om dit simpel te doen?
Picbasic kan ik volgen (ik ben maar een leek)
Mijn vorig project voor mijn modelonderzeeboot werkte goed, zodoende weer met picbasic bezig.

ik moet namelijk een servopuls inlezen, en daarna 2 servo's uitsturen.
als deze langzaam op de eindbestemming zijn, dan moet de puls wegvallen, zodat de servo's niet meer jitteren.
ook moet een van de twee servo's dit in reverse doen.
Oplossing????

Arco

Special Member

Lezen is tegenwoordig helaas niet meer zo populair... ;) . Reverse gaf ik boven al:

pic basic code:


PORTA.4 = NOT PORTB.2
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

sorry,
maar als ik dat invul, geeft hij een error, zodoende werkt dat bij mij niet.
weet jij een simpel programma om dit te programmeren?

Arco

Special Member

Kan zijn dat de syntax niet helemaal klopt. Dat zal toch wel in de helpfile/manual staan?

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op 3 augustus 2016 21:59:58 schreef jank:
xtal is niet nodig bij interne osc.

Daar klopt dus helemaal geen bal van. Lees de manual er maar op na. Het feit dat je op de interne klok draait heeft helemaal niets te maken met de delays die door de compiler worden gegenereerd (zoals anderen hier ook al schreven). Als je XTAL = 4 toevoegt moet dat goed gaan met de interne klok.

Overigens kan ik in de manual even niet iets vinden over een 'not' constructie, dus je zult een paar regels code moeten gebruiken

pic basic code:

if portb.2 = 0 then 
   porta.0 = 1 
else 
   porta.0 = 0
endif

Jezus, hoe moeilijk kan het zijn???

Verder raad ik je aan eens goed naar het commentaar in je code te kijken:
Device 16F628A; we gebruiken een 16F628A....wie zal dat NIET snappen? Volstrekt overbodige troep uit de Fritz cursus
Verder klopt het commentaar hier ook niet, je gooit milliseconden en microseconden door elkaar[code=picbasid]FOR Positie = 1000 TO 2000 STEP 20 ;Omhoog tellen met stapjes van 20uSec
SERVO zwaardL, Positie ;Stuur 'Positie' pulsjes naar PORTB.2
DELAYMS 20 ;20mSec = 50Hz, eventueel wijzigen bij ander type motor
NEXT

code:

: niet 20 uSec maar 20 mSec. Even een factortje 1000.
Just find out what you like and let it kill you
Arco

Special Member

Dit kan ook: (exclusive or)

pic basic code:


PORTA.0 = PORTB.2 ^ 1

[Bericht gewijzigd door Arco op donderdag 4 augustus 2016 00:17:08 (32%)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Willie W

Golden Member

Port A.4 is een open collector, die word niet hoog of je moet er een weerstand bij hangen.
Beter een andere uitgang nemen.

Edit, was al gezegd, had ik dus overheen gekeken.

[Bericht gewijzigd door Willie W op donderdag 4 augustus 2016 00:24:32 (18%)

paaltje73

Golden Member

Stamt de compiler van Jank ook nog uit de tijd van de cursus?