viernes, 22 de mayo de 2015

usando printf y scanf en avrgcc con ATmega48

El siguiente codigo hace uso de la libreria usart.h y usart.c que estaban disponibles en el sitio de programacion de microcontroladores AVR de Shawn Johnson Lo interesante de este ejemplo, es el uso de las funciones estandar de C printf y scanf para el envio de cadenas preformateadas a través del puerto serie de este microcontrolador.
A continuación se muestran las fuentes utilizadas para este tipo de comunicacion
/*
 * En las opciones de compilación del linker
 * se deben agregar las siguientes lineas en eclipse
 *
 * -Wl, -u, vfprintf -lprintf_min, -u, vfscanf -lscanf_min -lm
 *
 * En la siguiente ruta
 * Propiedades del proyecto
 *  C/C++ Build
 *   Valores
 *    Toolsettings
 *     AVR C Linker
 *      General

  En codebloacks
Para agregarlas solo da clic derecho en el nombre del proyecto
elige la opcion que dice Properties....
En la ventana que se abre, da clic en el boton Project's Build options...
Te abre una nueva ventana
Da clic en el Tab Linker Setting
y del lado izquierdo encuentras las opciones del linker
quedan de la siguiente manera
-mmcu=atmega48
-Wl,-Map=$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).map,--cref
-u
vfprintf -lprintf_min
-u
vfscanf -lscanf_min -lm
 * */


#include <avr/io.h>
#define F_OSC 1000000UL
#include <util/delay.h>

#include "usart.h"

int main(void)
{
 char name[30];

 usart_init();

 puts("\n\r Enviando datos");
 puts("\n\r Mecatronica\n\r ITST\n\r");

 puts("Como te llamas?:\n\r");
 scanf("%s\n\r", name);

 printf(" Hola %s",name);

 while(1);
}

Librerias

/******************************************************************************
 * FileName:   usart.h
 * Overview:   Macros y prototipos de funciones para el USART0 en modo Asíncrono
 * Processor:  ATmel AVR con USART0
 * Compiler:   AVR IAR C y AVR GCC (WinAVR)
 * Author:     Shawn Johnson. http://www.cursomicros.com.
 *
 * Copyright (C) 2008 - 2013 Shawn Johnson. All rights reserved.
 *
 * License:    Se permiten el uso y la redistribución de este código con 
 *             modificaciones o sin ellas, siempre que se mantengan esta 
 *             licencia y las notas de autor y copyright de arriba.
 *****************************************************************************/

#include <avr/io.h>
#define F_CPU 1000000UL
#include <util/delay.h>
#include <stdio.h>
/* Define la velocidad de transmisión del USART (en bits/segundo), si aún no 
 * ha sido definida.
 */
#ifndef USART_BAUD
#define USART_BAUD  9600UL
#endif

/* Usar kbhit para ver si hay algún dato en el buffer de recepción antes de
 * llamar directamente a la función getchar para evitar esperas innecesarias.
 */
#define  kbhit()     (UCSR0A & (1<,<RXC0))

/* Descomentar el siguiente #define para que la funcion 'getchar' haga eco de
 * los caracteres recibidos.
 */
//#define __GETCHAR_ECHO__

/* Macros para AVR GCC */
#if defined( __GNUC__ )
#ifdef putchar
#undef putchar
#endif
#ifdef getchar
#undef getchar
#endif
#endif

/* Definiciones de funciones */
void usart_init(void);
int putchar(int);
int getchar(void);

/******************************************************************************
 * FileName:   usart.c
 * Overview:   Implementa funciones para el USART0 en modo Asíncrono
 * Processor:  ATmel AVR con USART0
 * Compiler:   AVR IAR C y AVR GCC (WinAVR)
 * Author:     Shawn Johnson. http://www.cursomicros.com.
 *
 * Copyright (C) 2008 - 2013 Shawn Johnson. All rights reserved.
 *
 * License:    Se permiten el uso y la redistribución de este código con 
 *             modificaciones o sin ellas, siempre que se mantengan esta 
 *             licencia y las notas de autor y copyright de arriba.
 *****************************************************************************/

#include "usart.h"

