# Del PIC al AVR



## Meta (Feb 24, 2008)

Con el PIC 16F84A quiero hacer el mismo programa en ensamblador para el AVR AT90S1200, dice que estos dos microcontroladores serían los más parecidos.

Os dejo un código del 16F84A haber si hay alguien que sepa programarlo en *asm* para el AT90S1200. (También pueden hacerlo con otro lenguaje, peo preferiría en asm, gracias).

Tengo ganas de aprender los también los AVR, pero hay escasa información sobre ello y en Inglés.


```
;********************************** Indexado_01.asm *************************************
;
;	===================================================================
;	  Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;	  E. Palacios, F. Remiro y L. López.		[url]www.pic16f84a.com[/url]
; 	  Editorial Ra-Ma.  [url]www.ra-ma.es[/url]
;	===================================================================
;
; Implementar una tabla de la verdad mediante el manejo de tablas grabadas en ROM.
; Por ejemplo, la tabla será de 3 entradas y 6 salidas tal como la siguiente:
; 
; 		C  B     A  |   S5   S4   S3   S2   S1   S0
; 		-----------|---------------------------
; 		0   0   0   |   0    0    1    0    1    0	; (Configuración 0).
; 		0   0   1   |   0    0    1    0    0    1	; (Configuración 1).
; 		0   1   0   |   1    0    0    0    1    1	; (Configuración 2).
; 		0   1   1   |   0    0    1    1    1    1	; (Configuración 3).
; 		1   0   0   |   1    0    0    0    0    0	; (Configuración 4).
; 		1   0   1   |   0    0    0    1    1    1	; (Configuración 5).
; 		1   1   0   |   0    1    0    1    1    1	; (Configuración 6).
; 		1   1   1   |   1    1    1    1    1    1	; (Configuración 7).
;
; Las entradas C, B, A se conectarán a las líneas del puerto A: RA2 (C), RA1 (B) y RA0 (A).
; Las salidas se obtienen en el puerto B:
; RB5 (S5), RB4 (S4), RB3 (S3), RB2 (S2), RB1 (S1) y RB0 (S0).
;
; ZONA DE DATOS **********************************************************************

	LIST		P=16F84A
	INCLUDE		<P16F84A.INC>
	__CONFIG	_CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

; ZONA DE CÓDIGOS ********************************************************************

	ORG 	0					; El programa comienza en la dirección 0.
Inicio
	bsf		STATUS,RP0			; Acceso al Banco 1.
	clrf	TRISB				; Las líneas del Puerto B se configuran como salida.
	movlw	b'00011111'			; Las 5 líneas del Puerto A se configuran como entrada.
	movwf	TRISA
	bcf		STATUS,RP0			; Acceso al Banco 0.
Principal
	movf	PORTA,W				; Lee el valor de las variables de entrada.
	andlw	b'00000111'			; Se queda con los tres bits de entrada.
	addwf	PCL,F				; Salta a la configuración adecuada.
Tabla
	goto	Configuracion0
	goto	Configuracion1
	goto	Configuracion2
	goto	Configuracion3
	goto	Configuracion4
	goto	Configuracion5
	goto	Configuracion6
	goto	Configuracion7
Configuracion0
	movlw 	b'00001010'			; (Configuración 0).
	goto	ActivaSalida
Configuracion1
	movlw 	b'00001001'			; (Configuración 1).
	goto	ActivaSalida
Configuracion2
	movlw 	b'00100011'			; (Configuración 2).
	goto	ActivaSalida
Configuracion3
	movlw 	b'00001111'			; (Configuración 3).
	goto	ActivaSalida
Configuracion4
	movlw 	b'00100000'			; (Configuración 4).
	goto	ActivaSalida
Configuracion5
	movlw 	b'00000111'			; (Configuración 5).
	goto	ActivaSalida
Configuracion6
	movlw 	b'00010111'			; (Configuración 6).
	goto	ActivaSalida
Configuracion7
	movlw 	b'00111111'			; (Configuración 7).
ActivaSalida
	movwf	PORTB				; Visualiza por el puerto de salida.
	goto 	Principal

	END
	
;	===================================================================
;	  Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;	  E. Palacios, F. Remiro y L. López.		[url]www.pic16f84a.com[/url]
; 	  Editorial Ra-Ma.  [url]www.ra-ma.es[/url]
;	===================================================================
```


----------



## Meta (Feb 26, 2008)

*¿Nadie tiene idea del AVR de Atmel en ASM?*

Con este tema quería saber si hay gente que sepa defenderse sobre AVR, o al menos esperar que aparezca alguno.


----------



