From: Leandro Lucarella Date: Wed, 28 Sep 2005 03:17:12 +0000 (+0000) Subject: Agrego programa de prueba que muestra una matriz de 8x8 leds (conectados al X-Git-Tag: 0.1-recibe-matriz-raw-por-udp~68 X-Git-Url: https://git.llucax.com/z.facultad/66.09/etherled.git/commitdiff_plain/eb00de6c65935a21dcac24a2d7ca8cd31541e488?ds=sidebyside Agrego programa de prueba que muestra una matriz de 8x8 leds (conectados al puerto 0) barriendola tipo gnuine perception. La parte de mostrar la matriz no debería ser más que esto. --- diff --git a/pruebas/asx8051/gnuine/Makefile b/pruebas/asx8051/gnuine/Makefile new file mode 100644 index 0000000..1d221c1 --- /dev/null +++ b/pruebas/asx8051/gnuine/Makefile @@ -0,0 +1,14 @@ + +all: + @asx8051 -los gnuine.asm + @aslink -f gnuine.lnk + @packihx gnuine.ihx > gnuine.hex + +cleantmp: + @rm -f *.sym *.rel *.map *.ihx *.lst + +clean: cleantmp + @rm -f *.hex + +.PHONY: clean cleantmp + diff --git a/pruebas/asx8051/gnuine/gnuine.asm b/pruebas/asx8051/gnuine/gnuine.asm new file mode 100644 index 0000000..e8fcfb5 --- /dev/null +++ b/pruebas/asx8051/gnuine/gnuine.asm @@ -0,0 +1,109 @@ +; vim: set filetype=asm51 : + +; Fragmento del proyecto que lee la matriz de 8x8 y la muestra a intervalos +; columna por columna. + + + ; Constantes + LEDS = p0 ; el led de arriba es el más significativo + MAT_LEN = 0x30 ; tamaño de la matriz (en columnas) + MAT_COL = 0x31 ; columna mostrándose actualmente + MATRIZ = 0x32 ; primera columna de la matriz + INTERVAL= 0 ; 65535 useg = 65 mseg = 0.06 seg ~= 15 fps + + + ; Área de inicio (boot) + .area BOOT (ABS) + .org 0x0000 + ljmp init + ; Vector de interrupción de Timer2 + .org 0x002B + clr tf2 ; Limpia flag de interrupción + ljmp timer2handler ; Salta al manejador de interrupción + + + ; Área de datos por default + .area DEFAULTS +MAT_LEN_D: ; tamaño de la matriz por default + .db #8 ; 8x8 por default +MAT_D: ; matriz por default + ; bit 76543210 + .db #0b01000000 ; columna 0 + .db #0b00100000 ; columna 1 + .db #0b00010000 ; columna 2 + .db #0b00001000 ; columna 3 + .db #0b00000100 ; columna 4 + .db #0b00000010 ; columna 5 + .db #0b00000100 ; columna 6 + .db #0b00001000 ; columna 7 + ; + ; bit columna + ; 7 6 5 4 3 2 1 0 + ; 7 . . . . . . . . + ; 6 . . . . . . . o + ; 5 . . . . . . o . + ; 4 . . . . . o . . + ; 3 o . . . o . . . + ; 2 . o . o . . . . + ; 1 . . o . . . . . + ; 0 . . . . . . . . + ; + ; ---------------> + ; dirección de barrido + + + ; Área del hilo principal del programa + .area MAIN +init: +;al gas mov LEDS, #0 ; Apaga todos los leds + ; Carga tamaño de la matriz default en la memoria + mov dptr, #MAT_LEN_D +;al gas clr a + movc a, @a + dptr + mov MAT_LEN, a + + ; Carga la matriz default en la memoria + mov dptr, #MAT_D ; Dirección de última columna default + mov MAT_COL, MAT_LEN ; Uso MAT_COL temporalmente como counter +loop$: + djnz MAT_COL, columna0$ + mov a, MAT_COL ; Índice de la matriz default + movc a, @a + dptr ; Obtengo columna + mov r2, a ; Pongo columna en registro temporal + mov a, MAT_COL ; Índice de la matriz en memoria + add a, #MATRIZ ; Dirección de memoria de la columna + mov r0, a ; Uso r0 de puntero + mov a, r2 ; Pongo columna a cargar en acumulador + mov @r0, a ; *r0 = columna de la matriz default + sjmp loop$ ; Volvemos a empezar +columna0$: + clr a ; Falta posición 0 + movc a, @a + dptr ; Obtengo columna 0 + mov MATRIZ, a ; La pongo en la matriz en memoria + mov MAT_COL, MAT_LEN ; Cargo columna actual + + ; Setup del timer e interrupciones + mov rcap2l, #INTERVAL ; high byte del intervalo + mov ie, #0b10100000 ; Habilita interrupción timer 2 + mov t2con, #0b00000100 ; Setup Timer 2 (auto-reload y start) + sjmp #. ; Paveamos forever + + + ; Área del handler del timer2 (dibuja columna actual) + .area T2ISR +timer2handler: + push ar0 ; Guardo r0 que voy a usar + mov a, MAT_COL + jnz sigue$ ; if (MAT_COL == 0) + mov MAT_COL, MAT_LEN ; MAT_COL = MAT_LEN; +sigue$: + dec MAT_COL ; MAT_COL--; + mov a, MAT_COL ; r0 = MATRIZ + MAT_COL; + add a, #MATRIZ + mov r0, a + mov LEDS, @r0 ; LEDS = *r0; + pop ar0 ; Devuelvo r0 + reti + + diff --git a/pruebas/asx8051/gnuine/gnuine.lnk b/pruebas/asx8051/gnuine/gnuine.lnk new file mode 100644 index 0000000..30e64ae --- /dev/null +++ b/pruebas/asx8051/gnuine/gnuine.lnk @@ -0,0 +1,3 @@ +gnuine.rel +-im +-b MAIN = 0x30 diff --git a/pruebas/sdcc/gnuine.c b/pruebas/sdcc/gnuine.c new file mode 100644 index 0000000..40ab710 --- /dev/null +++ b/pruebas/sdcc/gnuine.c @@ -0,0 +1,31 @@ +/* + * Pruebas para ver como hace el assembler para traducir algunas cosas. + */ + +/* typedef unsigned char* ptr_t; + +ptr_t leds = 0x80; /* p0 * / +ptr_t matriz = 0x32; +ptr_t matriz_len = 0x32; /* tamaño de la matriz en cantidad de columnas * / +ptr_t matriz_curr_col = 0x31; /* columna actual a mostrar * / + +*/ + +const unsigned char leds_default = 0x1f; +const unsigned char matriz_default[8] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 }; +unsigned char leds; +unsigned char matriz[12]; +unsigned char matriz_len; +unsigned char matriz_col; + +void mostrar_leds() +{ + unsigned char i; + for (i = 0; i < leds_default; ++i) + matriz[i] = matriz_default[i]; + leds = leds_default; + if (!matriz_col) matriz_col = matriz_len; + --matriz_col; + leds = matriz[matriz_col]; +} +