PIC12F629:n tilalle 12F683? Onko hankalaa? Vaiko sittenkin Arduino?

borg

administi
Ylläpitäjä
EDIT (by borg): Joo, näyttää siltä, että pic-jutut ovat jo historiaa. Ensimmäisen viestin voi lukea kuvauksena siitä, mitä halutaan, mutta miten sitä tuskin toteutetaan. Arduino tuntuisi käyvän tarkoitukseen erittäin hyvin.

..........................................................................

Netistä löytyi oheinen kytkentä, joka tuntuisi soveliaalta erääseen tarkoitukseen. Kytkennän tarkoituksena on ajaa RC-servoa asennosta toiseen. Kummankin asennon voi säätää haluamakseen painonapeilla.

servo controller.webp


Servo ajaa asennosta toiseen riippuen tulon INPUT tilasta.

Kytkentä on suunniteltu PIC12F629:lle ja ohjelma on laadittu PIC Basicilla.

Probleemana on se, että PIC Basic maksaa aika tuhottomasti, ellei sitten käytä ilmaista opiskelijaversiota. Se taasen tukee piiriä PIC12F683, joka vaikuttaisi olevan parannettu painos tuosta 629:stä, jolle ohjelma on tehty.

Ohjelmakoodi:

Koodi:
'****************************************************************
'*  Name    : ServoLock                                         *
'*  Author  : Tarkan Akdam                                      *
'*  Notice  : Copyright (c) 2012 Tarkan Akdam                   *
'*          : All Rights Reserved                               *
'*  Date    : 20/06/2012                                        *
'*  Version : 1.6                                               *
'*  Notes   : 12F629                                            *
'*          : This circuit moves a standard RC servo between    *
'*          : two programmed and stored positions               *
'*          : Each position is selected by logic level on GP3   *
'*          : The Servo is disabled after 5 seconds             *
'*          : which is plenty of time for the servo to reach    *
'*          : the final positions requested.                    *
'****************************************************************
'*          :Circuit Pin Configuration                          *
'*          :GP3- ALARM IN - High is Position Two               *
'*          :GP0- Move Servo Up                                 *
'*          :GP1- Program Mode                                  *
'*          :GP2- Move Servo Down                               *
'*          :GP5- Servo Pulse Out                               *
'*          :GP4- HeartBeat LED                                 *
'****************************************************************


define OSC 4
DEFINE OSCCAL_1K 1


CMCON       = 7   'comparator off
WPU         = %00110111 ' Internal pull-ups = on
OPTION_REG  = %00001000 ' Pull-ups = yes, GPIO.2 = I/O, prescaler to WDT
INTCON      = %00000000  ' disable all interupts
GPIO        = %00000000 ' All outputs = 0 on boot
TRISIO      = %00001111 '  GP4 and GP5 output
IOC         = %00000000  'disable IOC interrupt

'**********************
'Constants
MaxPos  CON 262   'hard limits of servo movement - as measured for my servos
MinPos  con 68  

'**********************
'Variablles
ServoProgram    var gpio.1
ServoUp         VAR gpio.0
ServoDown       var gpio.2
ServoPulse      var gpio.5
LEDOut          var gpio.4
AlarmIn         var gpio.3


HeartBeat       var byte
TimeOut         var byte
Counter         var byte
DataSaved       var byte

PosTWO          var word   'stores the PosTWO position
PosONE          var word   'stores the PosONE position
ServoPosition   var word   'current position of servo
PrevPosition    var word   'old position of servo

'*****************************************
'read stored positions from eeprom before proceeding
read 00, word PosTWO   'PosTWO is stored addr 0,1
READ 02, word PosONE 'PosONE is stored at addr 2,3

'*****************************************
'make sure outputs and variables are how we want them
ServoPulse  =   0   'servo signal line to 0v
HeartBeat   =   0
TimeOut     =   0
DataSaved   =   0

' main program loop
main:

IF HeartBeat = 35   then        'flash heartbeat led
    HeartBeat = 0
    Toggle LEDOut          'toggle led
else
    HeartBeat = HeartBeat + 1
endif

'check if we are in program mode
if ServoProgram = 0 then gosub ProgrammingMode

'are we PosTWO or PosONE
if AlarmIn = 1  then
    ServoPosition   = PosTWO
else
    ServoPosition   = PosONE
endif

gosub ServoMove  

goto main

'************************************
'* This sub moves servo to programmed position
ServoMove:

IF ServoPosition = PrevPosition   then        'is servo position the same as previous
    IF TimeOut < 250 then TimeOut = TimeOut + 1 'then start TimeOut Counter
else
    TimeOut = 0                                'else reset timeout and save current position
    DataSaved = 0                               'reset eeprom flag
    PrevPosition  = ServoPosition