## eidtech (Feb 27, 2008)

http://mx.geocities.com/migsantiagov/avr/index.htm


----------



## Meta (Feb 27, 2008)

eidtech dijo:
			
		

> http://mx.geocities.com/migsantiagov/avr/index.htm



Muchas gracias, cuanto más información tengamos, mejor que mejor.


----------



## avr8b (Mar 15, 2008)

Hola, yo te recomiendo uses el Attiny2313 que es mejor ademas el 1200 ya esta obsoleto, con el 2313 puedes utilizar tablas muy facil con la instruccion LPM, te mando este pequeño programa para ver si te sirve. 


.include "tn2313def.inc"

.def	temp	=r16			; definicion de registro temporal 


start:	ldi	temp,low(RAMEND)     
	out	SPL,temp		; inicializas el stack pointer 


	ldi	temp,$ff                      ;carga FF al reg. temp
	out	PORTB,temp		; todos los pines del PORTB a uno
	out	DDRB,temp	; sirve para indicar que el  port B esta configura como salida


	ldi	ZH,high(2*tabla)	; se direcciona con el registro Z la tabla
	ldi	ZL,low(2*tabla)	; 

loadbyte:
	lpm				; se carga el valor de tabla en r0
	tst	r0			; r0=0
	breq	quit			; si es 0 fin de tabla brinca a quit

	out	PORTB,r0		; saca por el PORTB el valor de r0
	rcall	one_sec_delay		; llamada a un retardo

	adiw	ZL,1			; incrementa el apuntador de tabla
	rjmp	loadbyte


quit:	rjmp quit


one_sec_delay:
	ldi	r20, 20
	ldi	r21, 255
	ldi	r22, 255
delay:	
	dec	r22
	brne	delay
	dec	r21
	brne	delay
	dec	r20
	brne	delay
	ret


tabla:
.db 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0


----------



## macraig (Mar 17, 2008)

Programar en asm un avr solo tiene sentido cuando se trata de optimizar secciones de codigo. Un AVR es un micro disenado para trabajar eficientemente con lenguaje C compilado. Te recomiendo que empiezes a usar C con este tipo de micros, la programacion se facilita mucho, y hay muchas librerias de codigo disponibles. Aqui te dejo unos enlaces para empezar...

Compilador en C para AVR
http://winavr.sourceforge.net (funciona con el AVR Studio 4 de atmel)

Guia del principiante
http://www.avrfreaks.net/index.php?module=FreaksArticles&func=downloadArticle&id=22
http://www.avrbeginners.net/
http://www.salvitti.it/geo/sequencer/dev_tools/tutorial/GNU_C_Tutorial.html

Foro sobre AVR (lo que necesitas y tambien lo que no necesitas saber )
http://www.avrfreaks.net


----------



## avr8b (Mar 18, 2008)

Hola macraig,

Tu que opinas de lenguaje Basic para el AVR?, por ejemplo he escuchado hablar mucho del Bascom avr.





Saludos...


----------



## macraig (Mar 18, 2008)

No soy muy fanatico del basic... Sirve para pequenas cosas, algo sucio y rapido. Pero como no es estructurado, dificulta el hacer tareas un poco mas complicadas. Es mi opinion.

C puede parecer dificil, pero en realidad no lo es. Es sencillo y te da todo el control sobre el microcontrolador. Incluso, dentro del programa en C puedes escribir rutinas en assembler en las situaciones  en las que necesites optimizar alguna seccion de codigo.

Existen numerosas librerias, que por ejemplo, van desde el manejo de un LCD, hasta la lectura de memorias SD, sistemas operativos en tiempo real, procesamiento de senales, lectura de dispositivos como Discos duros, manejo de archivos en FAT, etc... A tu disposicion si le dedicas algo de tiempo a aprender las sutilezas del lenguaje.

Sin ir mas lejos, uno de los primeros programas en C q hice para un AVR, podia leer un sensor de temperatura con el conversor AD incluido, y mostrar el resultado en un LCD y en un terminal adosado al puerto serie. Procesaba los datos del adc con aritmetica de punto flotante y los mostraba en el terminal.

Y algo muy importante, tanto el compilador como el editor y las librerias los puedes conseguir completamente libres y gratuitos en internet, y con eso puedes hacer lo que enumere arriba y mas... Mientras la version de Bascom sin restricciones sale por algo asi como 79 Euros. Yo prefiero gastar ese dinerito en componentes (ICs, micros, resistencias, etc) 

Saludos


----------



## microtronic (Mar 18, 2008)

macraig dijo:
			
		

