Curso de programación de PIC en PICBasic Pro

Buenas noches ricbevi y compañeros, el max7219 se puede trabajar en cascada, lo que entra por Din lo envia por Dout y asi sucesivamente en los que esten conectados, lo que no logro conseguir es hacer el corrimiento al siguiente Max7219, no se como habilitarlo por codigo, el datasheet dice:

El registro no operativo se utiliza cuando se conectan en cascada MAX7219 o MAX7221. Conecte todas las entradas LOAD / CS de todos los dispositivos y conecte DOUT a DIN en dispositivos adyacentes. DOUT es una salida de nivel lógico CMOS que maneja fácilmente DIN de partes sucesivamente en cascada. (Consulte la sección Modos de direccionamiento en serie para obtener información detallada sobre el tiempo de entrada / salida en serie). Por ejemplo, si cuatro MAX7219 están en cascada, para escribir en el cuarto chip, se envía la palabra de 16 bits deseada, seguida de tres no-op códigos (hex XXXX, ver Tabla 2). Cuando LOAD / CS sube, los datos se enclavan en todos los dispositivos. Los primeros tres chips reciben comandos sin operación, y el cuarto recibe los datos deseados.

Bueno sin embargo lo que quiero hacer yo es que cuando termine en la primer matriz siga en le siguiente y eso es lo que no me da.
Este es mi codigo:
Código:
'****************************************************************
'*  Name    : Matrix8x8.BAS                                     *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2019 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 26/09/2019                                        *
'*  Version : 1.0                                               *
'*  Notes   :  PIC16F883                                        *
'*          :                                                   *
'****************************************************************
    Include "Modedefs.bas"
    ANSEL = 0
    ANSELH = 0
' ** Set Xtal Value in mHz **

    Define    OSC    20        ' Set Xtal Frequency

' ** Declare TRIS Used **
'    TRISB = 0


' ** Declare Pins Used **
    Clk     Var    PortB.0        ' Data is clocked on rising edge of this pin
    Dta      Var    PortB.1        ' Bits are shifted out of this pin
    Load    Var    PortB.2        ' Transfers data to LEDs when Pulsed

' ** Declare Constants **
    No_Op            Con $0    ' Scan-limit register.
    Decode_Reg         Con    $9    ' Decode register, a 1 turns on BCD decoding for each digit.
    Intensity        Con    $A    ' Intensity register.
    ScanLimit_Reg    Con    $B    ' Scan-limit register. 
    Shutdown_Reg    Con    $C    ' On/Off Register.
    Display_test    Con    $F    ' Test mode register (all digits on, 100% bright)

'    Max_Digit    Con    5    ' Amount of LED Displays being used.

' ** Declare Variables **
      Counter        Var    Byte    ' Variable used for the Demo Counting routine
    Max_Disp    Var    Word    ' 16-bit value to be displayed by the MAX7219
    i            Var    byte    ' Digit number to place Decimal point (0-4)
    Register    Var    Byte    ' Pointer to the Internal Registers of the MAX7219
    R_Val        Var    Byte    ' Data placed in Each Register
    Digit        Var    Byte    ' Position of individual numbers within MAX_Disp (0-3)
    Digito        Var    Byte    ' Position of individual numbers within MAX_Disp (0-3) 
    Position    Var    Byte    ' Position of each LED display (1-4)
  
' ** INITIALIZE THE MAX7219 **
' Each register address is sent along with its setting data.
' Because the MAX7219 expects to see a packet of 16 bits, then the LOAD pin is pulsed
' Set the scan limit to 3 (4 digits, numbered 0-3)
' Set the Brightness to 5
' BCD decoding to the lower 4 digits
' Switch the display on.
' Turn Off test mode