//****************************************************************************
// Inicializa el USART0.
//****************************************************************************
void usart_init(void)
{
    /* Configurar baud rate   */
    UCSR0A |= (1<<U2X0); //modo2
    UBRR0 = F_CPU/(8*USART_BAUD)-1;
    
    /* Configurar modo de operación Asíncrono y formato de frame a
     * 8 bits de datos, 1 bit de stop y sin bit de paridad.  */
    UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);
    
    /* Habilitar módulos Receptor y Transmisor  */
    UCSR0B = (1<<RXEN0)|(1<<TXEN0);

#if defined( __GNUC__ )
    /* Asociar las funciones 'putchar' y 'getchar' con las funciones de entrada
    * y salida (como printf, scanf, etc.) de la librería 'stdio' de AVR-GCC */
    fdevopen((int (*)(char, FILE*))putchar, (int (*)(FILE*))getchar);
#endif
}

//****************************************************************************
// Transmite el byte bajo de 'dato' por el USART
//****************************************************************************
int putchar(int dato)
{
    /* Esperar a que haya espacio en el buffer de transmisión */
    while ((UCSR0A & (1<<,UDRE0)) == 0 );

    /* Colocar dato en el buffer de transmisión */
    UDR0 = dato;
    return dato;
}

//****************************************************************************
// Recibe un byte de dato del USART
//****************************************************************************
int getchar(void)
{
    /* Esperar a que haya al menos un dato en el buffer de recepción */
    while ((UCSR0A & (1<<RXC0)) == 0 );   
    
    /* Leer y retornar el dato menos reciente del buffer de recepción */   
#if defined ( __GETCHAR_ECHO__ )
    return (putchar(UDR0));
#else
    return UDR0;
#endif
}

Paginas de referencia: http://www.atmel.com/webdoc/AVRLibcReferenceManual/group__avr__stdio_1ga67bae1ad3af79809fd770be392f90e21.html
http://www.atmel.com/webdoc/AVRLibcReferenceManual/using_tools_1using_sel_gcc_opts.html#using_tools_1gcc_minusW

domingo, 12 de abril de 2015

Sensor Ultrasónico en Arduino sin pulseIn ni Interupciones

Este post es probable que no parezca interesante, pero tiene su gracia.

Arduino cuenta con intrucciones como micros(), millis() y seconds(); las cuales incrementan un contador desde que arranca el programa y de acuerdo a su resolución, el desbordamiento va desde minutos hasta días.

Por lo leido en los foros de Arduino, la función PulseIn, usada por algunos para la lectura de sensor ultrasonico.


El siguiente es un código que hice solo como prueba para no usar PulseIn, pero con la ayuda de la intrucción micros()


int trig = 7;
int echo = 6;
int led = 13;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode (trig, OUTPUT);
  pinMode (echo, INPUT);
  pinMode (led, OUTPUT);
  

}
int count1=0, count2=0;
int valor;
void loop() {
  // put your main code here, to run repeatedly:
  count1 =count2 = 0;
  digitalWrite(trig,LOW);
  delay(1);
  digitalWrite(trig,HIGH);
  delayMicroseconds(10);
  digitalWrite(trig,LOW);
  
  
  while(!digitalRead(echo)){}
    count1 = micros();
  while(digitalRead(echo))
  {
  }
  count2 = micros();
  valor = count2-count1; 
  int cm = (valor/2)/29.1;
  Serial.print(valor);
  Serial.println(" ticks");
  Serial.print(cm);
  Serial.println(" cm");
  
  delay(250);
  digitalWrite(led,LOW);
}
Se realizo un comprativo entre este código y el que usa pulseIn, tal comparativo se utilizó un vaso con agua y en sensor como medido de distancia hacia el agua, la cantidad de muestras para ambos casos fue de 113 y se debe tomar en cuenta que la colocacion del sensor no fue la mas adecuada.

miércoles, 1 de abril de 2015

Manjaro Linux, casi sin problemas por el momento Intel graphics en Gateway Mx6947