> No soy muy fanatico del basic... Sirve para pequenas cosas, algo sucio y rapido. Pero como no es estructurado, dificulta el hacer tareas un poco mas complicadas. Es mi opinion.
> 
> C puede parecer dificil, pero en realidad no lo es. Es sencillo y te da todo el control sobre el microcontrolador. Incluso, dentro del programa en C puedes escribir rutinas en assembler en las situaciones  en las que necesites optimizar alguna seccion de codigo.
> 
> ...



amigo si me han dicho tambien que estan hecho para trabajar en c....

q opinas del codevision avr?


----------



## macraig (Mar 18, 2008)

Si puedes pagar los 150 euros por la licencia... Yo prefiero gastar ese dinero en componentes .
Ademas, sinceramente no lo he probado. El avrstudio4 + winavr me parece suficiente por el momento. Si tienes ese dinero, tal vez sea mejor invertirlo en un emulador, o un on-chip debugger como el avr-jtagiceII q cuesta como 200 dolares.

Salu2


----------



## microtronic (Mar 18, 2008)

macraig dijo:
			
		

> Si puedes pagar los 150 euros por la licencia... Yo prefiero gastar ese dinero en componentes .
> Ademas, sinceramente no lo he provado. El avrstudio4 + winavr me parece suficiente por el momento. Si tienes ese dinero, tal vez sea mejor invertirlo en un emulador, o un on-chip debugger como el avr-jtagiceII q cuesta como 200 dolares.
> 
> Salu2



lo consigue por otros metodos 8)  ..pero veo que sabes del tema..lo que quiero a dar entender si se cabe, cual sera el mas potente en librerias,potencia,información en español,facilidad, veo bueno del codevison es su wizard q te facilita en muchas cosas los diseños....estoy iniciando en los micros avr..


----------



## macraig (Mar 18, 2008)

Me gustan las librerias que vienen con avr-gcc (aka winavr) por q son libres, y el codigo esta disponible. Cuando estas aprendiendo a programar, el poder analizar el codigo de otros es una ayuda educativa enorme... Por lo demas, en mi limitada experiencia me he dado cuenta que ningun programa incluye todas las librerias que necesitas, y es mucho mejor aprender desde ya a hacertelas tu mismo ...

La información, lamentablemente, casi toda la realmente interesante esta en ingles. Sabes, otra manera de invertir ese dinero es un cursillo de ingles tecnico, que te servira muchisimo.

Aprender siempre es un poco dificil, desgraciadamente no existe el camino facil... La vida es asi.

Salu2.


----------



## microtronic (Mar 18, 2008)

pues si a veces el camino facil no es el mejor..gracias espero que nos aportes mas de tus conocimineto con estos micros atmel...


----------



## avr8b (Mar 19, 2008)

Yo siempre he programado en asm los AVR, pero ya estoy empezando a estudiar C para programar con este lenguaje los AVR's, la verda si me esta costando trabajo entender C pero hay la llevo.

Pregunte lo de Bascom por que se ve muy sencillo, pero he visto mucho mas aplicaciones en C que en Basic.

Gracias por los comentarios.


----------



## tiopepe123 (Mar 19, 2008)

La ventaja del C es que es estructurado o dicho en modo sencillo, te obliga a trabajar en pequeños subprogramas o funciones.

El gran problema del basic es que terminas metiendo gotos por todos sitios y queda una chapuza.

Lo mas importante del C es la filosofia de programacion, yo ya llevo bastante con el C para pic y realmente facilita la programacion.


----------



## microtronic (Mar 19, 2008)

ojala nuestro amigo macraig pudiera publicar unos pequeños ejemplos para iniciarnos con el winavr y el atmega8....estpy estudiando bastante estos micros y me parcen buenos


----------



## macraig (Mar 21, 2008)

Bueno, q tipo de ejemplos buscas?


----------



## microtronic (Mar 21, 2008)

macraig dijo:
			
		

> Bueno, q tipo de ejemplos buscas?



bueno ejemplitos faciles como siempre secuenciador de luces cosas asi..y si tiene por hay un manual pues no estaria mal..


----------



## macraig (Mar 21, 2008)

Pues un manual, lo tengo en aleman... sorry... (digo q lo tengo, no q lo entiendo  )
Sin embargo, por aca tienes uno en espanol. Esta terriblemente incompleto, y con faltas de ortografia, pero es un punto de partida (lo ire mejorando en cuanto tenga tiempo, pero tampoco esperes maravillas  ).

http://www.ieee.org.ec/~das/doc/gdp.pdf

Las hojas de especificaciones del AVR q uses incluyen ya algo de codigo en c, q te muestra como usar cada modulo del micro.

