Página 1 de 1

Piscar 8 leds em sequencia

MensagemEnviado: 18 Jul 2007 14:17
por wgc
Estou com um pequeno problema de memoria, tem uns 3 ou 4 anos que nao mecho com uC, hj fui pegar meu gravador de 8051 mas ele resolveu entrar de greve e nao funciona. Entao decidi usar os pics.
Tenho uma duvida ridicula mas necessito sana-la para recomecar a programar em uC.

Bom la vai...

Qual PIC e como eu faco para fazer 8 leds piscar em sequencia e com tempos diferentes um do outro?

Achei aqui nas minhas gavetas 4 pic 16f84a acredito que da para fazer esse mini projeto com ele nao?

MensagemEnviado: 18 Jul 2007 15:16
por dennisviana
Prezado wgc,


Voce pode sim usar o PIC 16F84, desde que use os dois Ports(A e B), escreva mais sobre a sequência que deseja implementar e eu tenterei lhe ajudar.



Atenciosamente,





Dennis Viana

MensagemEnviado: 18 Jul 2007 18:18
por phophollety
Pode carregar 8 sequencias de bits...

assim:

movlw b'00000001'
movwf portb
call timer

movlw b'00000010
movwf portb
call timer

e assim vai...

Ou utilizar o comando de rotação de bits

RLF ou RRF

MensagemEnviado: 18 Jul 2007 18:45
por tcpipchip
Antes de rotacionar, zere o CARRY

MensagemEnviado: 18 Jul 2007 18:50
por phophollety
Humm verdade.. esqueci deste detalhe...

Amigo, pegue algum aplicattion note no site da microchip...

MensagemEnviado: 18 Jul 2007 19:38
por valmy
Tenho um projeto de sequencial com vários efeitos utilizando o 16f84.

MensagemEnviado: 18 Jul 2007 20:15
por phophollety
Esse programinha foi um dos meus primeiros, faz um tempo já...

Se quiser testar.. ele é bem arcaico.. mas funcionava hhe

; PROGRAMA PARA CONTROLE DE LEDS COM 4 SEQUENCIAS DE EFEITOS


LIST P=PIC16F84 ; DEFINE O TIPO DE uC A SER UTILIZADO
INCLUDE P16F84.INC ; ARQUIVO PADRAO MICROCHIP PARA O uC DEFINIDO
__CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
; CONFIGURACOES DOS BITS INTERNOS, OSCILADOR XT (CRISTAL), WATCH DOG TIMER DESLIGADO
; POWER TIMER ON LIGADO E CODE PROTEC DESLIGADO

; ZONA DE ETIQUETAS
CNT500U EQU 0A ; 500uS CONTADOR
CNT1M EQU 0B ; 1mS CONTADOR
CNT100M EQU 0C ; 100mS CONTADOR
CNT500M EQU 0D ; 500mS CONTADOR
CNT1S EQU 0E ; 1S CONTADOR
#DEFINE BT0 PORTA,1 ; DEFINE BT0 EM PORTA 0
#DEFINE BT1 PORTA,2 ; DEFINE BT0 EM PORTA 1
#DEFINE BT2 PORTA,3 ; DEFINE BT0 EM PORTA 2
#DEFINE BT3 PORTA,4 ; DEFINE BT0 EM PORTA 3
#DEFINE CS0 FLAGS,0 ; DEFINE O FLAG CS 0
#DEFINE CS1 FLAGS,1 ; DEFINE O FLAG CS 1
#DEFINE CS2 FLAGS,2 ; DEFINE O FLAG CS 2

; COMBINACOES DE SAIDA PARA CONTROLE
;COMBINACAO 1
C0 EQU B'10000000'
C1 EQU B'01000000'
C2 EQU B'00100000'
C3 EQU B'00010000'
C4 EQU B'00001000'
C5 EQU B'00000100'
C6 EQU B'00000010'
C7 EQU B'00000001'