i = "a"
  
    Register=Shutdown_Reg    ' Point to the Switch Register
    R_Val=$00                ' Set to One, (switches the display ON)
    Gosub Transfer            ' Transfer this 16-bit Word to the MAX7219 

    Register=No_Op             ' Point to the Scan Register
    R_Val=0                    ' send 3, (Four LED Displays 0-3)
    Gosub Transfer            ' Transfer this 16-bit Word to the MAX7219
      
    Register=ScanLimit_Reg    ' Point to the Scan Register
    R_Val=$07                ' send 3, (Four LED Displays 0-3)
    Gosub Transfer            ' Transfer this 16-bit Word to the MAX7219

    Register=Intensity         ' Point to the Luminance Register
    R_Val=$05                 ' Send 5, (Value for Brightness)
    Gosub Transfer            ' Transfer this 16-bit Word to the MAX7219

    Register=Decode_Reg        ' Point to BCD Decode Register
    R_Val=$00                ' Decode the first 5 digits
    Gosub Transfer            ' Transfer this 16-bit Word to the MAX7219

    Register=Display_test    ' Point to the Test Register
    R_Val=$00                ' Reset to Zero, (turns off Test mode)
    Gosub Transfer            ' Transfer this 16-bit Word to the MAX7219

    Register=Shutdown_Reg    ' Point to the Switch Register
    R_Val=$01                ' Set to One, (switches the display ON)
    Gosub Transfer            ' Transfer this 16-bit Word to the MAX7219

i = "a"
counter = 1

Inicio:

    digito = 1                                      ;Cargo Digito para que comience en 1
    for counter = counter to 8                      ;Contador para las filas de la matriz
        Register = counter                          ;Cargo el valor de Counter a Register para enviarle al max 7219
        for Digit = 1 to 8                          ;Contador de columnas de la matriz
            R_Val=Digito                            ;Cargo el valor de Digito a R_Val para enviarle al max 7219 y prenda led por led como en culebrilla
            Gosub Transfer                          ;Se va a la etiqueta Transfer y envia el dato al Max 7219
            pause 100         
        if digito => 128 then                       ;Pregunta si Digito es mayo o igual a 128
            digito = 0                              ;Se pone a 0 Digito para apagar el led
            R_Val=Digito                            ;Cargo el valor de Digito a R_Val para enviarle al max 7219
            counter = counter + 1                   ;Se incrementa la Counter para pasar a la sigiente fila de la matrix
            Gosub Transfer                          ;Se va a la etiqueta Transfer y envia el dato al Max 7219 y apague el led
            goto devolver                           ;Se va a la etiqueta devolver para que se devuelva nuevamente hacia adelante en la siguiente fila
        endif         
        digito = digito <<1                         ;Se desplaza el led hacia el siguiente led
        next             
    next
                                                    ;Aca se crea el efecto de regresarse hacia el inicio en la otra fila
devolver:
                                                    ;Cargo Digito para que comience en 128
    digito = 128
    for counter = counter to 8
        Register = counter
        for Digit = 1 to 8                       
            R_Val=Digito
            Gosub Transfer
            pause 100
            if digito <= 1 then
                digito = 0 
                R_Val=Digito
                counter = counter + 1
                if counter > 8 then counter = 8
                Gosub Transfer             
                if counter => 8 then       
                    if counter => 8 then i = "b"
                    if counter => 8 and i = "b" then i = "c"
                    counter = 1
                endif
                goto inicio
            endif         
            digito = digito >>1
        next     
    next
goto Inicio 
' Send a 16-bit word to the MAX7219
Transfer:
select CASE i
    
      case "a"
    Shiftout Dta,Clk,msbfirst,[0,0,0,0,0,0,Register,R_Val] ' Escribe en la primera matriz
    High Load                ' The data is now acted upon 
@    Nop
@    Nop                    ' A small delay to ensure correct clocking times
    Low Load                ' Disable the MAX7219   
    Return                    ' Exit from Subroutine

    case "b"
    Shiftout Dta,Clk,msbfirst,[Register,R_Val,00] ' Escribe en la segunda matriz
    High Load                ' The data is now acted upon 
@    Nop
@    Nop                    ' A small delay to ensure correct clocking times
    Low Load                ' Disable the MAX7219
    Return                    ' Exit from Subroutine

      case "c"
    Shiftout Dta,Clk,msbfirst,[Register,R_Val,0,0,0,0] ' Escribe en la tercera matriz
    High Load                ' The data is now acted upon 
