Autor Tema: PROBLEMA al leer 74HC507 SHIFT-REGISTER BASCOM  (Leído 3025 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado kamisama

  • PIC16
  • ***
  • Mensajes: 151
PROBLEMA al leer 74HC507 SHIFT-REGISTER BASCOM
« en: 22 de Marzo de 2013, 23:17:05 »
Hola, estimados

Recien me puse (algo tarde) a ver un poco el tema de la programacion de los AVR, como era de esperarse tenia ganas de empezar con el GCC pero escribir tantas cosas se volvia lento y agarre viaje con el bascom.

Mi primer emprendimiento tenia que ser usando chatarra (una placa con un ATMEGA48) y dos 74hc597 para leer las entradas.
Cuando codifique las primeras lineas lo puse a simular en el ISIS y funciono. Pero en la practica cada octeto salia desplazado y en mi caso los bytes de la word invertidos a como yo los queria leer. Rehice varias veces el codigo, hasta que me decidi y use la funcion integrada pero el resultado fue el mismo.

Ahora para paliar este problema(porque me re-aburrio y saco caspa no encontrar una solucion logica), use el siguiente codigo

Sub Getinputs(wsto As Word , Byval I As Byte)
        Set Platch : Waitms 2 : Reset Platch
        Reset Pload : Waitms 2 : Set Pload
        Shiftin Pdata , Pclock , Wsto , 2 , I
        A = Low(wsto) : B = High(wsto)
        C = A.7 : Shift A , Left , 1 : A.0 = C              'No se sabe porque se necesita este arregl
        C = B.7 : Shift B , Left , 1 : B.0 = C              'El fallo se da en ambos sentidos
        Wsto = A : Shift Wsto , Left , 8 : Wsto = Wsto + B  'Tanto al usar la funcion como codigo propio
End Sub

Con este codigo funcionan todos los bits correctamente, pero son muchas vueltas. Pense que podia haber algun problema con el circuito pero me paso lo mismo con las salidas solo que desplazado para el otro lado. Probe con MSB first/LSB, flancos de clock, etc... con similar resultado. Son 2 HC597 encadenados con Q->DS

En otro orden de cosas este encadenamiento no funciona en el ISIS y probe con los dos modelos de IC que tenia.

Seria interesante saber porque me sucede esto, en los ejemplos de la web todo es sencillo y no se necesita rotar.
Aqui esta el codigo tambien que me veo forzado a usar para las salidas, sino hace disparates.

Sub Setoutputs(wsto As Word , Byval I As Byte)
        A = Low(wsto) : B = High(wsto)
        C = B.0 : Shift B , Right , 1 : B.7 = C
        C = A.0 : Shift A , Right , 1 : A.7 = C
        Wsto = A : Shift Wsto , Left , 8 : Wsto = Wsto + B
        Set Oreset : Reset Oload : Waitms 2
        Shiftout Odata , Oclock , Wsto , 2 , I
        Reset Olatch : Waitms 2 : Set Olatch
End Sub

Saludos y gracias por comentar. :P



Desconectado stk500

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 4923
Re: PROBLEMA al leer 74HC507 SHIFT-REGISTER BASCOM
« Respuesta #1 en: 23 de Marzo de 2013, 13:20:24 »
Tal como te lo plantea no lo comprenderia nadie, asi que te aconsejo que ponga el codigo completo y el circuito y si puedo lo pruebo.

Desconectado kamisama

  • PIC16
  • ***
  • Mensajes: 151
Re: PROBLEMA al leer 74HC507 SHIFT-REGISTER BASCOM
« Respuesta #2 en: 30 de Marzo de 2013, 20:15:09 »
Código: [Seleccionar]
       
'--------------------------------------------------------------
'                        mega48.bas
'                      mega48 sample file
'                  (c) 1995-2005, MCS Electronics
'--------------------------------------------------------------
$regfile = "m48def.dat"
$crystal = 8000000
$baud = 9600
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

'The following info was inserted by the programmer.
'Press the Write PRG button and it will insert the current Lock,and Fusebit settings
'The options are DIVIDE by 8 : disabled, External osc. selected
'$prog &HFF , &HEF , &HDF , &HFF                             ' generated. Take care that the chip supports all fuse bytes.
'It is advised to use the $prog only once to set the bits.
'So remark it after the chip has been programmed the first time

'Config Watchdog = 4096 ' or even 8192 is supported on the M48

'NOTE :  when you want to use the internal osc, do not enable the internal 8 divider
'The following line is used for the default, 8 Mhz osc with 8-divider disabled.
'You will benefit from the calibrated OSCCAL value then.
'$PROG &HFF,&HE2,&HDF,&HFF' generated. Take care that the chip supports all fuse bytes.


Platch Alias Portc.3
Pload Alias Portc.4
Pclock Alias Portc.2
Pdata Alias Pinc.0
Preset Alias Portc.1

Oreset Alias Portd.3
Oclock Alias Portd.4
Olatch Alias Portd.5
Oload Alias Portd.6
Odata Alias Portd.7



Ddrc = &B1111_1110                                          'Ceros=Entradas, 1=Salidas, bastante estupido
Ddrd = &B1111_1110

Declare Sub Getinputs(wsto As Word , Byval I As Byte)

Dim W As Word
Dim Z As Byte
Dim Y As Byte
Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim J As Byte
Dim H As Byte


Meme:
Do
  Set Preset
  Portb = Not Portb
  Print "Hola ATMega48 ultraPoronga " ; Osccal ; " CHAR:" ; Inkey()
  Call Getinputs(w , 16)
  Print Bin(high(w)) ; "-" ; Bin(low(w))
  Waitms 2500
Loop Until Inkey() = 27                                     '   CON EL ARREGLO JAR-JAR NO FUNCIONA IGUAL QUE EN EL Simulador! ojo al piojo! hay que rotar 1bit y los bytes
'Do
'   Print "> La Placa cago fuego <"                        '   Print "ADC Ch0 " ; : W = Getadc(0 , 0) : Print W
'        Set Platch : Waitms 20 : Reset Platch               '   Print "ADC Ch1 " ; Getadc(1) ; " Byte o Ascii:" ; Z
'        Reset Pload : Waitms 20 : Set Pload
'        Reset B
'        For A = 0 To 15
'            W.a = Not Pdata
'            Set Pclock : Waitms 20 : Reset Pclock
'        Next
'        A = Low(w) : B = High(w) : C = B.7 : Shift B , Left , 1 : B.0 = C : C = A.7 : Shift A , Left , 1 : A.0 = C
'        Print Bin(a) ; "-" ; Bin(b)
'        Waitms 200
'        '-------------------------------------------------------------------------------------------------------------
'        'SHIFTOUT pin , pclock , var , option [, bits , delay ]
'        Set Oreset
'        Waitms 4000
'        For Y = 0 To 15
'                Reset Olatch
'                W = 2 ^ Y
'                Print "W=" ; Bin(w)
'                C = W.15
'                Shift W , Left , 1
'                W.0 = C
'                Swap W
'                Shiftout Odata , Oclock , W , 2 , 16
'                Set Olatch
'                Waitms 1000
'        Next
'        Reset Oreset

'        '-------------------------------------------------------------------------------------------------------------
'        Waitms 100

'Loop Until Inkey() = 27
'Goto Meme
Sub Getinputs(wsto As Word , Byval I As Byte)
    Set Platch : Waitms 2 : Reset Platch
    Reset Pload : Waitms 2 : Set Pload
    Reset B
    Shiftin Pdata , Pclock , W , 2 , I : A = Low(w) : B = High(w)
    C = A.7 : Shift A , Left , 1 : A.0 = C                  'No se sabe porque se necesita este arregl
    C = B.7 : Shift B , Left , 1 : B.0 = C                  'El fallo se da en ambos sentidos
    W = A : Shift W , Left , 8 : W = W + B                  'Tanto al usar la funcion como codigo propio
End Sub


'        Set Platch : Waitms 20 : Reset Platch               '   Print "ADC Ch1 " ; Getadc(1) ; " Byte o Ascii:" ; Z
'        Reset Pload : Waitms 20 : Set Pload
'        Reset B
'        For A = 0 To 15
'            W.a = Not Pdata
'            Set Pclock : Waitms 20 : Reset Pclock
'        Next
'        A = Low(w) : B = High(w) : C = B.7 : Shift B , Left , 1 : B.0 = C : C = A.7 : Shift A , Left , 1 : A.0 = C
'        Print Bin(a) ; "-" ; Bin(b)



End

Esta es una de las pruebas por eso esta comentado ya que fue el primer contacto con el compilador, programador y placa.

Al final, quedo mas o menos con esa idea a pesar de varias pruebas... el ISIS no puede simular el 2do chip de entrada asi que programe cientos de veces el MCU hasta que me quede sin espacio en el bendito mcu.

Saludos y gracias.


 

anything