;COMBINACAO 2
C10 EQU B'00000001'
C11 EQU B'00000010'
C12 EQU B'00000100'
C13 EQU B'00001000'
C14 EQU B'00010000'
C15 EQU B'00100000'
C16 EQU B'01000000'
C17 EQU B'10000000'

;COBINAÇAO 3
C20 EQU B'10000001'
C21 EQU B'01000010'
C22 EQU B'00100100'
C23 EQU B'00011000'
C24 EQU B'00011000'
C25 EQU B'00100100'
C26 EQU B'01000010'
C27 EQU B'10000001'

; PROCESSOS INICIAIS

ORG 0X00 ;RESET VECTOR
GOTO INICIO ;VAI PARA INICIO
#DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMORIA
#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MEMORIA
CBLOCK 0X20 ;ENDERECO INICIAL DA MEMORIA DO USUARIO
FLAGS ;INCLUI FLAGS NO BLOCO DE MEMORIA
ENDC ;FIM DO BLOCO DE MEMORIA
ORG 0X04 ;ENDERECO INICIAL DA INTERRUPCAO
RETFIE ;RETORNA DA INTERRUPCAO

INICIO BSF STATUS,RP0 ;ALTERA PARA O BANCO 1
MOVLW H'FF' ;SETA O MODO DE ENTRADA DE DADOS
MOVWF TRISA ;SETA PORTO A PARA O MODO ENTRADA
CLRF TRISB ;SETA PORTO B PARA O MODO SAIDA
BCF STATUS,RP0 ;ALTERA PARA O BANCO 0
MOVLW H'00' ;SETA DADO LED OFF
MOVWF PORTB ;DADO DE SAIDA
CLRF PORTA ;LIMPA TODA O PORTO A
CLRF PORTB ;LIMPA TODO O PORTO B
BCF CS0 ;IMPOE 0 NO FLAG CS0
BCF CS1 ;IMPOE 0 NO FLAG CS1
BCF CS2 ;IMPOE 0 NO FLAG CS2

; ROTINA PRINCIPAL

TESTA
BTFSS BT0 ;TESTA BT0 SE = 1 TESTA O BT1, SE = 0 VAI PARA CB0
GOTO CB0 ;VAI PARA CB0
BTFSS BT1 ;TESTA BT1 SE = 1 TESTA O BT2, SE = 0 VAI PARA CB1
GOTO CB1 ;VAI PARA CB1
BTFSS BT2 ;TESTA BT2 SE = 1 TESTA O BT3, SE = 0 VAI PARA CB2
GOTO CB2 ;VAI PARA CB2
BTFSC CS0 ;TESTA CS0 SE = 1 TESTA O BT1, SE = 0 VAI PARA CB0
GOTO CB0 ;VAI PARA CB0
BTFSC CS1 ;TESTA CS1 SE = 1 TESTA O BT2, SE = 0 VAI PARA CB1
GOTO CB1 ;VAI PARA CB1
BTFSC CS2 ;TESTA CS2 SE = 1 TESTA O BT3, SE = 0 VAI PARA CB2
GOTO CB2 ;VAI PARA CB2
GOTO TESTA ;VAI PARA TESTA PARA REINICIAR O CICLO