@    Nop
@    Nop                    ' A small delay to ensure correct clocking times
    Low Load                ' Disable the MAX7219
    Return                    ' Exit from Subroutine

end select
return

end
Cordial saludo y de ante mano gracias!
 
Última edición:
Antes de abocarme en sí al programa yo haría un simple demo de cómo se enciende los led de la matriz cuando se cambia de MAX estando en cascada.

Tu programa se queda en el primer MAX y nunca sale de allí por lo que debes investigar como es el asunto.

Nunca trabaje con ese chip.
 
Hola compañeros, bueno he conseguido trabajar las matriz cada vez que temine de trabajar en una pase a la siguiente. Lo consegui inicializando todos los MAX7219, se envian los 16 bits por cada MAX que se tenga, en mi caso son 3. Anteriormente solo envia una sola trama:

Código:
        Shiftout Dta,Clk,msbfirst,[Register,R_Val,Register,R_Val,Register,R_Val,Register,R_Val] 'Inicializo todos los MAX7219
        High Load                ' Activo el dato enviado al MAX7219   
    @    Nop
    @    Nop                        ' Tiempo de espera
        Low Load                ' Deshabilito el MAX7219
Buscando por la web encontre un codigo de una matriz de led 8x32 funcionando, pero me al correrlo en proteus corre de forma vertical, como puedo hacer por codigo para que trabaje de forma horizontal, trate con el codigo de las letras se enderezan pero siguen de forma vertical.

2019-10-11 (1).png

Código:
SEND_DATA:      'PARTE DEL CODIGO QUE ME GUSTARIA QUE ME EXPLICARAN

For CharLine=0 To 5
GoSub Display_inc
Display[i-1]=FC[CharLine]
GoSub Update_data
pause SpeedScrolling 
Next ;CharLine
Return

Display_inc:
For i=0 To 31
Display[i]=Display[i+1]
Next 
Return
Nunca he trabajado los array de esa forma, me podrian colaborar explicando como trabaja esta parte del codigo.
Adjunto codigo y simulacion proteus 8.9

De ante mano muchas gracias.
 

Adjuntos

Hola amigo,tengo una pregunta sobre el Hex de tonos del roger beep que expones,me puedes decir como se puede simular dichos tonos si es que se puede y de cuantos tonos consta el Hex?.
No tengo la suerte de saber programar,pues mi idea seria incorporar tonos originales a dicho pic.
Un saludo

Citar
Denunciar
 
Posiblemente tenga algo que agregar el tocayo. Si te refieres al último archivo subido(que está completo).

Al activar el PTT genera un tono de 2.525Hz durante 250 ms(1/4 seg) y al soltar el PTT 2.475Hz durante el mismo tiempo.

be.JPG
Sacado del archivo subido.

Simular, esta incluido el archivo con el esquema para hacerlo(DSN) en el Ares de Proteus en el mismo archivo ".rar" subido.

be1.JPG
 
Última edición:
Al pulsar el Ptt hace beep y al largarlo otro beep que a un oído poco entrenado le parecen similares ya que la diferencia de frecuencia es poca.
 
Gracias de nuevo Ricbevi,pero no es lo que busco,comento hay un enlace en youtube al cual me dirigí y a un amigo del foro de muchos años al cual estoy muy agradecido(Moises Calderon)me gustaría saber si entre todos este llamador al cual me refiero,ya que esta diseñado solo para principio y no al soltar PTT que es lo que busco y personalizar el sonido que yo quiera.Mis conocimientos son los justos veo construyó y sueldo componentes pues es una pasión cacharrear.Bueno no me alargo mas pongo el enlace del youtuber.
Saludos
 
Última edición:
Buenas noches amigos de Foros de electronica, si me estoy metiendo en un tema que ya se a tocado en esta pagina, por favor me disculpan y a la vez ruego que me deriven a ese tema, es que no se la verdad con que nombre encontrar el problema que quiero solucionar.

