BaroneRosso.it - Forum Modellismo

BaroneRosso.it - Forum Modellismo (https://www.baronerosso.it/forum/)
-   Circuiti Elettronici (https://www.baronerosso.it/forum/circuiti-elettronici/)
-   -   PROBLEMA con programma pic 12f629 (https://www.baronerosso.it/forum/circuiti-elettronici/321196-problema-con-programma-pic-12f629.html)

trabo 30 luglio 14 17:37

Citazione:

Originalmente inviato da MSchiepp (Messaggio 4345695)
qualche ritocco sull'hardware si può fare...

- aggiungi un condensatore elettrolitico 10uF 16V all'uscita del regolatore
- aggiungi un condensatore di filtro da 47 nF tra il pin 1 e il pin 8 del micro
- il condensatore C1 non serve a molto... se vuoi filtrare il pulsante devi mettere anche una resistenza in serie (t=RC, ma se R=0...)

visto che hai già messo i transistor, lasciali, ma puoi pilotare direttamente i led dai pin del micro (con la dovuta resistenza) con correnti fino a 20mA.

Michele

quindi... con queste modifiche che mi dici, credi che riesca a risolvere il problema?
E tra i programmi che ho scritto.... quale dunque mi consigli di utilizzare?
Aggiungo la resistenza??

Grazie

romoloman 30 luglio 14 18:13

Citazione:

Originalmente inviato da MSchiepp (Messaggio 4345695)
qualche ritocco sull'hardware si può fare...

- aggiungi un condensatore elettrolitico 10uF 16V all'uscita del regolatore
- aggiungi un condensatore di filtro da 47 nF tra il pin 1 e il pin 8 del micro
- il condensatore C1 non serve a molto... se vuoi filtrare il pulsante devi mettere anche una resistenza in serie (t=RC, ma se R=0...)

visto che hai già messo i transistor, lasciali, ma puoi pilotare direttamente i led dai pin del micro (con la dovuta resistenza) con correnti fino a 20mA.

Michele

già che uno c'è per non complicarsi la vita può ben pensare di rimuovere il quarzo, i due condensatori e usare l'oscillatore interno. in questo caso ricordarsi di caricare la calibrazione di fabbrica dell'oscillatore interno nell'apposito registro:

asm
{
bsf _status,RP0
call 0x3FF
movwf _osccal
bcf _status,RP0
}

Il grosso vantaggio è che si liberano ben due piedini di I/O

trabo 30 luglio 14 18:18

Citazione:

Originalmente inviato da romoloman (Messaggio 4345755)
già che uno c'è per non complicarsi la vita può ben pensare di rimuovere il quarzo, i due condensatori e usare l'oscillatore interno. in questo caso ricordarsi di caricare la calibrazione di fabbrica dell'oscillatore interno nell'apposito registro:

asm
{
bsf _status,RP0
call 0x3FF
movwf _osccal
bcf _status,RP0
}

Il grosso vantaggio è che si liberano ben due piedini di I/O

credi che il quarzo esterno dia problemi?
E poi? come dovrei rifare la calibrazione... scusa sono alle prima armi

romoloman 30 luglio 14 18:27

Citazione:

Originalmente inviato da trabo (Messaggio 4345763)
credi che il quarzo esterno dia problemi?
E poi? come dovrei rifare la calibrazione... scusa sono alle prima armi

Il vantaggio di usare quei micro pic si ha proprio nella presenza dell'oscillatore interno,
soprattutto nell'uso modellistico togliere il quarzo consente di ridurre ulteriormente le dimensioni del circuito.
La calibrazione la carichi con quelle righe di assembler che ti ho postato, la calibrazione viene fatta in fabbrica e normalmente non viene sovrascritta dal programmatore.
Se viene sovrascritta esiste la possibilità con il pikkit2 o il pickit3 di ricalcolarla.

Con il proton basic esiste un istruzione Set_OSCCAL che fa la stessa cosa. tuttavia non mi sembra presente nel mikrobasic, per quello ti ho postato l'assembly.

trabo 30 luglio 14 22:42

Citazione:

Originalmente inviato da romoloman (Messaggio 4345778)
Il vantaggio di usare quei micro pic si ha proprio nella presenza dell'oscillatore interno,
soprattutto nell'uso modellistico togliere il quarzo consente di ridurre ulteriormente le dimensioni del circuito.
La calibrazione la carichi con quelle righe di assembler che ti ho postato, la calibrazione viene fatta in fabbrica e normalmente non viene sovrascritta dal programmatore.
Se viene sovrascritta esiste la possibilità con il pikkit2 o il pickit3 di ricalcolarla.

Con il proton basic esiste un istruzione Set_OSCCAL che fa la stessa cosa. tuttavia non mi sembra presente nel mikrobasic, per quello ti ho postato l'assembly.


si ma questo significa che devo iniziare a studiare l'assembler.. giusto?
ho usato mikrobasic, perche a scuola lo ho studiato, quindi non sono partito completamente da 0..
Non so.. ditemi voi

romoloman 30 luglio 14 22:51

Citazione:

Originalmente inviato da trabo (Messaggio 4346032)
si ma questo significa che devo iniziare a studiare l'assembler.. giusto?
ho usato mikrobasic, perche a scuola lo ho studiato, quindi non sono partito completamente da 0..
Non so.. ditemi voi

No, basta che tu includa quel codice nel tuo programma basic...

romoloman 31 luglio 14 02:19

Puoi provare questo codice ?
Codice:

program MyProject

' Declarations section

main:
TRISIO.1=0
TRISIO.2=0
TRISIO.0=1
cmcon=7

fissa:
while true
  gpio.1=1
  gpio.2=1
  if gpio.0=1 then
    while (gpio.0=1)
    wend
    goto inizio
  end if
wend


inizio:
delay_ms(100)
while true
  if gpio.0=1 then
    while (gpio.0=1)
    wend
    goto mezzo
  end if
  GPIO.1=1
  gpio.2=1
  delay_us(50)
  GPIO.2=0
  gpio.1=0
  delay_us(50)
  IF GPIO.0=1 THEN
    while (gpio.0=1)
    wend
    GOTO mezzo
  end if
wend


mezzo:
delay_ms(100)
while true
  if gpio.0=1 then
    while (gpio.0=1)
    wend
    goto strobo
  end if
  gpio.2=1
  delay_ms(500)
  gpio.2=0
  delay_ms(500)
  gpio.1=1
  delay_ms(500)
  gpio.1=0
  delay_ms(500)
  if gpio.0=1 then
    while (gpio.0=1)
    wend
    goto strobo
  end if
wend

strobo:
delay_ms(100)
while true
  if gpio.0=1 then
    while (gpio.0=1)
    wend
    goto fissa
  end if
  gpio.1=1
  gpio.2=1
  delay_ms(50)
  gpio.1=0
  gpio.2=0
  delay_ms(50)
  if gpio.0=1 then
    while (gpio.0=1)
    wend
    goto fissa
  end if
wend
end.


se invecevuoi usarlo senza oscillatore esterno, usa questo, ricordantoti di settare nelle preferenze di progetto (project->edit project) di usare l'oscillatore interno, ed inoltre gia che ci sei di disabilitare le funzioni sul GP3/MCLR (recuperi 3 pin)

Codice:

program MyProject

' Declarations section

main:
asm
bsf status,RP0;
call 0x3FF
movwf osccal
bcf status,RP0
end asm

TRISIO.1=0
TRISIO.2=0
TRISIO.0=1
cmcon=7

fissa:
while true
  gpio.1=1
  gpio.2=1
  if gpio.0=1 then
    while (gpio.0=1)
    wend
    goto inizio
  end if
wend


inizio:
delay_ms(100)
while true
  if gpio.0=1 then
    while (gpio.0=1)
    wend
    goto mezzo
  end if
  GPIO.1=1
  gpio.2=1
  delay_us(50)
  GPIO.2=0
  gpio.1=0
  delay_us(50)
  IF GPIO.0=1 THEN
    while (gpio.0=1)
    wend
    GOTO mezzo
  end if
wend


mezzo:
delay_ms(100)
while true
  if gpio.0=1 then
    while (gpio.0=1)
    wend
    goto strobo
  end if
  gpio.2=1
  delay_ms(500)
  gpio.2=0
  delay_ms(500)
  gpio.1=1
  delay_ms(500)
  gpio.1=0
  delay_ms(500)
  if gpio.0=1 then
    while (gpio.0=1)
    wend
    goto strobo
  end if
wend

strobo:
delay_ms(100)
while true
  if gpio.0=1 then
    while (gpio.0=1)
    wend
    goto fissa
  end if
  gpio.1=1
  gpio.2=1
  delay_ms(50)
  gpio.1=0
  gpio.2=0
  delay_ms(50)
  if gpio.0=1 then
    while (gpio.0=1)
    wend
    goto fissa
  end if
wend
end.


romoloman 31 luglio 14 03:40

Ti ho ripulito un po il codice...
ho fra l'altro notato che c'era un problema in "mezzo" il controllo del tasto veniva fatto solo ogni 2 secondi...

Normalmente per far lampeggiare un led quando c'è di mezzo il controllo di eventi esterni l'uso dei delay non è la cosa più corretta da fare... si usano anzi gli interrupt sui timers ma visto che sei alle prime armi evitiamo di complicarti la vita:

Codice:

program MyProject
' Declarations section
sub function controlla_gpio() as integer
  dim count as integer
  count=0
  'semplice procedura di debouncing....
  while ((gpio.0=1) and (count<200))
    delay_ms(1)
    count=count+1
  wend
  if (count=200) then
    result=1
  else
    result=0
  end if
end sub

main:
' RIMUOVERE I COMMENTI SUcCESSIVI IN CASO DI OSCILLATORE INTERNO
'asm
' bsf status,RP0;
' call 0x3FF
' movwf osccal
' bcf status,RP0
'end asm

TRISIO.1=0
TRISIO.2=0
TRISIO.0=1
cmcon=7

fissa:
while true
  gpio.1=1
  gpio.2=1
  if controlla_gpio()=1 then
    goto inizio
  end if
wend


inizio:
delay_ms(100)
while true
  GPIO.1=1
  gpio.2=1
  delay_us(50)
  GPIO.2=0
  gpio.1=0
  delay_us(50)
  IF controlla_gpio()=1 THEN
    GOTO mezzo
  end if
wend


mezzo:
delay_ms(100)
while true
  gpio.2=1
  delay_ms(500)
  if controlla_gpio()=1 then
    goto strobo
  end if
  gpio.2=0
  delay_ms(500)
  if controlla_gpio()=1 then
    goto strobo
  end if
  gpio.1=1
  delay_ms(500)
  if controlla_gpio()=1 then
    goto strobo
  end if
  gpio.1=0
  delay_ms(500)
  if controlla_gpio()=1 then
    goto strobo
  end if
wend

strobo:
delay_ms(100)
while true
  gpio.1=1
  gpio.2=1
  delay_ms(50)
  gpio.1=0
  gpio.2=0
  delay_ms(50)
  if controlla_gpio()=1 then
    goto fissa
  end if
wend
end.


trabo 31 luglio 14 16:00

Citazione:

Originalmente inviato da romoloman (Messaggio 4346254)
Ti ho ripulito un po il codice...
ho fra l'altro notato che c'era un problema in "mezzo" il controllo del tasto veniva fatto solo ogni 2 secondi...

Normalmente per far lampeggiare un led quando c'è di mezzo il controllo di eventi esterni l'uso dei delay non è la cosa più corretta da fare... si usano anzi gli interrupt sui timers ma visto che sei alle prime armi evitiamo di complicarti la vita:

Codice:

program MyProject
' Declarations section
sub function controlla_gpio() as integer
  dim count as integer
  count=0
  'semplice procedura di debouncing....
  while ((gpio.0=1) and (count<200))
    delay_ms(1)
    count=count+1
  wend
  if (count=200) then
    result=1
  else
    result=0
  end if
end sub

main:
' RIMUOVERE I COMMENTI SUcCESSIVI IN CASO DI OSCILLATORE INTERNO
'asm
' bsf status,RP0;
' call 0x3FF
' movwf osccal
' bcf status,RP0
'end asm

TRISIO.1=0
TRISIO.2=0
TRISIO.0=1
cmcon=7

fissa:
while true
  gpio.1=1
  gpio.2=1
  if controlla_gpio()=1 then
    goto inizio
  end if
wend


inizio:
delay_ms(100)
while true
  GPIO.1=1
  gpio.2=1
  delay_us(50)
  GPIO.2=0
  gpio.1=0
  delay_us(50)
  IF controlla_gpio()=1 THEN
    GOTO mezzo
  end if
wend


mezzo:
delay_ms(100)
while true
  gpio.2=1
  delay_ms(500)
  if controlla_gpio()=1 then
    goto strobo
  end if
  gpio.2=0
  delay_ms(500)
  if controlla_gpio()=1 then
    goto strobo
  end if
  gpio.1=1
  delay_ms(500)
  if controlla_gpio()=1 then
    goto strobo
  end if
  gpio.1=0
  delay_ms(500)
  if controlla_gpio()=1 then
    goto strobo
  end if
wend

strobo:
delay_ms(100)
while true
  gpio.1=1
  gpio.2=1
  delay_ms(50)
  gpio.1=0
  gpio.2=0
  delay_ms(50)
  if controlla_gpio()=1 then
    goto fissa
  end if
wend
end.


Il primo codice che mi hai postato, rimane fisso sul primo effetto, mentre

il secondo parte, premo il pulsante, mi cambia effetto e dopo 2 secondi torna al primo effetto... oppure se premo un po' di piu cambia effetto poi torna al primo

romoloman 31 luglio 14 17:38

Citazione:

Originalmente inviato da trabo (Messaggio 4346709)
Il primo codice che mi hai postato, rimane fisso sul primo effetto, mentre

il secondo parte, premo il pulsante, mi cambia effetto e dopo 2 secondi torna al primo effetto... oppure se premo un po' di piu cambia effetto poi torna al primo

prova a cambiare il codice in questo modo:
Codice:

sub function controlla_gpio() as integer
  dim count as long
  count=0
  'semplice procedura di debouncing....
  while ((gpio.0=1))
    delay_ms(1)
    count=count+1
  wend
  if (count>200) then
    result=1
  else
    result=0
  end if
end sub

tieni presente che il cambio effetto ce l'hai sul rilascio del pulsante....

ps non sono sicuro di long... ma count deve essere dichiarato in modo da supportare un valore di almeno 65000 (unsigned integer ??)

Non ho il mikrobasic sottomano...


Tutti gli orari sono GMT +2. Adesso sono le 19:41.

Basato su: vBulletin versione 3.8.11
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
E' vietata la riproduzione, anche solo in parte, di contenuti e grafica. Copyright 1998/2019 - K-Bits P.I. 09395831002