desktop

Problema en mi codigo con CCS

Hola gente, realice un código que no funciona de acuerdo a lo esperado y no puedo desifrar porque no anda. El código es parte de una interrupcion del timer1 por desborde, el pic que uso es el 16F628. El problema está en que cuando ingresa a la tabla para buscar el valor, salta a cualquier otro lugra, que inclusive no esta en la tabla misma.
El valor con el que ingresa a buscar en la tabla al comienza el contador es FF, y a medida que ingresa cada vez a la rutina decrementa en uno su valor, de manera que tendría que recorrer toda la tabla en 255 pasadas. Les dejo el código para que lo vean, a ver si encuentran algo extraño. Por cierto esta parte del código esta escrita en asambler para poder optimizar el código ya que esta parte debe ser lo mas rápida posible, y en C esto tarda más tiempo de lo debido. Desde ya muchas gracias.

Código:
#int_timer1
Tim1 ()
{
#asm
         bcf PIR1,0
         movf contador,0
         call tabla
         movwf portb
         decf contador,1
         movlw 0x00
         movwf TMR1L 
         movlw 0xFF
         movwf TMR1H
         return
tabla:   ADDWF PCL,1
         RETLW 0
         RETLW 1
         RETLW 2
         RETLW 3
         RETLW 4
         RETLW 5
         RETLW 6
         RETLW 7
         RETLW 8
         RETLW 9
         RETLW 10
         RETLW 11
         RETLW 12
         RETLW 13
         RETLW 14
         RETLW 15
         RETLW 16
         RETLW 17
         RETLW 18
         RETLW 19
         RETLW 20
         RETLW 21
         RETLW 22
         RETLW 23
         RETLW 24
         RETLW 25
         RETLW 26
         RETLW 27
         RETLW 28
         RETLW 29
         RETLW 30
         RETLW 31
         RETLW 32
         RETLW 33
         RETLW 34
         RETLW 35
         RETLW 36
         RETLW 37
         RETLW 38
         RETLW 39
         RETLW 40
         RETLW 41
         RETLW 42
         RETLW 43
         RETLW 44
         RETLW 45
         RETLW 46
         RETLW 47
         RETLW 48
         RETLW 49
         RETLW 50
         RETLW 51
         RETLW 52
         RETLW 53
         RETLW 54
         RETLW 55
         RETLW 56
         RETLW 57
         RETLW 58
         RETLW 59
         RETLW 60
         RETLW 61
         RETLW 62
         RETLW 63//! Hasta acá una onda
         RETLW 64
         RETLW 65
         RETLW 66
         RETLW 67
         RETLW 68
         RETLW 69
         RETLW 70
         RETLW 71
         RETLW 72
         RETLW 73
         RETLW 74
         RETLW 75
         RETLW 76
         RETLW 77
         RETLW 78
         RETLW 79
         RETLW 80
         RETLW 81
         RETLW 82
         RETLW 83
         RETLW 84
         RETLW 85
         RETLW 86
         RETLW 87
         RETLW 88
         RETLW 89
         RETLW 90
         RETLW 91
         RETLW 92
         RETLW 93
         RETLW 94
         RETLW 95
         RETLW 96
         RETLW 97
         RETLW 98
         RETLW 99
         RETLW 100
         RETLW 101
         RETLW 102
         RETLW 103
         RETLW 104
         RETLW 105
         RETLW 106
         RETLW 107
         RETLW 108
         RETLW 109
         RETLW 110
         RETLW 111
         RETLW 112
         RETLW 113
         RETLW 114
         RETLW 115
         RETLW 116
         RETLW 117
         RETLW 118
         RETLW 119
         RETLW 120
         RETLW 121
         RETLW 122
         RETLW 123
         RETLW 124
         RETLW 125
         RETLW 126
         RETLW 127//!Hasta acá otra onda
         RETLW 128
         RETLW 129
         RETLW 130
         RETLW 131
         RETLW 132
         RETLW 133
         RETLW 134
         RETLW 135
         RETLW 136
         RETLW 137
         RETLW 138
         RETLW 139
         RETLW 140
         RETLW 141
         RETLW 142
         RETLW 143
         RETLW 144
         RETLW 145
         RETLW 146
         RETLW 147
         RETLW 148
         RETLW 149
         RETLW 150
         RETLW 151
         RETLW 152
         RETLW 153
         RETLW 154
         RETLW 155
         RETLW 156
         RETLW 157
         RETLW 158
         RETLW 159
         RETLW 160
         RETLW 161
         RETLW 162
         RETLW 163
         RETLW 164
         RETLW 165
         RETLW 166
         RETLW 167
         RETLW 168
         RETLW 169
         RETLW 170
         RETLW 171
         RETLW 172
         RETLW 173
         RETLW 174
         RETLW 175
         RETLW 176
         RETLW 177
         RETLW 178
         RETLW 179
         RETLW 180
         RETLW 181
         RETLW 182
         RETLW 183
         RETLW 184
         RETLW 185
         RETLW 186
         RETLW 187
         RETLW 188
         RETLW 189
         RETLW 190
         RETLW 191
         RETLW 192
         RETLW 193
         RETLW 194
         RETLW 195//!Hasta acá otra de las ondas
         RETLW 196
         RETLW 197
         RETLW 198
         RETLW 199
         RETLW 200
         RETLW 201
         RETLW 202
         RETLW 203
         RETLW 204
         RETLW 205
         RETLW 206
         RETLW 207
         RETLW 208
         RETLW 209
         RETLW 210
         RETLW 211
         RETLW 212
         RETLW 213
         RETLW 214
         RETLW 215
         RETLW 216
         RETLW 217
         RETLW 218
         RETLW 219
         RETLW 220
         RETLW 221
         RETLW 222
         RETLW 223
         RETLW 224
         RETLW 225
         RETLW 226
         RETLW 227
         RETLW 228
         RETLW 229
         RETLW 230
         RETLW 231
         RETLW 232
         RETLW 233
         RETLW 234
         RETLW 235
         RETLW 236
         RETLW 237
         RETLW 238
         RETLW 239
         RETLW 240
         RETLW 241
         RETLW 242
         RETLW 243
         RETLW 244
         RETLW 245
         RETLW 246
         RETLW 247
         RETLW 248
         RETLW 249
         RETLW 250
         RETLW 251
         RETLW 252
         RETLW 253
         RETLW 254
         RETLW 255//!Hasta acá la última onda
#endasm
}
 