CB0 BSF CS0 ;IMPOE 1 NO FLAG CS0
BCF CS1 ;IMPOE 0 NO FLAG CS1
BCF CS2 ;IMPOE 0 NO FLAG CS2
MOVLW C0 ;CARREGA C0 EM WORK
MOVWF PORTB ;MOVE O DADO DE WORK PARA O PORTO B
CALL T100M ;CHAMA T100M
MOVLW C1 ;CARREGA C1 EM WORK
MOVWF PORTB ;MOVE O DADO DE WORK PARA O PORTO B
CALL T100M ;CHAMA T100M
MOVLW C2 ;CARREGA C2 EM WORK
MOVWF PORTB ;MOVE O DADO DE WORK PARA O PORTO B
CALL T100M ;CHAMA T100M
MOVLW C3 ;CARREGA C3 EM WORK
MOVWF PORTB ;MOVE O DADO DE WORK PARA O PORTO B
CALL T100M ;CHAMA T100M
MOVLW C4 ;CARREGA C4 EM WORK
MOVWF PORTB ;MOVE O DADO DE WORK PARA O PORTO B
CALL T100M ;CHAMA T100M
MOVLW C5 ;CARREGA C5 EM WORK
MOVWF PORTB ;MOVE O DADO DE WORK PARA O PORTO B
CALL T100M ;CHAMA T100M
MOVLW C6 ;CARREGA C5 EM WORK
MOVWF PORTB ;MOVE O DADO DE WORK PARA O PORTO B
CALL T100M ;CHAMA T100M
MOVLW C7 ;CARREGA C5 EM WORK
MOVWF PORTB ;MOVE O DADO DE WORK PARA O PORTO B
CALL T100M ;CHAMA T100M
CLRF PORTB ;LIMPA O PORTO B
GOTO TESTA ;VAI PARA TESTA

CB1 BSF CS1 ;IMPOE 1 NO FLAG CS1
BCF CS0 ;IMPOE 0 NO FLAG CS0
BCF CS2 ;IMPOE 0 NO FLAG CS2
MOVLW C10 ;CARREGA C0 EM WORK
MOVWF PORTB ;MOVE O DADO DE WORK PARA O PORTO B
CALL T100M ;CHAMA T100M
MOVLW C11 ;CARREGA C11 EM WORK
MOVWF PORTB ;MOVE O DADO DE WORK PARA O PORTO B
CALL T100M ;CHAMA T100M
MOVLW C12 ;CARREGA C12 EM WORK
MOVWF PORTB ;MOVE O DADO DE WORK PARA O PORTO B
CALL T100M ;CHAMA T100M
MOVLW C13 ;CARREGA C13 EM WORK
MOVWF PORTB ;MOVE O DADO DE WORK PARA O PORTO B
CALL T100M ;CHAMA T100M
MOVLW C14 ;CARREGA C14 EM WORK
MOVWF PORTB ;MOVE O DADO DE WORK PARA O PORTO B
CALL T100M ;CHAMA T100M
MOVLW C15 ;CARREGA C15 EM WORK
MOVWF PORTB ;MOVE O DADO DE WORK PARA O PORTO B
CALL T100M ;CHAMA T100M
MOVLW C16 ;CARREGA C16 EM WORK
MOVWF PORTB ;MOVE O DADO DE WORK PARA O PORTO B
CALL T100M ;CHAMA T100M
MOVLW C17 ;CARREGA C17 EM WORK
MOVWF PORTB ;MOVE O DADO DE WORK PARA O PORTO B
CALL T100M ;CHAMA T100M
CLRF PORTB ;LIMPA O PORTO B
GOTO TESTA ;VAI PARA TESTA

CB2 BSF CS2 ;IMPOE 1 NO FLAG CS2
BCF CS1 ;IMPOE 0 NO FLAG CS1
BCF CS0 ;IMPOE 0 NO FLAG CS0
MOVLW C20 ;CARREGA C0 EM WORK
MOVWF PORTB ;MOVE O DADO DE WORK PARA O PORTO B
CALL T100M ;CHAMA T100M
MOVLW C21 ;CARREGA C21 EM WORK
MOVWF PORTB ;MOVE O DADO DE WORK PARA O PORTO B
CALL T100M ;CHAMA T100M
MOVLW C22 ;CARREGA C22 EM WORK
MOVWF PORTB ;MOVE O DADO DE WORK PARA O PORTO B
CALL T100M ;CHAMA T100M
MOVLW C23 ;CARREGA C23 EM WORK
MOVWF PORTB ;MOVE O DADO DE WORK PARA O PORTO B
CALL T100M ;CHAMA T100M
MOVLW C24 ;CARREGA C24 EM WORK
MOVWF PORTB ;MOVE O DADO DE WORK PARA O PORTO B
CALL T100M ;CHAMA T100M
MOVLW C25 ;CARREGA C25 EM WORK
MOVWF PORTB ;MOVE O DADO DE WORK PARA O PORTO B
CALL T100M ;CHAMA T100M
MOVLW C26 ;CARREGA C26 EM WORK
MOVWF PORTB ;MOVE O DADO DE WORK PARA O PORTO B
CALL T100M ;CHAMA T100M
MOVLW C27 ;CARREGA C27 EM WORK
MOVWF PORTB ;MOVE O DADO DE WORK PARA O PORTO B
CALL T100M ;CHAMA T100M
CLRF PORTB ;LIMPA O PORTO B
GOTO TESTA ;VAI PARA TESTA

