Quería comentarles en referencia al Wiki y al programa de Blink que es
el "hello-world" de los AVRMini, Wiring y Arduino.

Mis disculpas, esto debería quedar en el Wiki pero no lo he logrado.

Hay varias diferencias entre la IDE de Arduino o Wiring y AVR-GCC pero
quizá lo mas importante para comenzar son las variables con las que se
asignan el direccionamiento de los puertos y los pines. También el uso
del sistema hexadecimal para cuadrar las variables.

Algo de ésto se menciona en:

http://ccrma.stanford.edu/~juanig/articles/pidht/pidtoot/Microcontroladores_Sistemas.html


El programa de Blink en Wiring es el siguiente:
===========================================================================

// Blinking LED 
// by BARRAGAN <http://barraganstudio.com> 

int ledPin = 0;         // LED connected to the Wiring I/O board pin 0 
 
void setup() 
{ 
  pinMode(ledPin, OUTPUT); // sets the digital pin as output 
} 
 
void loop() 
{ 
  digitalWrite(ledPin, HIGH);   // sets the LED on 
  delay(1000);                  // waits for a second 
  digitalWrite(ledPin, LOW);    // sets the LED off 
  delay(1000); 
} 

=============================================================================

Hay un par de funciones que son importantes: 'pinMode' y 'digitalWrite'

Estas dos no son parte de AVRGCC pero entonces hay que fijarse en la
traducción. En la distribución de Wiring hay que buscar en los archivos:

'$/wiring/core/WApplet.c'  o  '$/wiring/core/WApplet.c.svn-base'

pinMode() está definida así:

void pinMode(uint8_t pin, uint8_t mode) {
  if(mode == OUTPUT) {
    *portsddr[pin/8] |= pins[pin%8];
  } else {
    *portsddr[pin/8] &= ~pins[pin%8];
  }
}

Por lo que me dará el valor hexadecimal de éste pin (pin modulo 8) que
es la variable portsddr[] o portsddr[0], que es DDRD y si ven, adelante
está definida en el mismo programa en el area de las constantes.

 digitalWrite() está definida así:

void digitalWrite(uint8_t pin, uint8_t val) {
  if(val == HIGH) {
    *ports[pin/8] |= pins[pin%8];
  } else {
    *ports[pin/8] &= ~pins[pin%8];
  }
}

Recuerden que en las salidas digitales HIGH es energizar (ON). ports[0]
es PORTD y por lo tanto se manda un HIGH byte en cada digitalWrite en el
puerto PORTD y en al pin con direccionamiento DDDR.


Hay cuatro puertos digitales cada uno con ocho pines. Para manipular los
puertos y los pines con AVRGCC y de acuerdo con las funciones anteriores
la idea es asignar valores hexadecimales como muestra el programa
blink.c,


   // 0x0F es el hexadecimal para el binario 00001111
   outb(DDRB, 0x0F);

Esto quiere decir que utilizo la función outb de avrlib para asignar a
la variable de direccionamiento DDRB el valor de '0x0F'. Lo que implica
que los cuatro primero pines tienen el low-byte o 0 y por definición son
entradas. los cuatro últimos tienen el high-byte y por lo tanto son
salidas. 

El registro PORTB también almacena valores de high-bit o low-bit. Como
habíamos visto en éste caso high-byte es energizado (ON % voltios) y
low-byte apagado y por lo tanto,
 
outb(PORTB, 0x0F);

implica que la función outb asignará valores de high-byte o encendido a
los ultimos cuatro pines del PORTB.

Cada pin en cada puerto se puede manipular con las siguientes funciones:

        //loop forever
        while (1) {
          //clear bit PB0 in the PORTB register - turn LED on
          cbi(PORTB,PB0);
          // pause for 500ms
          timerPause(500);

          //set bit PB0 in the PORTB register - turn LED off
          sbi(PORTB,PB0);
          //pause for 500ms
          timerPause(500);
        } 

Para cambiar el valor del pin0 en PORTB utilizo,
cbi(PORTB,PB0);
Para asignar,
sbi(PORTB,PB0);

Ahora en el caso de Wiring y por lo que se deduce en lugar de utilizar
el AVRGCC con DDRB y PORTB, habría que utilizar DDDR, PORTD, outd y PD0,
si las traducciones no están mal.

Perdón por pensar en voz alta, pero de pronto esto aclara un poco mas la
relación entre las IDEs de Wiring , Arduino y AVRGCC. Si se logra hacer
la conversión de los puertos y los direccionamientos para cada uno de
los AVR, creo que ya no es sino ver si cargan los programas y estaríamos
a tan solo un paso para compilar y ver si OSC funciona.

Para cargarlo hay que hacer el directorio con el Makefile que compile y
cargue el -.elf.

Carr Wilkerson, Michael Gurevich y Wendy Ju, tienen una explicación
sobre AVR-GCC en:
http://cm-wiki.stanford.edu/wiki/AVR_Programming

Suerte,

  --* Juan







_______________________________________________
____ ____ ___  ____ _  _ ___
|__| |__/   /  |___  \/  |__]
|  | |  \  /__ |___ _/\_ |

Arzexp mailing list
[email protected]
http://lists.slow.tk/listinfo.cgi/arzexp-slow.tk

Responder a