El resto lo encuentras en internet... Pero lo primero es instalar el entorno de desarrollo, escribir el primer programa en c y programar el primer micro... Luego, el resto se hace mas facil.

Cualquier cosa pregunta por este medio...

Salu2


----------



## torresdelamora (Mar 22, 2008)

creo que puedo hacer uno parecido


----------



## torresdelamora (Mar 22, 2008)

segun yo el codigo que pides va mas o menos asi   

```
.include "1200def.inc"
                .def     gen=r16

                .org    $000	

Inicio: 
                ldi     gen,$ff
                out     DDRB,gen ;el puerto B es salida 
                ldi     gen,$00 
                out     DDRD,gen ;el puerto D es entrada
Principal: 
                in      gen,PIND ; Lee el valor de las variables de entrada
                andi    gen,$07 ; Se queda con los tres bits de entrada. 
                add     PC,gen  ;Salta a la configuración adecuada. 
Tabla:
                rjmp    Configuracion0 
                rjmp    Configuracion1 
                rjmp    Configuracion2 
                rjmp    Configuracion3 
                rjmp    Configuracion4 
                rjmp    Configuracion5 
                rjmp    Configuracion6 
                rjmp    Configuracion7 
Configuracion0:
                ldi      gen,$0A	    ; (Configuración 0). 
                rjmp     ActivaSalida 
Configuracion1: 
                ldi      gen,$09  	    ; (Configuración 1). 
                rjmp     ActivaSalida
Configuracion2: 
                ldi      gen,$23 	    ; (Configuración 2). 
                rjmp     ActivaSalida 
Configuracion3:
                ldi      gen,$0F	    ; (Configuración 3). 
                rjmp     ActivaSalida 
Configuracion4:
                ldi      gen,$20	    ; (Configuración 4). 
                rjmp     ActivaSalida 
Configuracion5:
                ldi      gen,$07	    ; (Configuración 5). 
                rjmp     ActivaSalida 
Configuracion6:
                ldi      gen,$17	    ; (Configuración 6). 
                rjmp     ActivaSalida 
Configuracion7: 
                ldi      gen,$37	    ; (Configuración 7). 

ActivaSalida:

                out     PORTB,gen    ; Visualiza por el puerto de salida. 
                rjmp    Principal
```


----------



## macraig (Mar 23, 2008)

Meta dijo:
			
		

> Con el PIC 16F84A quiero hacer el mismo programa en ensamblador para el AVR AT90S1200, dice que estos dos microcontroladores serían los más parecidos.
> 
> Os dejo un código del 16F84A haber si hay alguien que sepa programarlo en *asm* para el AT90S1200. (También pueden hacerlo con otro lenguaje, peo preferiría en asm, gracias).
> 
> ...



Se q C no te sirve, pero un poco para comparar asm con C, te dejo el mismo codigo en C...  lastimosamente el at90s1200 es un dispositivo ya algo antiguo, q no tiene soporte total en C (se puede, pero con algun truquito). Pero sirve en un AT90S2313 q es el siguiente en la lista...
/*
 * Tabla de verdad	
 * 
 * (c) 2008 DAF
 *
 * $Id$
 */

 /*
  * Tabla de verdad de 3 entradas y 6 salidas.
  *
  * Entradas en: PD0, PD1, PD2
  * Salidas en: PB0, PB1, PB2, PB3, PB4, PB5
  * 
  *  PD2 PD1 PD0 |   PB5  PB4  PB3  PB2  PB1  PB0
  *   -----------|---------------------------
  *  0   0   0   |   0    0    1    0    1    0   ; (Configuración 0)
  *  0   0   1   |   0    0    1    0    0    1   ; (Configuración 1)
  *	 0   1   0   |   1    0    0    0    1    1   ; (Configuración 2)
  *  0   1   1   |   0    0    1    1    1    1   ; (Configuración 3)
  *  1   0   0   |   1    0    0    0    0    0   ; (Configuración 4)
  *  1   0   1   |   0    0    0    1    1    1   ; (Configuración 5)
  *  1   1   0   |   0    1    0    1    1    1   ; (Configuración 6)
  *  1   1   1   |   1    1    1    1    1    1   ; (Configuración 7) 
  *
  */

  // Nota: Este codigo se escribio para AT90s2313, pero funcionara en cualquier
  // micro avr soportado por AVRGCC q disponga de los puertos utilizados

#include <avr/io.h> // Nombres y definiciones