endif

IF TimeOut = 250 then goto skippulse   'if timed out skip moving servo                  

ServoPulse = 0      '0v signal - put signal line in to a known state before pulseout
pulsout ServoPulse, ServoPosition

skippulse:      'jump here to not bother with pulse
pause 19   'wait 19ms


return  'go back


'****************************************
'* Programming Mode
ProgrammingMode:
LEDOut = 0 'Turn ON LED to show program mode

IF AlarmIn = 0 then
    IF ServoUp = 1 and ServoDown = 0 ThEN PosONE = PosONE + 1
    IF ServoUp = 0 and ServoDown = 1 ThEN PosONE = PosONE - 1
else
    IF ServoUp = 1 and ServoDown = 0 ThEN PosTWO = PosTWO + 1
    IF ServoUp = 0 and ServoDown = 1 ThEN PosTWO = PosTWO - 1
endif

IF PosTWO > MaxPos  then PosTWO = MaxPos      'lets make sure position is not outside
IF PosTWO < MinPos   then PosTWO = MinPos     'these defined hard limits
IF PosONE > MaxPos then PosONE = MaxPos
IF PosONE < MinPos then PosONE = MinPos

IF TimeOut > 249 then    'store values in to eeprom if we have reached timeout limit
    for Counter = 0 to 5  'Quick Flash LED - let user know we have saved the values
        toggle LedOut
        pause 100
    next Counter

    IF DataSaved = 0 then  'only write to eeprom if datasaved flag is 0  
        DataSaved = 1       'set flag to stop eeprom writes until position has changed
        write 00, word PosTWO    'write the data to the eeprom
        write 02, word PosONE
    endif
endif


return  'go back

end

Kysymys siis kuuluu, olisiko ohjelma sellaisenaan sopiva 12F683:lle vai tarvitsisiko sitä muokata jotenkin? Jos tarvitsisi, niin onko hajua, miten?

Itse en varmaankaan tähän rupea syvällisesti paneutumaan, mutta olisin kuitenkin kiinnostunut. Minulla on mietittynä tälle muuan kolvaaja, mutta miksipä en ensin kysyisi asiasta foorumilta, jossa oletettavasti joku on asiasta hajulla.
 
Viimeksi muokattu:
Tämän apparatuksen on ajateltu nostavan tarvittaessa 3D-tulostimen suutinta jousikuormaa vasten. Kun servo sitten vaihtaa asentoa, niin jousi paikoittaa suuttimen asetettuun korkeuteen.
 
Latasin tuon opiskelijaversion PIC Basic Pro:sta. Kokeilin, mitä tapahtuu kun yrittää kääntää ohjelman 12F683:lle.

Ensin tuli herja rivistä CMCON = 7 joka on comparator off

Googlettelin hetken ja vaihdoin tilalle CMCON0 = 7 , tämä ei enää aiheuttanut komplikaatioita.

Kääntäjä sanoi sitten viisi kertaa seuraavaa:
[ASM ERROR] Symbol not previously defined (OSCCAL) (0) : Error[113]

Ilmeisesti näissä on jotain eroa oskillaattoreiden toiminnassa. Basic-koodissa lukee

define OSC 4
DEFINE OSCCAL_1K 1

Jokin on nyt kuitenkin ei-oikein.
 
Myönnän että pic maaimasta putosin siinä vaiheessa kun ekan arduinon näin :oops: Eli arduino nano olis aika kokonaisvaltanen ratkasu, kaikki mitä tarvii samalla piirilevyllä hintaan 2,6€ C ohjelmoitava, löytyy kirjasto servon liikutteluunki. Tällä näpäkästi väistää ympäristöstä maksamisen, ei suoraan vastaa ongelmaan, mutta vastasin ny kuitenkin. Apuja irtoo kyselemällä tarvitsevalle :)
 
Kiitos, pidän mielessä! Työkaveri ilmaisi kiinnostuksensa pic-asiassa, joten varmaan kyselen häneltä ensin.

Ei Arduinokaan ole ollenkaan pois suljettu ratkaisu. Alussa esitettyä kytkentää tarvittaisiin 2 kpl, eli nosto ja lasku kahdelle tulostuspäälle.
 
Äkkiä googlettaen tuollainen arduinon servon ohjaus näyttää ihan järkeenkäyvältä sekin. Kun ei tunne näitä nykyajan hitusvinkuloita, niin ei ole tullut tuolla sanalla etsittyä. Pitääkin tsiigailla, kiitos vinkistä!

EDIT: muutin jopa viestiketjun nimeä, tällehän alkaa lämmetä.
 
https://www.allaboutcircuits.com/projects/servo-motor-control-with-an-arduino/