Si olvide aclararlo, el registro PIR1 esta declarado, al igual que el registro PCL, dado que sino no podria siquiera compilar.

---------- Actualizado después de 3 horas ----------

Bueno, he realizado otras pruebas mas y pude darme cuenta de que al momento de ejecutarse la instrucción ADDWF PCL,1 como mi variable contador tiene el valor 255, sumado al valor del PCL produce un valor mayor a 8 bits, por lo que hay un carry, lo que hace es descartar el carry e ir a la dirección que le quedó tomando los 8 bits, que por su puesto no es la dirección correcta y por eso salta a cualquier lado.
Ahora mi pregunta es, ¿Entonces no puedo colocar un valor muy grande?
Pues no tiene lógica, ya que dicho valor estaría condicionado por el valor de la posición de memoria en la que se encuentre, lo cual no es lógico para nada.
Bueno espero alguien pueda aclararme la duda. Gracias.
 
Última edición por un moderador:
Hola.
Para saltos manuales mayores a 255 que es lo máximo que soporta el PCL es necesario modificar el PCLATH, también manualmente; es decir ambos... y te puede facilitar, intenta que tu código esté dentro de un bloque de memoria (bloques de 255) y no en cualquier parte... modifica con ORG.
Saludos.
 
El PCL ya tiene un valor apuntando a cierta dirección... vector 0x04 de interrupción, el PCL ya es 4 y luego avanza unas 3 instrucciones... ya son 7... como se supone que está dentro de un bloque de 255... se puede hacer una tabla de 248, ha pero son menos ya que con Call, el PCL (tabla: ADDWF PCL,1) ahora tiene un valor de 14... aprox.

Dime desde donde salta a cualquier parte??... No se pero puede que la rutina de interrupción #int_timer1, el CCS lo hubique en otra dirección más allá de vector usual y al manipular solo el PCL, la suma provoque desborde. Es decir si por ejemplo PCL es 100, se suma 200, el valor en PCL viene a ser 44... aquí es necesario modificar el bit 0 del PCLATH.

Revisa el archivo *.lst para saber las direcciónes.
 
Última edición:
Atrás
Arriba