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 31 luglio 14 18:29

Citazione:

Originalmente inviato da romoloman (Messaggio 4346789)
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...

provato, mikrobasic non mi riconosce il comando long...
grazie per l'aiuto che mi daiB)

romoloman 31 luglio 14 20:00

Citazione:

Originalmente inviato da trabo (Messaggio 4346818)
provato, mikrobasic non mi riconosce il comando long...
grazie per l'aiuto che mi daiB)

premesso che il mikrobasic viene fornito di manuale e pertanto non dovrebbe essere di troppa difficoltà trovare i "types" e vedere che si chiamava "word"
Capisco che sei alle prime armi... ma leggere i manuali aiuta...


Codice:

program MyProject
' Declarations section
sub function controlla_gpio() as integer
  dim count as word
  count=0
  while ((gpio.0=1) )
    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 01 agosto 14 10:57

Citazione:

Originalmente inviato da romoloman (Messaggio 4346899)
premesso che il mikrobasic viene fornito di manuale e pertanto non dovrebbe essere di troppa difficoltà trovare i "types" e vedere che si chiamava "word"
Capisco che sei alle prime armi... ma leggere i manuali aiuta...


Codice:

program MyProject
' Declarations section
sub function controlla_gpio() as integer
  dim count as word
  count=0
  while ((gpio.0=1) )
    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.


Hai ragione,comunque, niente, appena premo passa al secondo effetto e poi torna subito al primo.. non va oltre

romoloman 01 agosto 14 12:03

Citazione:

Originalmente inviato da trabo (Messaggio 4347355)
Hai ragione,comunque, niente, appena premo passa al secondo effetto e poi torna subito al primo.. non va oltre

E allora posso darti la notizia che quasi con assoluta certezza hai qualcosa nel circuito, (tasto farlocco o altro) qui funziona, anche se non lo farei mai in quel modo perché non è il modo corretto di gestire un evento esterno e gli eventi temporizzati.
Nei PIC esistono gli interrupt....

http://www.freeinfosociety.com/media/pdf/3134.pdf

trabo 05 agosto 14 10:06

Ok... ringrazio tutti per l'aiuto... cerchero' di approfondire.

Grazie ancora


Tutti gli orari sono GMT +2. Adesso sono le 07:33.

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