Estoy programando en pic basic pro y quiero darle RUN a un programa, que anteriormente eh configurado dos variables con tiempos diferentes, como por ejemplo:

tiempo 1 = 5min 10 seg
tiempo 2 = 10 min 20seg

y cuando le doy RUN, los tiempos empiezan a descernder, y cuando el tiempo1 llega a 0, el tiempo 2 continua hasta llegar a cero tambien.

eh hecho una pruebas y lo que me pasa es que cuando eñ primer timpo llega a cero el segundo tiempo sigue bajando y el primer tiempo baja a 59:59 y no se posiciona en 0.

espero no molestar con mi pregunta tonta.

gracias
 
Ya encontré la solución de el por que decrementa de 0 a 55,54,53 y no como debe ser: 0,59,58,57,:
es en una comparación :
minut=minut-1
if minut = 255 then mint = 59
en el 255 esta la clave. Gracias.
Ahora estoy en cómo hacer para que el primer tiempo cuando llega a cero se quede estático y el otro tiempo 2 Llegue hasta cero también.

Pude avanzar, pero no logro detener en cero el primer tiempo, donde estará mi error verdad?. Allí dejo el programa pbp e isis esquema. Gracias
 

Adjuntos

Te adjunto un ejemplo, pero sólo con 4 CD4094. Ya posteriormente lo podrás expandir.

Nota: Por ser simulación, no usé resistencias para los displays.
En el ejemplo que envias, me esta dando problemas al momento de trasladar tu ejemplo a mi pic 18f2550.

Sobre todo por esta línea en negrita.

Display:
x Var Byte
Index Var Byte
Numero Var Byte

For x = 0 To 3
Index = R:LOL:ata[x] -48 ; Convertir el dato a número.
; Obtener el número correspondiente.
LookUp Index,[63,6,91,79,102,109,124,7,127,103], Numero
; Enviar cada número a los registros de desplazamiento
ShiftOut pin_Data, pin_Clock, MSBFIRST, [Numero]
Next x
 

D@rkbytes

Moderador
No mencionas qué problema, pero supongo que todo se debe a las configuraciones del PIC18F2550.
Este PIC tiene algunos registros especiales que sin los conocimientos adecuados el programa no funcionará correctamente.
18F2550 y 4 CD4094.jpg
Adjunto el mismo programa pero modificado para el PIC18F2550 (FOsc = INTOSC @ 8 MHz.)
 

Adjuntos

torres.electronico

Well-known-Alfil
Hola, como andan? Tengo una consulta... Estoy haciendo unos calculos de frecuencia respiratoria y me estan fallando las pocas matematicas basica que me permite PBP...
La formula original es:

Enriquecido (Código BB):
;ie=Inhalacion y Exhalacion
;delay_i_e = retardo de inhalacion y exhalacion
;delay_pausa=Tiempo muerto entre periodo de Inhalacion y Exhalacion

periodo = 600/frecuencia   ; 10 minimo - 30 maximo
i_e = periodo *0,6   
delay_i_e=i_e * 1000/100 ; me entrega el valor en milisegundos
pausa=periodo *0, 4           
delay_pausa=pausa * 1000 / 100  ; me entrega el valor en milisegundos
Como no puedo trabajar directamente con esas lineas, opere multiplicando por 10 y luego dividiendo de esta forma:

Enriquecido (Código BB):
;ie=Inhalacion y Exhalacion
;delay_i_e = retardo de inhalacion y exhalacion
;delay_pausa=Tiempo muerto entre periodo de Inhalacion y Exhalacion

periodo = 600/frecuencia   ; 10 minimo - 30 maximo
i_e = periodo *6   
delay_i_e=i_e * 10000/1000 ; me entrega el valor en milisegundos
pausa=periodo *4           
delay_pausa=pausa * 10000 / 1000  ; me entrega el valor en milisegundos
El tema esta en que no me da un resultado estable para hacer los tiempos de los periodos... esta desbordando? Alguien ve el error aqui? se les ocurre aguna manera de hacerlo.
 

Temas similares


Arriba