Página 1 de 2

sleep wake up e wdt

MensagemEnviado: 13 Jan 2013 22:03
por vanessa
desejo que alguem olhe o codigo a seguir, ele é de um alarme com sensor iv que dispara quando o feixe é interrompido, o feixe é continuo e eu queria usar o sleep para fazer com que o feixe seja desligado de quando em quando economizando energia mas parece que o wdt nao esta acordando o pic. se eu tiro a funcao sleep o codigo funciona.
O QUE EU TO FAZENDO DE ERRADO, POR QUE NAO SAI DO SLEEP?
obs; antes que alguem diga que eu preciso desligar as saídas referentes aos bits <1:0> antes de entrar em sleep para economizar energia, vou fazer isso, mas primeiro eu tenho que fazer o wake up funcionar senao vira bagunca o codigo.


list p=16F688
#include <p16F688.inc>



errorlevel -302 ; no warnings about registers not in bank 0


;***** CONFIGURATION
; ext reset, no code or data protect, no brownout detect,
; no watchdog, power-up timer, 4Mhz int clock
__CONFIG _PWRTE_ON & _BOD_OFF & _MCLRE_OFF & _WDT_ON & _INTRC_OSC_NOCLKOUT & _CP_OFF & _CPD_OFF & _INTOSCIO & _FCMEN_OFF & _IESO_OFF


RESET CODE 0x0000
goto inicio

inicio

clrwdt

movlw b'000000'
banksel TRISA
movwf TRISA

movlw b'000011'
banksel PORTA
movwf PORTA



vigilancia


clrwdt

btfss PORTA,3 ;RA3
goto finalizou
sleep
nop
goto vigilancia

;;;fim vigilancia


finalizou

movlw b'000111'
banksel PORTA
movwf PORTA

goto finalizou

END

MensagemEnviado: 15 Jan 2013 14:28
por RobL
Tem capacitor de desacoplamento entre Vdd e Vss (100nF x 50V cerâmico) ?

Se a tensão entre Vdd e Vss é baixa, teste com uma frequencia bem baixa para o oscilador interno.

MensagemEnviado: 16 Jan 2013 00:56
por jorgeluiz
nao conheço esse pic, mas acho que como a maioria dos pics, deve "acordar" com uma interrupçao. Entao bota o programa dentro do vetor de inturrupçao, que deve funcionar.

MensagemEnviado: 16 Jan 2013 07:03
por fabim
isto mesmo.
Qualquer uC acorda com algum tipo de interrupção gerada via HW.
No caso do pic, se você não criar o vetor de interrupção, e não HABILITAR a interrupção que no datasheet informa que acorda o pic do sleep, jamais irá funcionar!!

MensagemEnviado: 16 Jan 2013 10:41
por RobL
Não necessita isso no caso do WDT.
Ao estourar o wdt ele sai do sleep.
Executa a primeira instrução a seguir. Se GIE estiver habilitado executa a interrupção pendente, se não, segue o programa após sleep.
Se não tiver alguma pegadinha no PIC16F688 que não conheço, mas por ser 16F deve ser cópia dos demais dessa linha, o problema parece hardware.

Caso não encontre nada no hardware, principalmente a falta do capacitor de desacoplamento, ou tensão próxima do mínimo desse chip tente a seguir.
Creio que não seja isto, mas tente, como experiência:

Habilite MCRL, não esqucer de após ligar a alimentação ressetar, levando MCRL a zero e voltando a 1L. MCRL deverá estar com 1L ao entrar e sair do sleep.
Verifique agora se sai do sleep pelo wdt.

MensagemEnviado: 16 Jan 2013 10:48
por ze
eu colocaria apenas BOD_ON

MensagemEnviado: 16 Jan 2013 12:02
por vanessa
poxa gente desculpa... eu testei so no proteus ( o pessoal tava apostando na tensao baixa), mas como nao funcionou no proteus eu resolvi nao tentar no hardware, eu ate uso o capacitor de desaclopamento...
eu tinha tambem dado uma boa procurada no datasheet pra ver se encontrava alguma pegadinha... mesmo nao precisando habilitar GIE eu fiz pra ver se funcionava...
vou habilitar o MCLR e resetar.
Nao descarto a hipotese do "hardware simulado" do proteus ta com problema, mas eu tenho medo de gravar um pic com o codigo com um codigo ruim e inutilizar o pic.
Se nada der certo eu vou acordar-lo com um overflow do timer.
Obrigado gente!

MensagemEnviado: 16 Jan 2013 12:10
por fabim
Robl, mais ai no caso do WDT, tu ta resetando o uC.
Se eu entendi direitinho, a vanessa quer continuar PC$+1.

sei lá, acredito eu.

MensagemEnviado: 16 Jan 2013 12:38
por ze
fabin o efeito do wdt no sleep é diferente. ele acorda pc + 1 como a menina quer e não o zero. sei lá só passei pra encher o saco. o robl confirma

ah e o óvbio ululante... menina se o seu mc for flash a chance de danificá-lo com cod errado tende a zero.

MensagemEnviado: 16 Jan 2013 15:59
por mastk
Não se faz omelete sem quebrar uns ovos, esteja disposta a queimar alguns PICs, o importante é que para cada erro que cometer aprender bem a fim de não repeti-lo novamente.

MensagemEnviado: 16 Jan 2013 16:07
por RobL
lellis está correto.

vanessa não custaria nada ter informado que é uma simulação, pra gente não quebrar cabeça com hardware.

Tente com MCLR na simulação que deve ter bug da outra forma, ou falta setar algo por aí para ele simular o wdt corretamente.

MensagemEnviado: 16 Jan 2013 19:30
por vtrx
Wanessa,voce pode programar no vetor de reset(0x0000),um CALL Inicio,para depois de inicializar o hardware,ele voltar na sequencia e voce faer um teste com algum pino,e caso este pino esteja no nível que voce quer,ele salta para uma rotina ou execute um SLEEP,deixando o WDT sempre estourar,tipo:
Código: Selecionar todos
RESET CODE 0x0000
  CALL Inicio
  BTFSC PORTA,0
  SLEEP
  GOTO alguma coisa

MensagemEnviado: 17 Jan 2013 11:44
por vanessa
realmente, o que eu desejo fazer é pc + 1,
vtrx; eu não desejo estourar o WDT quando o pic ta acordado, eu desejo usar o SLEEP e aí sim ele estoura quando o pic ta dormindo.

MensagemEnviado: 17 Jan 2013 16:32
por RobL
É pra acordar com WDT. Não vale balde de água fria, vuvuzela ou o wouuu da Valéria.

MensagemEnviado: 17 Jan 2013 18:22
por vtrx
Código: Selecionar todos
eu não desejo estourar o WDT quando o pic ta acordado, eu desejo usar o SLEEP e aí sim ele estoura quando o pic ta dormindo.

Nem voce e nem eu!
Limpe o WDT quando o código estiver rodando em modo 'normal',como ja foi dito,só sai do Sleep com Interrup~çao ou WDT...