// Tabla de valores.
unsigned char tabla[] = { 0x0A , //001010 (configuracion 0 en hexadecimal)
						0x09 , //001001 (configuracion 1 en hexadecimal) 
						0x23 , //010011 (configuracion 2 en hexadecimal) 
						0x0F , //001111 (configuracion 3 en hexadecimal) 
						0x20 , //001001 (configuracion 4 en hexadecimal) 
						0x07 , //001001 (configuracion 5 en hexadecimal) 
						0x27 , //001001 (configuracion 6 en hexadecimal) 
						0x3F   //001001 (configuracion 7 en hexadecimal) 
					  };
//rutina principal
int main(void)
{
	int entrada; // donde se coloca el dato leido del puerto d.
	// Habilita el PB0-PB5 como salidas. 
	// Puede usarse tambien DDRB |= 0x3F; Mas corto pero menos explicito.
	DDRB |= (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3)|(1<<PB4)|(1<<PB5);

	while(1) //lazo sin fin
	{
		// lee el dato del puerto d y coloca la salida correspondiente.
		// PD & 7 se asegura que solamente los bits PD0-PD3 sean tomados en cuenta.
		entrada = PORTD & 0x07;

		// coloca la salida correspondiente.
		PORTB = tabla[entrada];	
	}
	return 0;
}


----------



## robifaria (Abr 27, 2008)

Es cierto que programar en ensamblador da el máximo control sobre lo que queremos realizar y que jerarquicamente C es el siguiente lenguaje a tener en cuenta si queremos tener el máximo control del micro.
También es cierto que llegar a dominar estos lenguajes lleva mucho mas tiempo de aprendizaje que con el basic.
Es razonable pensar en estas opciones para proyectos de mediana a alta complejidad, pero si queremos hacer proyectos que involucren pantallas LCD, comunicaciones serie, I2C, leer pulsadores, activar relés, por ejemplo el Bascom es altamente aconsejable ya que el tiempo de aprendizaje es mucho menor.
No es cierto que el basic moderno como el de Bascom ( compatible en un 90% con Quick Basic) no es estructurado y que su código es un caos de saltos GOTO.
Es tan estructurado como el programador quiera (flexibilidad que otros lenguajes no tienen), si alguien es mal programador no es culpa del lenguaje.
En Bascom también se puede intercalar con el código basic ,código en lenguaje ensamblador que potencia muchísimo el desarrollo de aplicaciones complejas.
Antes de orientar a alguna persona a que se incline por tal o cual lenguaje de programación es *importante que preguntemos a la persona para que lo va a utilizar y cual es su nivel de conocimientos.*
Muchos aficionados como yo,  lo que deseamos es ver destellar un led o leer la temperatura en una pantalla LCD y queremos desarrollar esto lo mas rápidamente posible.
Es verdad que el código compilado del basic no es tan compacto, pero a nuestro nivel nos da igual usar un ATMEGA8 que un ATMEGA32 o el mismisimo ATMEGA128, no nos dedicamos a producción en serie circuitos, solo tenemos algunas placas para experimentar y nos dá lo mismo que el codigo en vez de 2K ocupe 4K.
Bascom es un lenguaje de alto nivel y es fácil de entender, pocas líneas hacen mucho y es muy fácil modificar algún código de terceros para adaptarlo a nuestra necesidades.
En la página de de MCS encontrareis notas de aplicación para casi todo lo que se nos pueda ocurrir.
Bascom es gratuito para códigos de hasta 4K, suficiente para los pequeños micros de Atmel.
Es verdad, también se consigue por otros medios. Yo lo he comprado, no me pareció caro por la calidad del producto, es mi manera de apoyar y agradecer a su desarrolador por este excelente producto.
Seguiré usando Bascom, me gustaría que otras personas lo prueben y que publiquemos nuestros trabajos.
En estos momentos quiero aprender a programar en ensamblador y en C como curiosidad, no porque encuentre a Bascom deficiente o porque no cumpla mi expectativas, solo por curiosidad.
Mis respetuosos saludos a todos los integrantes del foro.


----------



## Meta (May 11, 2008)

Ahora ya no es aprender el má fácil, sino el más utilizado como el C si quiere hacer grander proyectos.

El ASM si quieres hacer cosas pequñas y entender mejor el PIC:


----------



## neomatrix7776 (Abr 26, 2015)

torresdelamora dijo:


> segun yo el codigo que pides va mas o menos asi
> 
> ```
> .include "1200def.inc"
> ...



saludos, si quisiera hacer una tabla como subrutina, algo asi:

                              CALL                       TABLA
 TABLA
                            ADDWF                   PCL,F
                             DT                        0X01,0X02,0X03,0X04    ; por ejemplo


----------