; TEMPORIZADOR DE 1mSEC
T1M MOVLW D'2' ;(1) SETA LOOP CNT1
MOVWF CNT1M ;(1) SALVA LOOP CNT1
TM1LP1 MOVLW D'249' ;(1)*2 SETA LOOP CNT2
MOVWF CNT500U ;(1)*2 SALV LOOP CNT2
TM1LP2 NOP ;(1)*249*2 CICLO INOPERANTE PARA COMPENSACAO
NOP ;(1)*249*2 CICLO INOPERANTE PARA COMPENSACAO
DECFSZ CNT500U,CNT500U;F ;(1)*249*2 CNT500U-1=0 ?
GOTO TM1LP2 ;(2)*248*2 NAO, CONTINUE
DECFSZ CNT500U,CNT500U;F ;(1)*2 CNT1M-1=0 ?
GOTO TM1LP1 ;(2) NAO. CONTINUE
RETURN ;(2) SIM. CNT END
;TOTAL 2501*0.4USEC=1MSEC

; TEMPORIZADOR DE 100mSEC
T100M MOVLW D'249' ;SETA LOOP COUNTER
MOVWF CNT100M ;SALVA LOOP COUNTER
TM2LP CALL T1M ;1MSEC SUBROTINA
DECFSZ CNT100M,CNT100M;CNT100MCNT100MF ;CNT100M - 1 = 0 ?
GOTO TM2LP ;NAO, CONTINUE
RETURN ;SIM, COUNT END

END ;FIM DE PROGRAMA

MensagemEnviado: 20 Jul 2007 13:37
por ze
pode tentar algo como:

unsigned char const tabled[]={
0b10000000,
0b01000000,
0b00100000,
0b00010000,
0b00001000,
0b00000100,
0b00000010,
0b00000001,

0b00000001,
0b00000010,
0b00000100,
0b00001000,
0b00010000,
0b00100000,
0b01000000,
0b10000000,

0b10000001,
0b01000010,
0b00100100,
0b00011000,
0b00011000,
0b00100100,
0b01000010,
0b10000001,

};
void main (void)
{
unsined char x;
//inicialização das portas, registros, etc...
TRISB=0; //tudo saída
//loop
//* ou PORTB=1; //só desloca leds - não precisa da tabela
for(;;)
{
PORTB=tabled[x];
//rotinas de delay, teclas, etc...
if (x++>23) x=0; //constante = num. de padrões de leds da tabela-1(no caso acima 23)
//* ou PORTB<<=1; if (!PORTB) PORTB=1; //só desloca leds
}
}

não testei este programa. digitei-o aqui.
apenas para ilustrar.
se alguém achar algum erro e quiser mencionar, sinta-se a vontade...

abraço...

MensagemEnviado: 20 Jul 2007 20:16
por icaro51
nao se esqueca que para algumas portas do pic 84 vc vai precisar colocar resistores de pull up, se nao me engano nesse pic e a A4, de qualquer meneira, o que eu faco quando tento fazer alguma coisa do tipo e nao funciona antes de arrancar os cabelos eu coloco em resistor pro vcc e vejo se nao era esse o problema, se era beleza, se nao eu sento e choro :-)

Abraco