Esta laptop viejita, desde la cual estoy escribiendo, aun funciona muy bien y tiene Manjaro Linux desde el 2013 y casi no ha dado problemas, solo uno con la tarjeta de video Intel que trae
00:02.0 VGA compatible controller: Intel Corporation Mobile 945GM/GMS, 943/940GML Express Integrated Graphics Controller (rev 03)
00:02.1 Display controller: Intel Corporation Mobile 945GM/GMS/GME, 943/940GML Express Integrated Graphics Controller (rev 03) ,

ya que marcaba un error con ciertas aplicaciones, entre ellas
  •  scilab 
  • vlc con algunos videos 
  • captura de mi escritorio con gtkRecordMyDesktop 
Pero como hay de todo en el foro de ArchLinux (de donde viene Manjaro) encontre esto
https://wiki.archlinux.org/index.php/Intel_graphics#InstallationSNA issues 

 From man 4 intel: There are a couple of backends available for accelerating the DDX. "UXA" (Unified Acceleration Architecture) is the mature backend that was introduced to support the GEM driver model. It is in the process of being superseded by "SNA" (Sandybridge's New Acceleration). Until that process is complete, the ability to choose which backend to use remains for backwards compatibility. SNA is the default acceleration method in xf86-video-intel. If you are experience issues with SNA, try using UXA instead, which can be done by creating an X configuration file containing the following:
 /etc/X11/xorg.conf.d/20-intel.conf
Section "Device"
 Identifier "Intel Graphics"
Driver "intel"
 Option "AccelMethod" "uxa"
EndSection 

El problema es que mi distro, no tiene en esa dirección el archivo :S

[miguel@casita ~]$ cd /etc/X11/xorg.conf.d/
[miguel@casita xorg.conf.d]$ ls 20-keyboard.conf 90-mhwd.conf@ 

Note que hay un link simbolico en la carpeta referida en el foro, por ello decidí echarme a la mar y navegar entre los directorios del etc

[miguel@casita xorg.conf.d]$ cd /etc/X11/
 [miguel@casita X11]$ ls mhwd.d/ xinit/ xorg.conf.d/
 [miguel@casita X11]$ cd mhwd.d/
[miguel@casita mhwd.d]$ ls intel.conf
[miguel@casita mhwd.d]$ less intel.conf 

 Aquí fue donde encontre el dichoso Option "AceelMethod" "sna" y lo cambie por uxa tal y como lo recomiendan y listo!!!!

incluso ya puedo correr el glxgear de open gl

Finalmente una imagen de mi lap viejita

jueves, 12 de marzo de 2015

Documentando con Doxygen Cabeceras

/** @file clk.h

@code #include  @endcode

@brief Macros para definir la frecuencia de oscilacion del reloj
principal
*/
#ifndef CLK_H
#define CLK_H




/**
 *  @name  Definitions for MCU Clock Frequency
 *  Adapt the MCU clock frequency in Hz to your target.
 *  Revisa las paginas 37-39
 */

#define F_CPU 16000000L ///< Frecuencia de 16MHz
#if F_CPU == 16000000L
#define ADC_PRESCALER 0x07  ///

Patebin link

Documentando con Doxygen programa Principal

Archivo Principal

/**@mainpage TecladoDriver.c
 * @brief Imprimir en un display de siete segmentos la tecla presionada por un teclado matricial
   @section intro
   Este programa imprime un numero desde un teclado matricial y lo pone en un display de siete segmentos de catodo comun
   es posible el uso de un display de anodo comun, a traves de una interfaz con un ULN2803
   @section Uso
   Solo se presiona una tecla del matricial y el numero aparece en el display
 * @author: Miguel Montiel
 
 */ 


#include 
#include "clk.h"
#include "keyb.h"
#include "sevseg.h"

/**
@file TecladoDriver.c
@brief Programa que escribe un numero a un display de 7 segmentos
@author Miguel Montiel
*/
int main(void)
{
	
	unsigned char tecla;
	
	_init_Teensyduino_internal_();
	vInitKeyPad();
	InitSegSeg();
	
	
    while(1)
    {
        //TODO:: Please write your application code 
		tecla = ui8_TestKeyPad();
		delay_ms(5);
		Print(tecla);
    }
}

domingo, 1 de marzo de 2015

Desde casa!!! Hace casi un año que no he escrito nada, y no por falta de quehacer, sino mas bien por exceso, espero retomar pronto mis notas del blog. Saludos