Tuossa esitellystä potentiometrin asentoa seuraavasta koodista saisi varmaan osaava tehtyä sopivan. Kaksi 0/1 sisääntuloa, joiden tilaa seurataan. Kun tila vaihtuu, niin servo ajetaan asennosta A asentoon B. Tai päinvastoin. Asennot säädetään kymppikierrostrimmereillä. Servoja on kaksi, potikoita neljä.

Arduino nanossa näyttää olevan peräti 8 analogiatuloa :tuijo:. Lähtöjäkin enemmän kuin tarpeeksi.
 
Viimeksi muokattu:
Semmonen selvennys että nano ja uno on sama asia, piirilevy toisessa pieni, selventämään eroja, molemmat 5V TTL tasolla.
 
Itse olen jonkin verran tehnyt picillä, homma alkoi joskus 20 vuotta sitten 16f74:lä

Töissä on laatikossa 16f628 ,648 876 malleja. Viimeksi mainittua olen käyttänyt kun tarvitsee AD muunninta.

C kielellä on koodia tehty.

Täytyisi tuijottaa mutta yleisesti sanoen korkean tason koodin voi suunnilleen pudottaa toiseen malliin kun vahtii että löytyy oikeat io nastat headerit on oikein koodissa ja koodin vaatima moduulit kuten uart pwm AD löytyy...

Arduinot on hyviä moneen.

Mutta omasta mielestäni picillä on paikkansa kun tekee kytkennän jossa kortilla vain se mitä tarvii, laajan lämpötila alueen systeemeihin,kun tarvitsee karsia turha pois.

Omat pic sovellukset mitä äkkiä tulee mieleen: aggregaatin ohjaus joka vahtii akkuja ja käynnistää dieselin. Lähettää raporttia sarjaliikenteellä. Sitten on erilaisia ahastimia mm lauhteenpoisto. Rele kortteja joita pc käskee sarjaportilla. Kippaavan sademittarin laskuri. Lämpötila kontrollereita, lineaari moottorin liikuttimia, lämpöpumpun kusetin kytkentää..
 
Ai niin.

Pic paskamaisuuksia yksi tulee mieleen: Tottakai suunnittelussa ja koodauksessa pitää lukea sitä piirin datasheettiä. Mutta ei heti älyä että pitää lukea sitä midrange manuaalia myös missä on asioita joita voi sössiä kuten oskillaattori moodit, AD muunnin juttuja. Kääntäjän headereissa ollut myös virheitä..
 
Intelin 80c51 joskus aloiteltu, kielenä assembler. Päivätyön puolesta nykyisin Pic 24 / 32 sarja käytössä, kääntäjänä IAR / CCS
 
Viimeksi muokattu:
Unohdin picit ja tilasin kaksi arduino uno-kloonia. Yksi riittää hommaan toinen on varalle. Hintaa huikeat jotain 2,xx euroa kappale.:shokki:
 
Tälleen disassemblyn kautta itseoppineena 8051 tyyppinä täältä tulee kyllä ämpärillinen rispektiä jos tää projekti muuttaa suuntansa 8051:n suuntaan. Ja voin avittaa koodin kanssa.
 
Multa saattaa löytyä 8051-projektiin epromeja ja joku prommeri. C-kääntäjäkin ehkä ettei tarvitse assemblerilla mennä... (Toivottavasti olen edes nuo heittänyt mäkeen jossain siivouksessa.) :facepalm:
 
Muuten tuli mieleen, kaikille Microchipin hautaajille, mitäs siellä arduino piirin päällä lukee ? Arkkitehtuuri taitaa olla aika lähellä 8051.kköstä...Mutta kun ostaa arduinon, kannattaa katsella, kuka prossun on valmistanut. Kauhea yllätys:confused::confused::confused::confused::confused::confused::confused::confused::confused::confused::confused:.
https://www.microchip.com/wwwproducts/en/ATMEGA32M1 ( Omat kokemukset Arduinon piirilevystä.... En uskalla laittaa yhtään mihinkään,
mikä voi vaarantaa käyttäjän terveyden ). Mutta, toisaalla, prosessoreissa ei ole suurempia eroja, mutta piirilevysuunnittelussa on....
 

Luo tili tai kirjaudu sisään kommentoidaksesi

Sinun täytyy olla jäsen voidaksesi jättää kommentin.

Luo käyttäjätili

Liity Konekansalaiseksi. Se on helppoa ja ilmaista! Rekisteröityneenä et näe mainoksia, voit käyttää hakua, näet alueita, joita nyt ovat piilossa...jne.

Kirjaudu sisään

Oletko jo Konekansan jäsen? Kirjaudu sisään tästä.

Takaisin
Ylös