MensagemEnviado: 25 Set 2007 00:28
por caferninha
;************************************************************
; Processor: PIC16F628 at 4 MHz using internal RC oscillator
; Function: Flash a LED connected to RA2
; Hardware: Testboard K4
; Filename: 628LED.asm
; Author: Lars Petersen, oz1bxm@qsl.net
; Website: www.qsl.net/oz1bxm/PIC/pic.htm
; Credit: Tony Nixon's LED flasher
;************************************************************

LIST P=16F628, R=DEC ; Use the PIC16F628 and decimal system

#include "P16F628.INC" ; Include header file

__config _INTRC_OSC_NOCLKOUT & _LVP_OFF & _WDT_OFF & _PWRTE_ON & _BODEN_ON

CBLOCK 0x20 ; Declare variable addresses starting at 0x20
Loop1,Loop2
ENDC
;
; -----------
; INITIALIZE
; -----------
;
ORG 0x000 ; Program starts at 0x000

CLRF PORTA ; Initialize port A
CLRF PORTB ; Initialize port B

BSF STATUS,RP0 ; RAM bank 1

CLRF TRISA ; All pins port A output
CLRF TRISB ; All pins port B output

BCF STATUS,RP0 ; RAM bank 0

;***** VARIABLE DEFINITIONS
W_TEMP EQU 0X28
STATUS_TEMP EQU 0X29
COUNTERA EQU 0X2A
COUNTERB EQU 0X2B
COUNTERC EQU 0X27

;
; ------------------------
; FUNCTION OF PORT A PINS
; ------------------------
;
MOVLW 7
MOVWF CMCON ; Comparators off, all pins digital I/O

;
; ----------
; MAIN LOOP
; ----------
;
Main BSF PORTA,0 ; Turn on LED connected to RA2 VErmelho 1
BSF PORTA,1 ; Turn on LED connected to RA3 Azul 2
CALL delay

BCF PORTA,1 ; Turn off LED connected to RA3 Azul 2
BSF PORTA,2 ; Turn on LED connected to RA5 VERDE 2
CALL delay
CALL delay

CALL delay
BCF PORTA,2 ; Turn off LED connected to RA5 Verde 2
BSF PORTA,3 ; Liga LED connected to RA5 Amarelo 2
CALL delay

CALL delay
BCF PORTA,3 ; Turn off LED connected to RA5
BCF PORTA,0 ; Turn off LED connected to RA2



BSF PORTB,2 ; Turn on LED connected to RA2 VErmelho 1
BSF PORTB,3 ; Turn on LED connected to RA3 Azul 2
CALL delay

CALL delay
BCF PORTB,3 ; Turn off LED connected to RA3 azul 2
BSF PORTB,4 ; Turn on LED connected to RA5 VERDE 2
CALL delay
CALL delay

CALL delay
BCF PORTB,4 ; Turn off LED connected to RA5 Verde 2
BSF PORTB,5 ; Liga LED connected to RA5 Amarelo 2
CALL delay

CALL delay
BCF PORTB,5 ; Turn off LED connected to RA5
BCF PORTB,2 ; Turn off LED connected to RA2

GOTO Main





;PIC Time Delay = 0.5000000 s with Osc = 4.000000 MHz


delay MOVLW D'3'
MOVWF COUNTERC
MOVLW D'140'
MOVWF COUNTERB
MOVLW D'83'
MOVWF COUNTERA
LOOP DECFSZ COUNTERA,1
GOTO LOOP
DECFSZ COUNTERB,1
GOTO LOOP
DECFSZ COUNTERC,1
GOTO LOOP
RETURN
END



Achei esse codigo na net, funciona perfeitamente. Muito bom para trabalhos de faculdade. :)

So sobrar um tempo deixo ele mais didatico, mesmo pq ate o final do ano tenho quer apresentar os codigos na faculdade. :)

O Circuito.

Imagem

MensagemEnviado: 25 Set 2007 08:37
por fabim
PASCAL.
PortX := Random(portX)+1;

rsrs..

Fabim