[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[paparazzi-commits] [5939] moved avr to arch dir
From: |
Felix Ruess |
Subject: |
[paparazzi-commits] [5939] moved avr to arch dir |
Date: |
Thu, 23 Sep 2010 23:06:26 +0000 |
Revision: 5939
http://svn.sv.gnu.org/viewvc/?view=rev&root=paparazzi&revision=5939
Author: flixr
Date: 2010-09-23 23:06:26 +0000 (Thu, 23 Sep 2010)
Log Message:
-----------
moved avr to arch dir
Modified Paths:
--------------
paparazzi3/trunk/conf/Makefile.avr
Added Paths:
-----------
paparazzi3/trunk/sw/airborne/arch/avr/
paparazzi3/trunk/sw/airborne/arch/avr/adc_hw.c
paparazzi3/trunk/sw/airborne/arch/avr/adc_hw.h
paparazzi3/trunk/sw/airborne/arch/avr/ahrs_asm.S
paparazzi3/trunk/sw/airborne/arch/avr/ant_h_bridge.c
paparazzi3/trunk/sw/airborne/arch/avr/ant_h_bridge.h
paparazzi3/trunk/sw/airborne/arch/avr/ant_servo.c
paparazzi3/trunk/sw/airborne/arch/avr/ant_servo.h
paparazzi3/trunk/sw/airborne/arch/avr/ant_spi.c
paparazzi3/trunk/sw/airborne/arch/avr/ant_spi.h
paparazzi3/trunk/sw/airborne/arch/avr/ant_tracker.c
paparazzi3/trunk/sw/airborne/arch/avr/ant_tracker.h
paparazzi3/trunk/sw/airborne/arch/avr/ant_v2x.c
paparazzi3/trunk/sw/airborne/arch/avr/ant_v2x.h
paparazzi3/trunk/sw/airborne/arch/avr/dc_mc_link.c
paparazzi3/trunk/sw/airborne/arch/avr/dc_mc_link.h
paparazzi3/trunk/sw/airborne/arch/avr/dc_mc_power.c
paparazzi3/trunk/sw/airborne/arch/avr/dc_mc_power.h
paparazzi3/trunk/sw/airborne/arch/avr/gpio.h
paparazzi3/trunk/sw/airborne/arch/avr/i2c_ap.c
paparazzi3/trunk/sw/airborne/arch/avr/i2c_ap.h
paparazzi3/trunk/sw/airborne/arch/avr/init_hw.h
paparazzi3/trunk/sw/airborne/arch/avr/interrupt_hw.h
paparazzi3/trunk/sw/airborne/arch/avr/led_hw.h
paparazzi3/trunk/sw/airborne/arch/avr/link_mcu_hw.h
paparazzi3/trunk/sw/airborne/arch/avr/modem_hw.c
paparazzi3/trunk/sw/airborne/arch/avr/modem_hw.h
paparazzi3/trunk/sw/airborne/arch/avr/ppm_hw.c
paparazzi3/trunk/sw/airborne/arch/avr/ppm_hw.h
paparazzi3/trunk/sw/airborne/arch/avr/servos_4017.c
paparazzi3/trunk/sw/airborne/arch/avr/servos_4017.h
paparazzi3/trunk/sw/airborne/arch/avr/servos_direct_hw.c
paparazzi3/trunk/sw/airborne/arch/avr/servos_direct_hw.h
paparazzi3/trunk/sw/airborne/arch/avr/servos_esc_hw.c
paparazzi3/trunk/sw/airborne/arch/avr/servos_esc_hw.h
paparazzi3/trunk/sw/airborne/arch/avr/spi_hw.c
paparazzi3/trunk/sw/airborne/arch/avr/spi_hw.h
paparazzi3/trunk/sw/airborne/arch/avr/sys_time_hw.c
paparazzi3/trunk/sw/airborne/arch/avr/sys_time_hw.h
paparazzi3/trunk/sw/airborne/arch/avr/uart_hw.c
paparazzi3/trunk/sw/airborne/arch/avr/uart_hw.h
paparazzi3/trunk/sw/airborne/arch/avr/uart_tunnel.c
Removed Paths:
-------------
paparazzi3/trunk/sw/airborne/avr/
Modified: paparazzi3/trunk/conf/Makefile.avr
===================================================================
--- paparazzi3/trunk/conf/Makefile.avr 2010-09-23 23:01:55 UTC (rev 5938)
+++ paparazzi3/trunk/conf/Makefile.avr 2010-09-23 23:06:26 UTC (rev 5939)
@@ -34,7 +34,7 @@
VERIFY=--verify
-SRC_ARCH = $(PAPARAZZI_SRC)/sw/airborne/avr
+SRC_ARCH = $(PAPARAZZI_SRC)/sw/airborne/arch/avr
CC = $(ATMELBIN)/avr-gcc -mmcu=$($(TARGET).MCU)
LD = $(CC) $(ATMEL_LIBPATH)
Copied: paparazzi3/trunk/sw/airborne/arch/avr/adc_hw.c (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/adc_hw.c)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/adc_hw.c
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/adc_hw.c 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,168 @@
+/*
+ * Paparazzi AVR adc functions
+ *
+ * Copyright (C) 2006 Pascal Brisset, Antoine Drouin, Michel Gorraz
+ *
+ * This file is part of paparazzi.
+ *
+ * paparazzi is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * paparazzi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with paparazzi; see the file COPYING. If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+//// ADC3 MVSUP
+//// ADC6 MVSERVO
+
+
+#if (__GNUC__ == 3)
+#include <avr/signal.h>
+#endif
+#include <avr/interrupt.h>
+#include <avr/io.h>
+#include "adc.h"
+#include "std.h"
+
+
+static struct adc_buf* buffers[NB_ADC];
+
+void adc_buf_channel(uint8_t adc_channel, struct adc_buf* s, uint8_t
av_nb_sample) {
+ buffers[adc_channel] = s;
+ s->av_nb_sample = av_nb_sample;
+}
+
+
+/************************************************************************/
+#if defined (__AVR_ATmega8__)
+
+
+#define VOLTAGE_TIME 0x07
+#define ANALOG_PORT PORTC
+#define ANALOG_PORT_DIR DDRC
+
+
+#ifdef IMU_ANALOG
+#define ANALOG_VREF _BV(REFS0)
+#else
+#define ANALOG_VREF _BV(REFS0) | _BV(REFS1)
+#endif
+
+
+
+/**
+ * Called when the voltage conversion is finished
+ *
+ * 8.913kHz on mega128 16MHz 1kHz/channel ??
+*/
+SIGNAL( SIG_ADC )
+{
+ uint8_t adc_input = ADMUX & 0x7;
+ struct adc_buf* buf = buffers[adc_input];
+ uint16_t adc_value = ADCW;
+
+ if (buf) {
+ uint8_t new_head = buf->head + 1;
+ if (new_head >= buf->av_nb_sample) new_head = 0;
+ buf->sum -= buf->values[new_head];
+ buf->values[new_head] = adc_value;
+ buf->sum += adc_value;
+ buf->head = new_head;
+ }
+
+ /* Find the next input */
+ adc_input++;
+ if (adc_input == 4)
+ adc_input = 6; // ADC 4 and 5 for i2c
+ if( adc_input >= 8 ) {
+ adc_input = 0;
+#ifdef CTL_BRD_V1_2
+ adc_input = 1; // WARNING ADC0 is for rservo driver reset on v1.2.0
+#endif /* CTL_BRD_V1_2 */
+ }
+ /* Select it */
+ ADMUX = adc_input | ANALOG_VREF;
+ /* Restart the conversion */
+ sbi( ADCSR, ADSC );
+}
+
+#endif /* (__AVR_ATmega8__) */
+
+
+
+
+/************************************************************************/
+#if defined (__AVR_ATmega128__)
+
+#define VOLTAGE_TIME 0x07
+#define ANALOG_PORT PORTF
+#define ANALOG_PORT_DIR DDRF
+
+
+#define ANALOG_VREF _BV(REFS0)
+
+
+/**
+ * Called when the voltage conversion is finished
+ *
+ * 8.913kHz on mega128 16MHz 1kHz/channel ??
+*/
+SIGNAL( SIG_ADC )
+{
+ uint8_t adc_input = ADMUX & 0x7;
+ struct adc_buf* buf = buffers[adc_input];
+ uint16_t adc_value = ADCW;
+
+ if (buf) {
+ uint8_t new_head = buf->head + 1;
+ if (new_head >= buf->av_nb_sample) new_head = 0;
+ buf->sum -= buf->values[new_head];
+ buf->values[new_head] = adc_value;
+ buf->sum += adc_value;
+ buf->head = new_head;
+ }
+
+ /* Find the next input */
+ adc_input++;
+ if( adc_input >= 8 )
+ adc_input = 0;
+ /* Select it */
+ ADMUX = adc_input | ANALOG_VREF;
+ /* Restart the conversion */
+ sbi( ADCSR, ADSC );
+}
+#endif /* (__AVR_ATmega128__) */
+
+
+
+void adc_init( void ) {
+ uint8_t i;
+ /* Ensure that our port is for input with no pull-ups */
+ ANALOG_PORT = 0x00;
+ ANALOG_PORT_DIR = 0x00;
+
+ /* Select our external voltage ref */
+ ADMUX = ANALOG_VREF;
+
+ /* Select out clock, turn on the ADC interrupt and start conversion */
+ ADCSRA = 0
+ | VOLTAGE_TIME
+ | _BV(ADEN )
+ | _BV(ADIE )
+ | _BV(ADSC );
+
+ /* Init to 0 (usefull ?) */
+ for(i = 0; i < NB_ADC; i++)
+ buffers[i] = (struct adc_buf*)0;
+}
+
Copied: paparazzi3/trunk/sw/airborne/arch/avr/ahrs_asm.S (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/ahrs_asm.S)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/ahrs_asm.S
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/ahrs_asm.S 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,65 @@
+/* -*- indent-tabs-mode:T; c-basic-offset:8; tab-width:8; -*- vi: set ts=8:
+ * $Id$
+ *
+ * Assembly file to layout the AHRS data.
+ * We want to be sure that things are aligned and packed as
+ * closely as possible, as well as alias several things. This
+ * is the easiest way to do it.
+ */
+.section .bss
+
+.global X
+X:
+.global quat
+quat:
+.global q0
+q0:
+.space 4
+.global q1
+q1:
+.space 4
+.global q2
+q2:
+.space 4
+.global q3
+q3:
+.space 4
+
+.global bias
+bias:
+.global bias_p
+bias_p:
+.space 4
+.global bias_q
+bias_q:
+.space 4
+.global bias_r
+bias_r:
+.space 4
+
+
+.global C
+C:
+.global Qdot
+Qdot:
+.space 16
+
+
+.global A
+A:
+.global PCt
+PCt:
+.space 7 * 4
+.global K
+K:
+.space 7 * 4
+.global E
+E:
+.space 1 * 4
+
+/* And the rest of A */
+.space (4*7 - 7 - 7 - 1) * 4
+
+
+.global end_bss
+end_bss:
Copied: paparazzi3/trunk/sw/airborne/arch/avr/ant_h_bridge.c (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/ant_h_bridge.c)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/ant_h_bridge.c
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/ant_h_bridge.c 2010-09-23
23:06:26 UTC (rev 5939)
@@ -0,0 +1,51 @@
+#include "ant_h_bridge.h"
+
+#include <avr/io.h>
+
+#include CONFIG
+
+#define HB_DDR DDRE
+#define HB_PORT PORTE
+/* OC3A */
+#define HB_IN1_PIN 3
+/* OC3C */
+#define HB_IN2_PIN 5
+/* ENABLE */
+#define HB_EN_PIN 7
+
+#define HB_REFRESH 500
+
+
+void ant_h_bridge_init( void ) {
+ /* set PE1, PE3 and PE5 (OC3A, OC3C and PD0) as output */
+ SetBit (HB_DDR,HB_IN1_PIN); /* input 1 */
+ SetBit (HB_DDR,HB_IN2_PIN); /* input 2 */
+ SetBit (HB_DDR,HB_EN_PIN); /* enable */
+
+
+ /* disable motor */
+ // ClearBit(HB_PORT, HB_EN_PIN);
+ SetBit(HB_PORT, HB_EN_PIN);
+
+ /* set timer3 in fast PWM mode, with TOP defined by ICR3 , prescaled to 8 */
+
+ TCCR3A = _BV(WGM31) | _BV(COM3A1) | _BV(COM3C1);
+ TCCR3B = _BV(WGM32) | _BV(WGM33) | _BV(CS31);
+ ICR3 = HB_REFRESH;
+ ant_h_bridge_set(0);
+ // ant_h_bridge_set(HB_REFRESH/5);
+ // SetBit(HB_PORT, HB_IN1_PIN);
+ // ClearBit(HB_PORT, HB_IN2_PIN);
+
+}
+
+void ant_h_bridge_set ( int16_t value) {
+ if (value > 0) {
+ OCR3A = value;
+ OCR3C = 0;
+ }
+ else {
+ OCR3A = 0;
+ OCR3C = -value;
+ }
+}
Copied: paparazzi3/trunk/sw/airborne/arch/avr/ant_h_bridge.h (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/ant_h_bridge.h)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/ant_h_bridge.h
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/ant_h_bridge.h 2010-09-23
23:06:26 UTC (rev 5939)
@@ -0,0 +1,11 @@
+#ifndef ANT_H_BRIDGE_H
+#define ANT_H_BRIDGE_H
+
+#include "std.h"
+
+void ant_h_bridge_init( void );
+void ant_h_bridge_set ( int16_t value);
+
+
+
+#endif /* ANT_H_BRIDGE_H */
Copied: paparazzi3/trunk/sw/airborne/arch/avr/ant_servo.c (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/ant_servo.c)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/ant_servo.c
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/ant_servo.c 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,28 @@
+#include "ant_servo.h"
+
+#include <avr/io.h>
+
+#include CONFIG
+
+#define PRESCALER 8
+#define TICKS_OF_US(nb_us) (((nb_us) * (float)(CLOCK / PRESCALER)-1))
+#define SERVO_REFRESH 25000
+
+void ant_servo_init( void ) {
+ /* set PB5 and PB6 (OC1A and OC1B ) as output */
+ SetBit (DDRB, 5);
+ SetBit (DDRB, 6);
+ /* set timer1 in fast PWM mode, with TOP defined by ICR3 , prescaled to 8 */
+ TCCR1A = _BV(WGM11) | _BV(COM1A1) | _BV(COM1B1);
+ TCCR1B = _BV(WGM12) | _BV(WGM13) | _BV(CS11);
+ ICR1=TICKS_OF_US(SERVO_REFRESH);
+ ant_servo_set(NEUTRAL_SERVO, NEUTRAL_SERVO);
+}
+
+void ant_servo_set ( uint16_t value1_us, uint16_t value2_us) {
+/* code pour regler la valeur en ms a l'etat haut du signal PWM */
+ Bound(value1_us, MIN_SERVO, MAX_SERVO);
+ OCR1A = TICKS_OF_US(value1_us);
+ Bound(value2_us, MIN_SERVO, MAX_SERVO);
+ OCR1B = TICKS_OF_US(value2_us);
+}
Copied: paparazzi3/trunk/sw/airborne/arch/avr/ant_servo.h (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/ant_servo.h)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/ant_servo.h
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/ant_servo.h 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,13 @@
+#ifndef ANT_SERVO_H
+#define ANT_SERVO_H
+
+#include "std.h"
+
+#define MAX_SERVO 2000
+#define NEUTRAL_SERVO 1500
+#define MIN_SERVO 1000
+
+void ant_servo_init( void );
+void ant_servo_set ( uint16_t value1_us, uint16_t value2_us);
+
+#endif /* ANT_SERVO_H */
Copied: paparazzi3/trunk/sw/airborne/arch/avr/ant_spi.c (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/ant_spi.c)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/ant_spi.c
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/ant_spi.c 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,71 @@
+#include "ant_spi.h"
+
+#include <avr/io.h>
+#include "std.h"
+
+
+/*********************************Flush
SPI*****************************************/
+
+
+void flush_SPI( void )
+{
+ if (bit_is_set(SPSR, SPIF))
+ {
+ uint8_t foo __attribute__ ((unused)) = SPDR;
+ }
+}
+
+
+/*****************************Initialisation
SPI************************************/
+
+#define DDR_SPI DDRB
+#define PORT_SPI PORTB
+#define PIN_SS 0
+#define PIN_SCK 1
+#define PIN_MOSI 2
+#define PIN_SYNC 4
+
+void SPI_select_slave ( void )
+{
+ ClearBit(PORT_SPI, PIN_SS);
+}
+
+/***********************************************************************************/
+
+void SPI_unselect_slave ( void )
+{
+ SetBit(PORT_SPI, PIN_SS);
+}
+
+/***********************************************************************************/
+
+void SPI_master_init( void )
+{
+ /* Set SS, MOSI and SCK output, all others input */
+ DDR_SPI |= _BV(PIN_SS) | _BV(PIN_SCK) | _BV(PIN_MOSI);
+ /* unselect slave */
+ SPI_unselect_slave();
+ /* Enable SPI, Master, MSB first, clock idle low, sample on leading edge,
clock rate fck/128 */
+ SPCR = ( _BV(SPE)| _BV(MSTR) | _BV(SPR1) | _BV(SPR0));
+}
+
+/***********************************************************************************/
+
+void SPI_start( void )
+{
+ SPI_select_slave();
+ if (bit_is_set(SPSR, SPIF)) {
+ uint8_t foo __attribute__ ((unused)) = SPDR;
+ }
+ /* enable interrupt */
+ SetBit(SPCR,SPIE);
+}
+
+/***********************************************************************************/
+
+void SPI_stop(void)
+{
+ SPI_unselect_slave ();
+ /* disable interrupt */
+ ClearBit(SPCR,SPIE);
+}
Copied: paparazzi3/trunk/sw/airborne/arch/avr/ant_spi.h (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/ant_spi.h)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/ant_spi.h
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/ant_spi.h 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,19 @@
+#ifndef ANT_SPI_H
+#define ANT_SPI_H
+
+#include "std.h"
+
+#include <avr/io.h>
+#include "std.h"
+
+void flush_SPI( void );
+void SPI_select_slave ( void );
+void SPI_unselect_slave ( void );
+void SPI_master_init( void );
+void SPI_start( void );
+void SPI_stop( void );
+
+#define SPI_transmit(c) { SPDR = c; }
+#define SPI_read() (SPDR)
+
+#endif /* ANT_SPI_H */
Copied: paparazzi3/trunk/sw/airborne/arch/avr/ant_tracker.c (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/ant_tracker.c)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/ant_tracker.c
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/ant_tracker.c 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,37 @@
+#include "ant_tracker.h"
+
+#include "traffic_info.h"
+
+uint8_t ant_track_mode;
+float ant_track_azim;
+float ant_track_elev;
+uint8_t ant_track_id;
+
+int32_t nav_utm_east0;
+int32_t nav_utm_north0;
+uint8_t nav_utm_zone0;
+const float ant_track_gnd_alt = 185.;
+
+void ant_tracker_init( void ) {
+ // nav_utm_east0 = ;
+ // nav_utm_north0 = ;
+ // nav_utm_zone0 = ;
+ ant_track_id = 5;
+ ant_track_mode = ANT_TRACK_AUTO;
+ ant_track_azim = 0.;
+ ant_track_elev = 0.;
+}
+
+void ant_tracker_periodic( void ) {
+ if (ant_track_mode == ANT_TRACK_AUTO) {
+ struct ac_info_ * ac = get_ac_info(ant_track_id);
+ ant_track_azim = atan2(ac->north, ac->east) * 180. / M_PI;
+ ant_track_azim = 90. - ant_track_azim;
+ if (ant_track_azim < 0)
+ ant_track_azim += 360.;
+ float dist = sqrt(ac->north*ac->north + ac->east*ac->east);
+ if ( dist < 1.) dist = 1.;
+ float height = ac->alt - ant_track_elev;
+ ant_track_elev = atan2( height, dist) * 180. / M_PI;
+ }
+}
Copied: paparazzi3/trunk/sw/airborne/arch/avr/ant_tracker.h (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/ant_tracker.h)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/ant_tracker.h
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/ant_tracker.h 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,29 @@
+#ifndef ANT_TRACKER_H
+#define ANT_TRACKER_H
+
+#include "std.h"
+
+#define ANT_TRACK_MANUAL 0
+#define ANT_TRACK_AUTO 1
+
+extern uint8_t ant_track_mode;
+extern float ant_track_azim;
+extern float ant_track_elev;
+extern uint8_t ant_track_id;
+
+#include "led.h"
+
+#define ant_tracker_SetId(i) { ant_track_id = i; }
+#define ant_tracker_SetMode(i) \
+ { \
+ ant_track_mode = i; \
+ if(ant_track_mode) \
+ LED_ON(2); \
+ else \
+ LED_OFF(2); \
+ }
+
+
+extern void ant_tracker_init( void );
+extern void ant_tracker_periodic( void );
+#endif /* ANT_TRACKER_H */
Copied: paparazzi3/trunk/sw/airborne/arch/avr/ant_v2x.c (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/ant_v2x.c)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/ant_v2x.c
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/ant_v2x.c 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,258 @@
+#include "ant_v2x.h"
+
+#include <avr/io.h>
+#include <avr/interrupt.h>
+
+//#include "stdlib.h"
+#include "string.h"
+#include "std.h"
+//#include "systime.h"
+//#include "signalisation.h"
+//#include "utils.h"
+
+#include "ant_spi.h"
+
+//#include "downlink.h"
+
+volatile bool_t ant_v2x_data_available;
+struct Ant_V2xData ant_v2x_data;
+
+
+#define MAG_S_RESET 0
+#define MAG_S_UNINIT 1
+#define MAG_S_READY 2
+#define MAG_S_WAIT_MEAS 3
+volatile uint8_t ant_v2x_status;
+
+#define MAG_CS_IDLE 0
+#define MAG_CS_READING 1
+#define MAG_CS_WRITING 2
+volatile uint8_t ant_v2x_com_status;
+
+
+uint8_t ant_v2x_req[64];
+uint8_t ant_v2x_req_len;
+volatile uint8_t ant_v2x_req_idx;
+
+uint8_t ant_v2x_res[128];
+uint8_t ant_v2x_res_len;
+volatile uint8_t ant_v2x_res_idx;
+
+volatile uint8_t ant_v2x_periodic_count;
+
+/******************************Ant_V2x
define************************************/
+
+#define ANT_V2X_DDR DDRB
+#define ANT_V2X_PORT PORTB
+#define ANT_V2X_PIN 4
+
+#define SYNC_FLAG 0xAA
+#define TERMINATOR 0x00
+
+#define GET_MODE_INFO 0x01
+#define MOD_INFO_RESP 0x02
+#define SET_DATA_COMPONENTS 0x03
+#define GET_DATA 0x04
+#define DATA_RESP 0x05
+#define SET_CONFIG 0x06
+#define GET_CONFIG 0x07
+#define CONFIG_RESP 0x08
+#define SAVE_CONFIG 0x09
+#define START_CAL 0x0A
+#define STOP_CAL 0x0B
+#define GET_CAL_DATA 0x0C
+#define CAL_DATA_RESP 0x0D
+#define SET_CAL_DATA 0x0E
+
+#define DATA_XRAW 0x01 // Slnt32 counts 32768 to 32767
+#define DATA_YRAW 0x02 // Slnt32 counts 32768 to 32767
+#define DATA_XCAL 0x03 // Float32 scaled to 1.0
+#define DATA_YCAL 0x04 // Float32 scaled to 1.0
+#define DATA_HEADING 0x05 // Float32 degrees 0.0 <B0> to 359.9 <B0>
+#define DATA_MAGNITUDE 0x06 // Float32 scalebreak;
+#define DATA_TEMPERATURE 0x07 // Float32 <B0> Celsius
+#define DATA_DISTORTION 0x08 // Boolean
+#define DATA_CAL_STATUS 0x09 // Boolean
+
+
+extern void ant_v2x_periodic_initialise(void);
+extern void ant_v2x_send_req ( const uint8_t* req, uint8_t len);
+extern void ant_v2x_send_get_data ( void );
+
+
+/***************************Initialisation
ant_v2x*******************************/
+
+void ant_v2x_init( void )
+{
+ SPI_master_init();
+ /* set sync as ouptut */
+ SetBit(ANT_V2X_DDR, ANT_V2X_PIN);
+ /* pull it down */
+ SetBit(ANT_V2X_PORT, ANT_V2X_PIN);
+
+ ant_v2x_data_available = FALSE;
+ ant_v2x_com_status = MAG_CS_IDLE;
+
+ ant_v2x_data.heading = 0.;
+
+ ant_v2x_reset();
+}
+
+
+void ant_v2x_periodic_initialise( void ) {
+ static uint8_t init_status = 0;
+ if (ant_v2x_com_status != MAG_CS_IDLE)
+ return;
+ switch (init_status) {
+ case 0 : /* set data response format */
+ {
+ const uint8_t req[] = {SET_DATA_COMPONENTS, 0x08, DATA_XRAW, DATA_YRAW,
DATA_XCAL, DATA_YCAL, DATA_HEADING, DATA_MAGNITUDE, DATA_DISTORTION,
DATA_CAL_STATUS };
+ ant_v2x_send_req(req, sizeof(req));
+ }
+ break;
+ case 1 : /* set little endian */
+ {
+ const uint8_t req[] = {SET_CONFIG, 0x06, 0x00};
+ ant_v2x_send_req(req, sizeof(req));
+ }
+ break;
+ case 2 :
+ { /* set period */
+ const uint8_t req[] = {SET_CONFIG, 0x05, 0x07};
+ ant_v2x_send_req(req, sizeof(req));
+ }
+ break;
+ default:
+ ant_v2x_status = MAG_S_READY;
+ }
+ init_status++;
+}
+void ant_v2x_periodic( void ) { /* Run initialisation and communication
request */
+ switch (ant_v2x_status) {
+ case MAG_S_RESET:
+ SetBit(ANT_V2X_PORT, ANT_V2X_PIN);
+ ant_v2x_status = MAG_S_UNINIT;
+ break;
+ case MAG_S_UNINIT:
+ ant_v2x_periodic_initialise();
+ break;
+ case MAG_S_READY: /* Ready to receive request */
+ /*GREEN_LED_ON();*/
+ /*YELLOW_LED_OFF();*/
+ // if (ant_v2x_data_available) return
+ ant_v2x_send_get_data();
+ ant_v2x_status = MAG_S_WAIT_MEAS;
+ ant_v2x_periodic_count = 0;
+ break;
+ case MAG_S_WAIT_MEAS: { /* Waiting for measures */
+ ant_v2x_periodic_count++;
+ if (ant_v2x_periodic_count > 5) {
+ ant_v2x_com_status = MAG_CS_READING;
+ SPI_start();
+ ant_v2x_res_idx = 0;
+ ant_v2x_res_len = 43;
+ SPI_transmit(0x00);
+ }
+ }
+ break;
+ }
+}
+
+/*****************************Ant_V2x
reset****************************************/
+void ant_v2x_reset (void){
+ ClearBit(ANT_V2X_PORT, ANT_V2X_PIN);
+ ant_v2x_status = MAG_S_RESET;
+ ant_v2x_com_status = MAG_CS_IDLE;
+}
+
+/**************************Ant_V2x data
communication******************************/
+void ant_v2x_send_get_data ( void ) {
+ const uint8_t req[] = {GET_DATA};
+ ant_v2x_send_req(req, sizeof(req));
+}
+
+/********************************Request
procedure***********************************/
+void ant_v2x_send_req(const uint8_t* req, uint8_t len) {
+ memcpy(ant_v2x_req, req, len);
+ ant_v2x_req_len = len;
+ ant_v2x_req_idx = 0;
+ ant_v2x_com_status = MAG_CS_WRITING;
+ SPI_start();
+ SPI_transmit(SYNC_FLAG);/* transmit SYNC_FLAG first for every beginning of
transmition */
+}
+
+void ant_v2x_read_data( void ) {
+ ant_v2x_data.xraw = *(int32_t*)&ant_v2x_res[4];
+ ant_v2x_data.yraw = *(int32_t*)&ant_v2x_res[9];
+ ant_v2x_data.xcal = *(float*)&ant_v2x_res[14];
+ ant_v2x_data.ycal = *(float*)&ant_v2x_res[19];
+ ant_v2x_data.heading = *(float*)&ant_v2x_res[24];
+ ant_v2x_data.magnitude = *(float*)&ant_v2x_res[29];
+ ant_v2x_data.temp = *(float*)&ant_v2x_res[34];
+ ant_v2x_data.distor = *(int8_t*)&ant_v2x_res[39];
+ ant_v2x_data.cal_status = *(int8_t*)&ant_v2x_res[41];
+}
+
+
+#define SPI_SIG_ON_WRITING() { \
+ uint8_t c __attribute__ ((unused)) = SPI_read(); \
+ if (ant_v2x_req_idx < ant_v2x_req_len) { \
+ SPI_transmit(ant_v2x_req[ant_v2x_req_idx]); \
+ } \
+ else if (ant_v2x_req_idx == ant_v2x_req_len) { \
+ SPI_transmit(TERMINATOR); \
+ } \
+ else { \
+ ant_v2x_com_status = MAG_CS_IDLE; \
+ SPI_stop(); \
+ } \
+ ant_v2x_req_idx++; \
+ }
+
+
+static uint8_t nb_retry = 0;
+#define MAX_RETRY 10
+
+#define SPI_SIG_ON_READING() { \
+ ant_v2x_res[ant_v2x_res_idx] = SPI_read(); \
+ if (ant_v2x_res_idx == 0) { \
+ if (nb_retry > MAX_RETRY) { \
+ ant_v2x_reset(); \
+ nb_retry = 0; \
+ /*YELLOW_LED_ON();*/ \
+ goto sig_exit; \
+ } \
+ if (ant_v2x_res[ant_v2x_res_idx] != SYNC_FLAG) { \
+ nb_retry++; \
+ SPI_transmit(0x00); \
+ goto sig_exit; \
+ } \
+ else { \
+ nb_retry = 0; \
+ } \
+ } \
+ ant_v2x_res_idx++; \
+ if (ant_v2x_res_idx < ant_v2x_res_len) { \
+ SPI_transmit(0x00); \
+ } \
+ else { \
+ ant_v2x_com_status = MAG_CS_IDLE; \
+ SPI_stop(); \
+ ant_v2x_status = MAG_S_READY; \
+ ant_v2x_data_available = TRUE; \
+ /*GREEN_LED_OFF();*/ \
+ } \
+ } \
+
+SIGNAL(SIG_SPI) {
+ switch ( ant_v2x_com_status) {
+ case MAG_CS_WRITING:
+ SPI_SIG_ON_WRITING();
+ break;
+ case MAG_CS_READING:
+ SPI_SIG_ON_READING();
+ }
+ sig_exit:
+ /*GREEN_LED_OFF();*/
+ asm("nop");
+}
Copied: paparazzi3/trunk/sw/airborne/arch/avr/ant_v2x.h (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/ant_v2x.h)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/ant_v2x.h
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/ant_v2x.h 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,51 @@
+#ifndef ANT_V2X_H
+#define ANT_V2X_H
+
+#include "std.h"
+
+extern void ant_v2x_init( void );
+extern void ant_v2x_periodic(void);
+extern bool_t ant_v2x_is_in_calibration(void);
+extern void ant_v2x_reset( void );
+extern void ant_v2x_read_data( void );
+
+struct Ant_V2xConfig
+{
+ float declination;
+ uint8_t true_north;
+ uint8_t cal_sample_freq;
+ uint8_t sample_freq;
+ uint8_t period;
+ uint8_t big_idian;
+ uint8_t damping_size;
+};
+
+struct Ant_V2xData
+{
+ int32_t xraw;
+ int32_t yraw;
+ float xcal;
+ float ycal;
+ float heading;
+ float magnitude;
+ float temp;
+ uint8_t distor;
+ uint8_t cal_status;
+};
+
+struct Ant_V2xCal
+{
+ int8_t byte_count;
+ int32_t x_offset;
+ int32_t y_offset;
+ int32_t x_gain;
+ int32_t y_gain;
+ float phi;
+ float cal_magnitude;
+};
+
+extern volatile bool_t ant_v2x_data_available;
+extern struct Ant_V2xData ant_v2x_data;
+
+#endif /* ANT_V2X_H */
+
Copied: paparazzi3/trunk/sw/airborne/arch/avr/dc_mc_link.c (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/dc_mc_link.c)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/dc_mc_link.c
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/dc_mc_link.c 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,103 @@
+#include "dc_mc_link.h"
+
+#include <avr/interrupt.h>
+#include <avr/io.h>
+
+/*
+ Slave address
+ front = 0x52
+ back = 0x54
+ right = 0x56
+ left = 0x58
+*/
+#define DC_MC_LINK_TWI_ADDR 0x52
+#define DC_MC_LINK_TIMEOUT 60
+
+volatile uint8_t dc_mc_link_event;
+uint16_t dc_mc_link_command;
+uint8_t dc_mc_link_timeout;
+
+#define DC_MC_LINK_TWI_RX_BUF_LEN 16
+uint8_t dc_mc_link_twi_rx_buf[DC_MC_LINK_TWI_RX_BUF_LEN];
+uint8_t dc_mc_link_twi_rx_buf_idx;
+
+
+void dc_mc_link_init(void) {
+ dc_mc_link_event = FALSE;
+ dc_mc_link_command = 0;
+ dc_mc_link_timeout = DC_MC_LINK_TIMEOUT;
+
+ /* setup slave addr */
+ TWAR = 0x52;
+ /* clear and enable interrupt - enable peripheral and ack bit */
+ TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE) | (1<<TWEA);
+
+}
+
+void dc_mc_link_periodic(void) {
+ if (dc_mc_link_timeout >= DC_MC_LINK_TIMEOUT)
+ dc_mc_link_command = 0;
+ else
+ dc_mc_link_timeout++;
+}
+
+#define TWI_BUS_ERR_1 0x00
+#define TWI_BUS_ERR_2 0xF8
+
+// Status Slave RX Mode
+#define SR_SLA_ACK 0x60
+#define SR_LOST_ACK 0x68
+#define SR_GEN_CALL_ACK 0x70
+#define GEN_LOST_ACK 0x78
+#define SR_PREV_ACK 0x80
+#define SR_PREV_NACK 0x88
+#define GEN_PREV_ACK 0x90
+#define GEN_PREV_NACK 0x98
+#define STOP_CONDITION 0xA0
+#define REPEATED_START 0xA0
+
+// Status Slave TX mode
+#define SW_SLA_ACK 0xA8
+#define SW_LOST_ACK 0xB0
+#define SW_DATA_ACK 0xB8
+#define SW_DATA_NACK 0xC0
+#define SW_LAST_ACK 0xC8
+
+#include "led.h"
+
+ISR (TWI_vect) {
+ switch (TWSR & 0xF8) {
+ case SR_SLA_ACK:
+ // LED_OFF(1);
+ dc_mc_link_twi_rx_buf_idx = 0;
+ TWCR |= _BV(TWINT) | _BV(TWEA);
+ break;
+ case SR_PREV_ACK:
+ dc_mc_link_twi_rx_buf[dc_mc_link_twi_rx_buf_idx] = TWDR;
+ dc_mc_link_twi_rx_buf_idx++;
+ if (dc_mc_link_twi_rx_buf_idx <= 2)
+ TWCR |= _BV(TWINT) | _BV(TWEA);
+ else
+ TWCR |= _BV(TWINT);
+ break;
+ case STOP_CONDITION:
+ TWCR |= _BV(TWINT);
+ dc_mc_link_timeout = 0;
+ // LED_ON(1);
+ dc_mc_link_event = TRUE;
+ break;
+ case SW_SLA_ACK:
+ case SW_DATA_ACK:
+ TWCR |= (1<<TWINT);
+ break;
+ case TWI_BUS_ERR_2:
+ case TWI_BUS_ERR_1:
+ TWCR |=(1<<TWSTO) | (1<<TWINT);
+ TWCR =(1<<TWEA) | (1<<TWINT) | (1<<TWEN) | (1<<TWIE); // TWI Reset
+ break;
+
+ // default:
+ // LED_TOGGLE(1);
+ }
+
+}
Copied: paparazzi3/trunk/sw/airborne/arch/avr/dc_mc_link.h (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/dc_mc_link.h)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/dc_mc_link.h
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/dc_mc_link.h 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,14 @@
+#ifndef DC_MC_LINK_H
+#define DC_MC_LINK_H
+
+#include "std.h"
+
+extern volatile uint8_t dc_mc_link_event;
+extern uint16_t dc_mc_link_command;
+extern uint8_t dc_mc_link_twi_rx_buf[];
+
+extern void dc_mc_link_init(void);
+extern void dc_mc_link_periodic(void);
+
+
+#endif /* DC_MC_LINK_H */
Copied: paparazzi3/trunk/sw/airborne/arch/avr/dc_mc_power.c (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/dc_mc_power.c)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/dc_mc_power.c
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/dc_mc_power.c 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,30 @@
+#include "dc_mc_power.h"
+
+#include <avr/io.h>
+
+// swicthing freq = CLOCK / RESOLUTION
+// 13 bits -> 1953 Hz
+#define DC_MC_POWER_RESOLUTION 0x1FFF
+// 12 bits -> 3906 Hz
+//#define DC_MC_POWER_RESOLUTION 0xFFF
+// 11 bits -> 7812 Hz
+//#define DC_MC_POWER_RESOLUTION 0x7FF
+// 10 bits -> 15625 Hz
+//#define DC_MC_POWER_RESOLUTION 0x3FF
+
+
+void dc_mc_power_init(void) {
+ /* OC1A output */
+ DDRB |= _BV(1);
+
+ /* fast PWM TOP in ICR1 match in OCR1A */
+ ICR1 = DC_MC_POWER_RESOLUTION;
+ TCCR1A |= _BV(WGM11) | _BV(COM1A1);
+ TCCR1B |= _BV(WGM12) | _BV(WGM13);
+}
+
+
+void dc_mc_power_set( uint16_t val) {
+ OCR1A = val * ((float)DC_MC_POWER_RESOLUTION / 65535.);
+
+}
Copied: paparazzi3/trunk/sw/airborne/arch/avr/dc_mc_power.h (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/dc_mc_power.h)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/dc_mc_power.h
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/dc_mc_power.h 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,10 @@
+#ifndef DC_MC_POWER_H
+#define DC_MC_POWER_H
+
+#include "std.h"
+
+extern void dc_mc_power_init(void);
+extern void dc_mc_power_set( uint16_t val);
+
+
+#endif /* DC_MC_POWER_H */
Copied: paparazzi3/trunk/sw/airborne/arch/avr/gpio.h (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/gpio.h)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/gpio.h
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/gpio.h 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,6 @@
+#ifndef GPIO_H
+#define GPIO_H
+
+
+
+#endif /* GPIO_H */
Copied: paparazzi3/trunk/sw/airborne/arch/avr/i2c_ap.c (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/i2c_ap.c)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/i2c_ap.c
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/i2c_ap.c 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,163 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2005 Pascal Brisset, Antoine Drouin
+ *
+ * This file is part of paparazzi.
+ *
+ * paparazzi is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * paparazzi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with paparazzi; see the file COPYING. If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+/** \file i2c_ap.c
+ * \brief Basic library for I2C
+ *
+ */
+
+#include <avr/signal.h>
+#include <avr/interrupt.h>
+#include "i2c_ap.h"
+#include "std.h"
+
+
+#define TWI_START 0x08
+#define TWI_RESTART 0x10
+#define MT_SLA_ACK 0x18
+#define MT_SLA_NACK 0x20
+#define MR_SLA_ACK 0x40
+#define MR_SLA_NACK 0x48
+#define MT_DATA_ACK 0x28
+#define MR_DATA_ACK 0x50
+#define MR_DATA_NACK 0x58
+
+uint8_t twi_sla;
+uint8_t i2c_buf[TWI_BUF_LEN];
+uint8_t twi_index, twi_len;
+volatile bool_t i2c_idle;
+uint8_t i2c_debug;
+static bool_t *twi_end;
+
+#define I2cStart() i2c_idle = FALSE; *twi_end = FALSE;
TWCR=_BV(TWINT)|_BV(TWSTA)|_BV(TWEN)|_BV(TWIE);
+#define I2cStop() i2c_idle= TRUE; *twi_end = TRUE;
TWCR=_BV(TWINT)|_BV(TWSTO)|_BV(TWEN);
+#define I2cReceive(_ack) TWCR=_BV(TWINT)|_BV(TWEN)| (_ack ? _BV(TWEA) :
0)|_BV(TWIE);
+#define I2cReceiveAck TWCR=_BV(TWINT)|_BV(TWEN)| _BV(TWEA) |_BV(TWIE);
+#define I2cReceiveNAck TWCR=_BV(TWINT)|_BV(TWEN)| _BV(TWIE);
+
+#define I2cSendByte(a) { \
+ TWDR= a; \
+ TWCR=_BV(TWINT)|_BV(TWEN)|_BV(TWIE); \
+}
+
+#define I2cSendSlaW(a) I2cSendSla(a | I2C_WRITE)
+#define I2cSendSlaR(a) I2cSendSla(a | I2C_READ)
+
+
+SIGNAL(SIG_2WIRE_SERIAL) {
+ // i2c_debug = TWSR;
+ switch (TWSR & 0xF8) {
+ case TWI_START:
+ case TWI_RESTART:
+ I2cSendByte(twi_sla);
+ twi_index = 0;
+ break;
+ case MR_DATA_ACK:
+ i2c_buf[twi_index] = TWDR;
+ twi_index++;
+ /* Continue */
+ case MR_SLA_ACK: /* At least one char */
+ I2cReceive(twi_len>twi_index+1); /* Wait and reply with ACK or NACK */
+ break;
+ case MR_SLA_NACK:
+ case MT_SLA_NACK:
+ I2cStart();
+ break;
+ case MT_SLA_ACK:
+ case MT_DATA_ACK:
+ if (twi_index < twi_len) {
+ I2cSendByte(i2c_buf[twi_index]);
+ twi_index++;
+ return;
+ } /* Else Stop */
+ case MR_DATA_NACK:
+ i2c_debug = twi_index;
+ i2c_buf[twi_index] = TWDR;
+ /* Then Stop */
+ default:
+ I2cStop();
+ }
+}
+
+void i2c_send(uint8_t sla, uint8_t _twi_len, bool_t* finished) {
+ i2c_debug = 0x32;
+ twi_len = _twi_len;
+ twi_sla = I2C_TRANSMIT | sla;
+ twi_end = finished;
+ I2cStart();
+}
+
+void i2c_get(uint8_t sla, uint8_t _twi_len, bool_t* finished) {
+ twi_len = _twi_len;
+ twi_sla = I2C_RECEIVE | sla;
+ twi_end = finished;
+ I2cStart();
+}
+
+
+uint8_t i2c_start(void) {
+ TWCR=_BV(TWINT)|_BV(TWSTA)|_BV(TWEN);
+ while (! (TWCR & (1<<TWINT)));
+ return ((TWSR & 0xF8) != TWI_START);
+}
+
+uint8_t i2c_sla(uint8_t a) {
+ TWDR= a;
+ TWCR=_BV(TWINT)|_BV(TWEN);
+
+ while (! (TWCR & (1<<TWINT)));
+
+ return ((TWSR & 0xF8) != MT_SLA_ACK);
+}
+
+uint8_t i2c_transmit(uint8_t byte) {
+ TWDR= byte;
+ TWCR=_BV(TWINT)|_BV(TWEN);
+
+ while (! (TWCR & (1<<TWINT)));
+
+ /***/return I2C_NO_ERROR;
+ return ((TWSR & 0xF8) != MT_DATA_ACK);
+}
+
+uint8_t i2c_receive(uint8_t ack) {
+ if (ack == I2C_CONTINUE)
+ TWCR=_BV(TWINT)|_BV(TWEN)|_BV(TWEA);
+ else
+ TWCR=_BV(TWINT)|_BV(TWEN);
+ while (! (TWCR & (1<<TWINT)));
+ uint8_t byte = TWDR;
+ return byte;
+}
+
+void i2c_init(void) {
+ /** 100 KHz */
+ TWBR = 72;
+ cbi(TWSR, TWPS1);
+ cbi(TWSR, TWPS0);
+ /** 10 KHz
+ TWBR = 198;
+ cbi(TWSR, TWPS1);
+ sbi(TWSR, TWPS0);
+ */
+}
Copied: paparazzi3/trunk/sw/airborne/arch/avr/i2c_ap.h (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/i2c_ap.h)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/i2c_ap.h
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/i2c_ap.h 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,63 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2005 Pascal Brisset, Antoine Drouin
+ *
+ * This file is part of paparazzi.
+ *
+ * paparazzi is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * paparazzi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with paparazzi; see the file COPYING. If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+/** \file i2c_ap.h
+ * \brief Basic library for I2C
+ *
+ */
+
+#ifndef I2C_H
+#define I2C_H
+
+#include <avr/io.h>
+#include <inttypes.h>
+#include "std.h"
+
+#define I2C_NO_ERROR 0
+
+#define I2C_RECEIVE 1
+#define I2C_TRANSMIT 0
+
+#define I2C_QUIT 0
+#define I2C_CONTINUE 1
+
+#define i2c_stop() TWCR=_BV(TWINT)|_BV(TWSTO)|_BV(TWEN);
+
+#define TWI_BUF_LEN 16
+extern volatile bool_t i2c_idle;
+extern uint8_t i2c_debug;
+extern uint8_t i2c_buf[TWI_BUF_LEN];
+
+extern void i2c_init(void);
+extern uint8_t i2c_start(void);
+extern uint8_t i2c_sla(uint8_t x);
+extern uint8_t i2c_transmit(uint8_t x);
+extern uint8_t i2c_receive(uint8_t);
+extern void i2c_send(uint8_t address, uint8_t len, bool_t* finished);
+extern void i2c_get(uint8_t address, uint8_t len, bool_t* finished);
+
+#define I2C_START(ADDRESS) { i2c_start(); i2c_sla(ADDRESS); }
+#define I2C_START_TX(ADDRESS) I2C_START(ADDRESS | I2C_TRANSMIT)
+#define I2C_START_RX(ADDRESS) I2C_START(ADDRESS | I2C_RECEIVE)
+
+#endif
Copied: paparazzi3/trunk/sw/airborne/arch/avr/init_hw.h (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/init_hw.h)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/init_hw.h
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/init_hw.h 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,44 @@
+/*
+ * Paparazzi $Id$
+ *
+ * Copyright (C) 2005 Pascal Brisset, Antoine Drouin
+ *
+ * This file is part of paparazzi.
+ *
+ * paparazzi is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * paparazzi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with paparazzi; see the file COPYING. If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+/*
+ *\brief AVR low level hardware initialisation
+ *
+ */
+
+#ifndef INIT_HW_H
+#define INIT_HW_H
+
+#include <inttypes.h>
+
+static inline void hw_init(void) {
+ /** Pause */
+ uint8_t foo1 = 25;
+ while (foo1--) {
+ uint16_t foo2 = 1;
+ while (foo2++);
+ }
+}
+
+#endif /* INIT_HW_H */
Copied: paparazzi3/trunk/sw/airborne/arch/avr/interrupt_hw.h (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/interrupt_hw.h)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/interrupt_hw.h
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/interrupt_hw.h 2010-09-23
23:06:26 UTC (rev 5939)
@@ -0,0 +1,36 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2005 Pascal Brisset, Antoine Drouin
+ *
+ * This file is part of paparazzi.
+ *
+ * paparazzi is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * paparazzi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with paparazzi; see the file COPYING. If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+/** \file interrupt_hw.h
+ * \brief AVR Low level interrupt handling
+ *
+ */
+
+#ifndef INTERRUPT_HW_H
+#define INTERRUPT_HW_H
+
+#include <avr/interrupt.h>
+
+#define int_enable() sei()
+
+#endif /* INTERRUPT_HW_H */
Copied: paparazzi3/trunk/sw/airborne/arch/avr/led_hw.h (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/led_hw.h)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/led_hw.h
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/led_hw.h 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,23 @@
+#ifndef LED_HW_H
+#define LED_HW_H
+
+#include CONFIG
+#include <avr/io.h>
+
+#define __LED_PORT(p) PORT ## p
+#define _LED_PORT(p) __LED_PORT(p)
+#define __LED_DDR(p) DDR ## p
+#define _LED_DDR(p) __LED_DDR(p)
+
+#define LED_DDR(x) _LED_DDR(LED_ ## x ## _BANK)
+#define LED_PORT(x) _LED_PORT(LED_ ## x ## _BANK)
+#define LED_PIN(x) LED_ ## x ## _PIN
+
+/* set pin as output */
+#define LED_INIT(i) LED_DDR(i) |= _BV(LED_PIN(i))
+
+#define LED_ON(i) LED_PORT(i) &= ~_BV(LED_PIN(i))
+#define LED_OFF(i) LED_PORT(i) |= _BV(LED_PIN(i))
+#define LED_TOGGLE(i) LED_PORT(i) ^= _BV(LED_PIN(i))
+
+#endif /* LED_HW_H */
Copied: paparazzi3/trunk/sw/airborne/arch/avr/link_mcu_hw.h (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/link_mcu_hw.h)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/link_mcu_hw.h
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/link_mcu_hw.h 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,43 @@
+/* $Id$
+ *
+ * Copyright (C) 2003-2005 Pascal Brisset, Antoine Drouin
+ *
+ * This file is part of paparazzi.
+ *
+ * paparazzi is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * paparazzi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with paparazzi; see the file COPYING. If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+/** \brief handling of avr inter mcu link
+ *
+ */
+
+
+
+#ifndef LINK_MCU_HW_H
+#define LINK_MCU_HW_H
+
+#if (__GNUC__ == 3)
+#include <avr/signal.h>
+#include <avr/crc16.h>
+#else
+#include <util/crc16.h>
+#endif
+
+#define CRC_INIT 0xffff
+#define CrcUpdate(_crc, _data) _crc_ccitt_update(_crc, _data)
+
+#endif /* LINK_MCU_HW_H */
Copied: paparazzi3/trunk/sw/airborne/arch/avr/modem_hw.c (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/modem_hw.c)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/modem_hw.c
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/modem_hw.c 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,76 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2003 Pascal Brisset, Antoine Drouin
+ *
+ * This file is part of paparazzi.
+ *
+ * paparazzi is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * paparazzi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with paparazzi; see the file COPYING. If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+/** \file modem_hw.c
+ * \brief Handling of a CMX 469 on avr mega128 architecture
+ */
+
+#include <inttypes.h>
+
+#if (__GNUC__ == 3)
+#include <avr/signal.h>
+#endif
+
+#include <avr/interrupt.h>
+#include "modem.h"
+
+uint8_t modem_nb_ovrn;
+
+uint8_t tx_head;
+volatile uint8_t tx_tail;
+uint8_t tx_buf[ TX_BUF_SIZE ];
+
+uint8_t tx_byte;
+uint8_t tx_byte_idx;
+
+
+SIGNAL( MODEM_CLK_INT_SIG ) {
+ /* start bit */
+ if (tx_byte_idx == 0)
+ cbi(MODEM_TX_PORT, MODEM_TX_DATA);
+ /* 8 data bits */
+ else if (tx_byte_idx < 9) {
+ if (tx_byte & 0x01)
+ sbi(MODEM_TX_PORT, MODEM_TX_DATA);
+ else
+ cbi(MODEM_TX_PORT, MODEM_TX_DATA);
+ tx_byte >>= 1;
+ }
+ /* stop_bit */
+ else {
+ sbi(MODEM_TX_PORT, MODEM_TX_DATA);
+ }
+ tx_byte_idx++;
+ /* next byte */
+ if (tx_byte_idx >= 10) {
+ /* if we have nothing left to transmit */
+ if( tx_head == tx_tail ) {
+ /* disable clock interrupt */
+ cbi( EIMSK, MODEM_CLK_INT );
+ } else {
+ /* else load next byte */
+ MODEM_LOAD_NEXT_BYTE();
+ }
+ }
+}
Copied: paparazzi3/trunk/sw/airborne/arch/avr/modem_hw.h (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/modem_hw.h)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/modem_hw.h
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/modem_hw.h 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,96 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2003 Pascal Brisset, Antoine Drouin
+ *
+ * This file is part of paparazzi.
+ *
+ * paparazzi is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * paparazzi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with paparazzi; see the file COPYING. If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+/** \file modem_hw.h
+ * \brief AVR CMX469 low level functions
+ *
+ */
+
+
+#ifndef MODEM_HW_H
+#define MODEM_HW_H
+
+#include <avr/io.h>
+#include "std.h"
+
+#define MODEM_CHECK_RUNNING() { \
+ if (!(EIMSK & _BV(MODEM_CLK_INT))) { \
+ MODEM_LOAD_NEXT_BYTE() \
+ sbi(EIFR, INTF0); \
+ sbi(EIMSK, MODEM_CLK_INT); \
+ } \
+}
+
+
+#define MODEM_TX_PORT PORTD
+#define MODEM_TX_DDR DDRD
+#define MODEM_TX_EN 7
+#define MODEM_TX_DATA 6
+
+#ifdef CTL_BRD_V1_2
+#define MODEM_CLK_DDR DDRD
+#define MODEM_CLK_PORT PORTD
+#define MODEM_CLK 0
+#define MODEM_CLK_INT INT0
+#define MODEM_CLK_INT_REG EICRA
+#define MODEM_CLK_INT_CFG _BV(ISC01)
+#define MODEM_CLK_INT_SIG SIG_INTERRUPT0
+
+#define MODEM_OSC_DDR DDRB
+#define MODEM_OSC_PORT PORTB
+#define MODEM_OSC 4
+#endif /* CTL_BRD_V1_2 */
+
+#ifdef CTL_BRD_V1_2_1
+#define MODEM_CLK_DDR DDRE
+#define MODEM_CLK_PORT PORTE
+#define MODEM_CLK 4
+#define MODEM_CLK_INT INT4
+#define MODEM_CLK_INT_REG EICRB
+#define MODEM_CLK_INT_CFG _BV(ISC41)
+#define MODEM_CLK_INT_SIG SIG_INTERRUPT4
+#define MODEM_OSC_DDR DDRB
+#define MODEM_OSC_PORT PORTB
+#define MODEM_OSC 4
+#endif /* CTL_BRD_V1_2_1 */
+
+static inline void modem_init ( void ) {
+ /* setup TIMER0 to generate a 4MHz clock */
+ MODEM_OSC_DDR |= _BV(MODEM_OSC);
+ OCR0 = 1; /* 4MhZ */
+ TCCR0 = _BV(WGM01) | _BV(COM00) | _BV(CS00);
+
+ /* setup TX_EN and TX_DATA pin as output */
+ MODEM_TX_DDR |= _BV(MODEM_TX_EN) | _BV(MODEM_TX_DATA);
+ /* data idles hight */
+ sbi(MODEM_TX_PORT, MODEM_TX_DATA);
+ /* enable transmitter */
+ cbi(MODEM_TX_PORT, MODEM_TX_EN);
+ /* set interrupt on failing edge of clock */
+ MODEM_CLK_INT_REG |= MODEM_CLK_INT_CFG;
+}
+
+
+
+#endif
Copied: paparazzi3/trunk/sw/airborne/arch/avr/ppm_hw.c (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/ppm_hw.c)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/ppm_hw.c
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/ppm_hw.c 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,119 @@
+/* $Id$
+ * Copied from autopilot (autopilot.sf.net) thanx alot Trammell
+ *
+ * (c) 2003 Trammell Hudson <address@hidden>
+ * (c) 2003 Pascal Brisset, Antoine Drouin
+ *
+ * This file is part of paparazzi.
+ *
+ * paparazzi is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * paparazzi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with paparazzi; see the file COPYING. If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+#if (__GNUC__ == 3)
+#include <avr/signal.h>
+#endif
+
+#include <avr/interrupt.h>
+#include "ppm.h"
+#include "sys_time.h"
+
+/*
+ * Pulse width is computed as the difference between now and the
+ * previous pulse. If no pulse has been received between then and
+ * now, the time of the last pulse will be equal to the last pulse
+ * we measured. Unfortunately, the Input Capture Flag (ICF1) will
+ * not be set since the interrupt routine disables it.
+ *
+ * Sync pulses are timed with Timer2, which runs at Clk/1024. This
+ * is slow enough at both 4 and 8 Mhz to measure the lengthy (10ms
+ * or longer) pulse.
+ *
+ * Otherwise, compute the pulse width with the 16-bit timer1,
+ * push the pulse width onto the stack and increment the
+ * pulse counter until we have received eight pulses.
+ */
+
+uint16_t ppm_pulses[ PPM_NB_PULSES ];
+volatile bool_t ppm_valid;
+
+/* MC3030, Trame PPM7: 25ms, 10.4 au neutre,
+ sync pulse = 16.2ms with low value on every channels */
+
+#if CLOCK == 8
+#define RestartPpmCycle() { state = 0; sync_start = TCNT2 + (tmr2_ov_cnt <<
8); return; }
+#else
+#define RestartPpmCycle() { state = 0; sync_start = TCNT2; return; }
+#endif
+
+#ifdef TIMER1_TOP
+static volatile uint16_t tmr1_ov_cnt = 0;
+SIGNAL(SIG_OVERFLOW1) {
+ tmr1_ov_cnt += TIMER1_TOP;
+ return;
+}
+#endif
+
+
+SIGNAL( SIG_INPUT_CAPTURE1 )
+{
+ static uint16_t last;
+ uint16_t this;
+ uint16_t width;
+ static uint8_t state = 0;
+ static uint16_t sync_start;
+
+ this = ICR1;
+#ifdef TIMER1_TOP
+ this += tmr1_ov_cnt;
+#endif
+ width = this - last;
+ last = this;
+
+ if( state == 0 ) {
+ uint16_t end = TCNT2;
+#if CLOCK == 8
+ end += tmr2_ov_cnt << 8;
+ uint16_t diff = (end - sync_start);
+#else
+ uint8_t diff = (end - sync_start);
+#endif
+ sync_start = end;
+
+ /* The frame period of the mc3030 seems to be 25ms.
+ * One pulse lasts from 1.05ms to 2.150ms.
+ * Sync pulse is at least 7ms : (7000*CLOCK)/1024 = 109
+ */
+ if( diff > LONG_SYS_TICS_OF_USEC(PPM_SYNC_MIN_LEN) &&
+ diff < LONG_SYS_TICS_OF_USEC(PPM_SYNC_MAX_LEN) ) {
+ state = 1;
+ }
+ }
+ else {
+ /* Read a data pulses */
+ if( width > SYS_TICS_OF_USEC(PPM_DATA_MAX_LEN) ||
+ width < SYS_TICS_OF_USEC(PPM_DATA_MIN_LEN))
+ RestartPpmCycle();
+ ppm_pulses[state - 1] = width;
+
+ if (state >= PPM_NB_PULSES) {
+ ppm_valid = TRUE;
+ RestartPpmCycle();
+ } else
+ state++;
+ }
+ return;
+}
Copied: paparazzi3/trunk/sw/airborne/arch/avr/ppm_hw.h (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/ppm_hw.h)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/ppm_hw.h
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/ppm_hw.h 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,86 @@
+/* $Id$
+ *
+ * Decoder for the trainer ports or hacked receivers for both
+ * Futaba and JR formats. The ppm_valid flag is set whenever
+ * a valid frame is received.
+ *
+ * Pulse widths are stored as unscaled 16-bit values in ppm_pulses[].
+ * If you require actual microsecond values, divide by CLOCK.
+ * For an 8 Mhz clock and typical servo values, these will range
+ * from 0x1F00 to 0x4000.
+ *
+ * Copied from autopilot (autopilot.sf.net) thanx alot Trammell
+ *
+ * (c) 2002 Trammell Hudson <address@hidden>
+ * (c) 2003 Pascal Brisset, Antoine Drouin
+ *
+ * This file is part of paparazzi.
+ *
+ * paparazzi is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * paparazzi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with paparazzi; see the file COPYING. If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+#ifndef PPM_HW_H
+#define PPM_HW_H
+
+#ifdef FBW
+
+#include <inttypes.h>
+#include <avr/io.h>
+
+#include CONFIG
+
+/*
+ * PPM pulses are falling edge clocked on the ICP, which records
+ * the state of the global clock. We do not use any noise
+ * canceling features.
+ *
+ * JR might be rising edge clocked; set that as an option
+ */
+static inline void
+ppm_init( void )
+{
+#if defined RADIO_CONTROL_TYPE && RADIO_CONTROL_TYPE == RC_FUTABA
+ cbi( TCCR1B, ICES1 );
+#elif defined RADIO_CONTROL_TYPE && RADIO_CONTROL_TYPE == RC_JR
+ sbi( TCCR1B, ICES1 );
+#else
+#error "ppm_hw.h: Unknown RADIO_CONTROL_TYPE"
+#endif
+ /* No noise cancelation */
+ sbi( TCCR1B, ICNC1 );
+
+ /* Set ICP to input, no internal pull up */
+ cbi( PPM_DDR, PPM_PIN);
+
+ /* Enable interrupt on input capture */
+ sbi( TIMSK, TICIE1 );
+
+#ifdef TIMER1_TOP
+ /* Enable timer1 overflow it. */
+ /* needed to increase timer1 count to 16 bits in fast pwm mode (TIMER1_TOP
rollover) */
+ sbi( TIMSK, TOIE1 );
+#endif
+ ppm_valid = FALSE;
+}
+
+#endif /* FBW */
+
+extern volatile uint16_t ppm_diff;
+
+
+
+#endif /* PPM_HW_H */
Copied: paparazzi3/trunk/sw/airborne/arch/avr/servos_4017.c (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/servos_4017.c)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/servos_4017.c
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/servos_4017.c 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,138 @@
+/* $Id$
+ *
+ * (c) 2003-2006 Pascal Brisset, Antoine Drouin
+ *
+ * This file is part of paparazzi.
+ *
+ * paparazzi is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * paparazzi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with paparazzi; see the file COPYING. If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+
+/** Implementation of actuators.h */
+
+#include <avr/io.h>
+#if (__GNUC__ == 3)
+#include <avr/signal.h>
+#endif
+#include <avr/interrupt.h>
+#include "servos_4017.h"
+#include "actuators.h"
+#include "sys_time.h"
+#include CONFIG
+
+
+/* holds the servo pulses width in clock ticks */
+uint16_t servo_widths[_4017_NB_CHANNELS];
+
+/*
+ * We use the output compare registers to generate our servo pulses.
+ * These should be connected to a decade counter that routes the
+ * pulses to the appropriate servo.
+ *
+ * Initialization involves:
+ *
+ * - Reseting the decade counters
+ * - Writing the first pulse width to the counters
+ * - Setting output compare to set the clock line by calling servo_enable()
+ * - Bringing down the reset lines
+ *
+ * Ideally, you can use two decade counters to drive 20 servos.
+ */
+void actuators_init( void ) {
+ uint8_t i;
+ /* Configure the reset and clock lines as output */
+ _4017_RESET_DDR |= _BV(_4017_RESET_PIN);
+ _4017_CLOCK_DDR |= _BV(_4017_CLOCK_PIN);
+ /* Reset the decade counter */
+ sbi( _4017_RESET_PORT, _4017_RESET_PIN );
+ /* Lower the clock line */
+ cbi( _4017_CLOCK_PORT, _4017_CLOCK_PIN );
+ /* Set all servos at their midpoints */
+ for( i=0 ; i < _4017_NB_CHANNELS ; i++ )
+ servo_widths[i] = SYS_TICS_OF_USEC(1500);
+ /* Set servos to go off some long time from now */
+ SERVO_OCR = 32768ul;
+ /* Set output compare to toggle the output bits */
+ TCCR1A |= _BV(SERVO_COM0 );
+#ifdef SERVOS_FALLING_EDGE
+ /* Starts CLOCK high for the falling edge case */
+ TCCR1A |= _BV(SERVO_FORCE);
+#endif
+ /* Clear the interrupt flags in case they are set */
+ TIFR = _BV(SERVO_FLAG);
+ /* Unassert the decade counter reset to start it running */
+ cbi( _4017_RESET_PORT, _4017_RESET_PIN );
+ /* Enable our output compare interrupts */
+ TIMSK |= _BV(SERVO_ENABLE );
+}
+
+
+/*
+ * Interrupt routine
+ *
+ * write the next pulse width to OCR register and
+ * assert the servo signal. It will be cleared by
+ * the following compare match.
+ */
+SIGNAL( SIG_OUTPUT_COMPARE1A )
+{
+ static uint8_t servo = 0;
+ uint16_t width;
+
+#ifdef SERVOS_FALLING_EDGE
+#define RESET_WIDTH SYS_TICS_OF_USEC(1000)
+#define FIRST_PULSE_WIDTH SYS_TICS_OF_USEC(100)
+/** The clock pin has been initialized high and is toggled down by
+the timer.
+ Unfortunately it seems that reset does not work on 4017 in this case if it
+occurs after the first falling edge. We add two more states at the end of
+the sequence:
+ - keeping clock low, reset high during 1ms
+ - clock high (toggled by the timer), reset down, during 100us (looks like
+ the first pulse of a standard RC */
+ if (servo == _4017_NB_CHANNELS) {
+ sbi( _4017_RESET_PORT, _4017_RESET_PIN );
+ /** Start a long 1ms reset, keep clock low */
+ SERVO_OCR += RESET_WIDTH;
+ servo++;
+ return;
+ }
+ if (servo > _4017_NB_CHANNELS) {
+ /** Clear the reset, the clock has been toggled high */
+ cbi( _4017_RESET_PORT, _4017_RESET_PIN );
+ /** Starts a short pulse-like period */
+ SERVO_OCR += FIRST_PULSE_WIDTH;
+ servo=0; /** Starts a new sequence next time */
+ return;
+ }
+#else
+ if (servo >= _4017_NB_CHANNELS) {
+ sbi( _4017_RESET_PORT, _4017_RESET_PIN );
+ servo = 0;
+ // FIXME: 500 ns required by 4017 reset ???? why does it work without!
+ // asm( "nop; nop; nop; nop;nop; nop; nop; nop;nop; nop; nop; nop;nop;
nop; nop; nop;" );
+ cbi( _4017_RESET_PORT, _4017_RESET_PIN );
+ }
+#endif
+ width = servo_widths[servo];
+
+ SERVO_OCR += width;
+
+ TCCR1A |= _BV(SERVO_FORCE);
+
+ servo++;
+}
Copied: paparazzi3/trunk/sw/airborne/arch/avr/servos_4017.h (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/servos_4017.h)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/servos_4017.h
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/servos_4017.h 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,38 @@
+/* $Id$
+ *
+ * (c) 2003-2005 Pascal Brisset, Antoine Drouin
+ *
+ * This file is part of paparazzi.
+ *
+ * paparazzi is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or extern uint16_t
servo_widths[_4017_NB_CHANNELS];(at your option)
+ * any later version.
+ *
+ * paparazzi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with paparazzi; see the file COPYING. If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+#ifndef SERVO_4017_H
+#define SERVO_4017_H
+
+#define SERVOS_TICS_OF_USEC(_us) SYS_TICS_OF_USEC(_us)
+#define ChopServo(x,a,b) Chop(x, a, b)
+
+#define _4017_NB_CHANNELS 10
+extern uint16_t servo_widths[_4017_NB_CHANNELS];
+#define Actuator(i) servo_widths[i]
+
+#define ActuatorsCommit() {}
+
+#endif /* SERVO_4017_H */
+
+
Copied: paparazzi3/trunk/sw/airborne/arch/avr/servos_direct_hw.c (from rev
5938, paparazzi3/trunk/sw/airborne/avr/servos_direct_hw.c)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/servos_direct_hw.c
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/servos_direct_hw.c 2010-09-23
23:06:26 UTC (rev 5939)
@@ -0,0 +1,25 @@
+/* Implementation of command.h */
+
+/*
+ 3 servos on OC3A OC3B OC3C using Timer3 prescaled at 8
+*/
+
+#include "servos_direct_hw.h"
+#include "std.h"
+#include "actuators.h"
+#include "airframe.h"
+
+void actuators_init ( void ) {
+ /* OC3A, OC3B, OC3C outputs */
+ DDRE |= _BV(3) | _BV(4) | _BV(5);
+ /* set timer3 in fast PWM mode, with TOP defined by ICR3 , prescaled to 8 */
+ TCCR3A = _BV(WGM31) | _BV(COM3A1) | _BV(COM3B1) | _BV(COM3C1);
+ TCCR3B = _BV(WGM32) | _BV(WGM33) | _BV(CS31);
+ /* set timer3 rollover */
+ ICR3 = TIMER3_TOP;
+ /* Set all servos at their midpoints */
+ Actuator(0) = SERVOS_TICS_OF_USEC(1500);
+ Actuator(1) = SERVOS_TICS_OF_USEC(1500);
+ Actuator(2) = SERVOS_TICS_OF_USEC(1500);
+}
+
Copied: paparazzi3/trunk/sw/airborne/arch/avr/servos_direct_hw.h (from rev
5938, paparazzi3/trunk/sw/airborne/avr/servos_direct_hw.h)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/servos_direct_hw.h
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/servos_direct_hw.h 2010-09-23
23:06:26 UTC (rev 5939)
@@ -0,0 +1,23 @@
+#ifndef SERVOS_DIRECT_HW_H
+#define SERVOS_DIRECT_HW_H
+
+#include <avr/io.h>
+#include CONFIG
+
+/* servo refresh rate in HZ */
+#define SERVO_REFRESH_RATE 50
+/* timer3 prescaler */
+#define TIMER3_PRESCALER 8
+#define TIMER3_TOP (CLOCK*1e6/SERVO_REFRESH_RATE/TIMER3_PRESCALER)
+#define SERVOS_TICS_OF_USEC(s) ((s)*CLOCK/TIMER3_PRESCALER)
+#define ChopServo(x, min, max) Chop(x, min, max)
+
+#define SERVO_REG_0 OCR3A
+#define SERVO_REG_1 OCR3B
+#define SERVO_REG_2 OCR3C
+#define COMMAND_(i) SERVO_REG_ ## i
+#define Actuator(i) COMMAND_(i)
+
+#define ActuatorsCommit() {}
+
+#endif /* SERVOS_DIRECT_HW_H */
Copied: paparazzi3/trunk/sw/airborne/arch/avr/servos_esc_hw.c (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/servos_esc_hw.c)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/servos_esc_hw.c
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/servos_esc_hw.c 2010-09-23
23:06:26 UTC (rev 5939)
@@ -0,0 +1,51 @@
+/* $Id$
+ *
+ * (c) 2006 Pascal Brisset, Antoine Drouin
+ *
+ * This file is part of paparazzi.
+ *
+ * paparazzi is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * paparazzi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with paparazzi; see the file COPYING. If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+
+
+
+/** Implementation of actuators.h */
+
+/*
+
+ 4 DC motor controller with mosfets on OCR1A OCR3A OCR3B OCR3C
+
+*/
+
+#include <avr/io.h>
+#include "servos_esc_hw.h"
+#include CONFIG
+
+
+void actuators_init ( void ) {
+ /* OC1A output */
+ DDRB |= _BV(5);
+ /* fast PWM, 10 bits */
+ TCCR1A |= _BV(WGM10) | _BV(WGM11) | _BV(COM1A1);
+ TCCR1B |= _BV(WGM12);
+ /* OC3A, OC3B, OC3C outputs */
+ DDRE |= _BV(3) | _BV(4) | _BV(5);
+ /* fast PWM : 10 bits */
+ TCCR3A |= _BV(WGM30) | _BV(WGM31) | _BV(COM3A1) | _BV(COM3B1) | _BV(COM3C1);
+ TCCR3B |= _BV(WGM32);
+}
Copied: paparazzi3/trunk/sw/airborne/arch/avr/servos_esc_hw.h (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/servos_esc_hw.h)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/servos_esc_hw.h
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/servos_esc_hw.h 2010-09-23
23:06:26 UTC (rev 5939)
@@ -0,0 +1,50 @@
+/* $Id$
+ *
+ * Copied from autopilot (autopilot.sf.net) thanx alot Trammell
+ * (c) 2003-2005 Pascal Brisset, Antoine Drouin
+ *
+ * This file is part of paparazzi.
+ *
+ * paparazzi is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * paparazzi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with paparazzi; see the file COPYING. If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+#ifndef SERVOS_ESC_HW_H
+#define SERVOS_ESC_HW_H
+
+
+/** Implementation of actuators.h */
+
+/*
+ 4 DC motor controller with mosfets on OCR1A OCR3A OCR3B OCR3C
+*/
+
+#include <avr/io.h>
+
+#define MAX_TICK 0x3FF
+#define MOT_CTL_0 OCR3C
+#define MOT_CTL_1 OCR1A
+#define MOT_CTL_2 OCR3B
+#define MOT_CTL_3 OCR3A
+
+#define COMMAND_(i) MOT_CTL_ ## i
+#define Actuator(i) COMMAND_(i)
+#define ChopServo(x,_a,b) (x > b ? b : x)
+#define SERVOS_TICS_OF_USEC(s) (s)
+
+#define ActuatorsCommit() {}
+
+#endif /* SERVOS_ESC_HW_H */
Copied: paparazzi3/trunk/sw/airborne/arch/avr/spi_hw.c (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/spi_hw.c)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/spi_hw.c
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/spi_hw.c 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,148 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2003-2005 Pascal Brisset, Antoine Drouin
+ *
+ * This file is part of paparazzi.
+ *
+ * paparazzi is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * paparazzi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with paparazzi; see the file COPYING. If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+/** \file spi_hw.c
+ * \brief handling of hardware dependant SPI on AVR architecture
+ */
+
+#include CONFIG
+#include "spi.h"
+
+#include <inttypes.h>
+#include <avr/io.h>
+
+#if (__GNUC__ == 3)
+#include <avr/signal.h>
+#endif
+
+#include <avr/interrupt.h>
+
+volatile uint8_t spi_idx_buf;
+
+#define HandleOneSpiByte() { \
+ spi_idx_buf++; \
+ if (spi_idx_buf < spi_buffer_length) { \
+ SPDR = spi_buffer_output[spi_idx_buf]; \
+ spi_buffer_input[spi_idx_buf-1] = SPDR; \
+ } else if (spi_idx_buf == spi_buffer_length) { \
+ spi_buffer_input[spi_idx_buf-1] = SPDR; \
+ spi_message_received = TRUE; \
+ SpiStop(); \
+ } \
+ }
+
+
+#ifdef SPI_SLAVE
+
+volatile bool_t spi_was_interrupted = FALSE;
+
+void spi_init(void) {
+ /* set it pin output */
+ // IT_DDR |= _BV(IT_PIN);
+
+ /* set MISO pin output */
+ SLAVE_SPI_DDR |= _BV(SLAVE_SPI_MISO_PIN);
+ /* enable SPI, slave, MSB first, sck idle low */
+ SPCR = _BV(SPE);
+ /* enable interrupt */
+ SPCR |= _BV(SPIE);
+}
+
+#define SpiStop() {}
+
+
+SIGNAL(SIG_SPI) {
+ HandleOneSpiByte();
+}
+
+#endif /** SPI_SLAVE */
+
+
+/****************************************************************************/
+#ifdef SPI_MASTER
+
+#include "autopilot.h"
+
+#define SpiStop() { \
+ ClearBit(SPCR,SPIE); \
+ ClearBit(SPCR, SPE); \
+ SpiUnselectAllSlaves(); \
+}
+
+volatile uint8_t spi_cur_slave;
+uint8_t spi_nb_ovrn;
+
+void spi_init( void) {
+ /* Set MOSI and SCK output, all others input */
+ MASTER_SPI_DDR |= _BV(MASTER_SPI_MOSI_PIN)| _BV(MASTER_SPI_SCK_PIN);
+
+ /* enable pull up for miso */
+ // SPI_PORT |= _BV(MASTER_SPI_MISO_PIN);
+
+ /* Set SS0 output */
+ SetBit( MASTER_SPI_SS0_DDR, MASTER_SPI_SS0_PIN);
+ /* SS0 idles high (don't select slave yet)*/
+
+#if 0
+ /* Set SS1 output */
+ SetBit( MASTER_SPI_SS1_DDR, MASTER_SPI_SS1_PIN);
+ /* SS1 idles high (don't select slave yet)*/
+
+ /* Set SS2 output */
+ SetBit( MASTER_SPI_SS2_DDR, MASTER_SPI_SS2_PIN);
+ /* SS2 idles high (don't select slave yet)*/
+#endif
+
+ SpiUnselectAllSlaves();
+
+ spi_cur_slave = SPI_NONE;
+}
+
+
+/** SPI interrupt: starts a delay */
+SIGNAL(SIG_SPI) {
+ /* if (spi_cur_slave == SPI_SLAVE0) { */
+ /* setup OCR1C to pop in 200 clock cycles */
+ /* this leaves time for the slave (fbw) */
+ /* to process the byte we've sent and to */
+ /* prepare a new one to be sent */
+ OCR1C = TCNT1 + (200UL*CLOCK)/16;
+ /* clear interrupt flag */
+ SetBit(ETIFR, OCF1C);
+ /* enable OC1C interrupt */
+ SetBit(ETIMSK, OCIE1C);
+ /* } else
+ fatal_error_nb++;
+ */
+}
+
+/** Send a byte */
+SIGNAL(SIG_OUTPUT_COMPARE1C) {
+ /* disable OC1C interrupt */
+ ClearBit(ETIMSK, OCIE1C);
+
+ HandleOneSpiByte();
+}
+
+#endif /* SPI_MASTER */
Copied: paparazzi3/trunk/sw/airborne/arch/avr/spi_hw.h (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/spi_hw.h)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/spi_hw.h
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/spi_hw.h 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,86 @@
+/*
+ * Paparazzi $Id$
+ *
+ * Copyright (C) 2005-2006 Pascal Brisset, Antoine Drouin
+ *
+ * This file is part of paparazzi.
+ *
+ * paparazzi is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * paparazzi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with paparazzi; see the file COPYING. If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+#ifndef SPI_HW_H
+#define SPI_HW_H
+
+/** Index in SPI buffers: one is enough for full duplex communication */
+extern volatile uint8_t spi_idx_buf;
+
+#define SpiInitBuf() { \
+ spi_idx_buf = 0; \
+ SPDR = spi_buffer_output[0]; \
+ spi_message_received = FALSE; \
+}
+
+#ifdef SPI_SLAVE
+
+#define SpiStart() SpiInitBuf()
+
+#endif /* SPI_SLAVE */
+
+
+
+
+
+#ifdef SPI_MASTER
+
+/* Enable SPI, Master, clock fck/16, interrupt */
+#define SpiStart() { \
+ SPCR = _BV(SPE) | _BV(MSTR) | _BV(SPR0); \
+ uint8_t foo; \
+ if (bit_is_set(SPSR, SPIF)) \
+ foo = SPDR; \
+ SPCR |= _BV(SPIE); \
+ SpiInitBuf(); \
+}
+
+#define SpiUnselectAllSlaves() { \
+ spi_cur_slave = SPI_NONE; \
+ SetBit( MASTER_SPI_SS0_PORT, MASTER_SPI_SS0_PIN );\
+ /* \
+ SetBit( MASTER_SPI_SS1_PORT, MASTER_SPI_SS1_PIN ); \
+ SetBit( MASTER_SPI_SS2_PORT, MASTER_SPI_SS2_PIN );\
+ */ \
+}
+
+#define SpiSelectSlave0() { \
+ spi_cur_slave = SPI_SLAVE0; \
+ ClearBit( MASTER_SPI_SS0_PORT, MASTER_SPI_SS0_PIN );\
+}
+
+#define SpiSelectSlave1() { \
+ spi_cur_slave = SPI_SLAVE1; \
+ ClearBit( MASTER_SPI_SS1_PORT, MASTER_SPI_SS1_PIN );\
+}
+
+#define SpiSelectSlave2() { \
+ spi_cur_slave = SPI_SLAVE2; \
+ ClearBit( MASTER_SPI_SS2_PORT, MASTER_SPI_SS2_PIN );\
+}
+
+#endif /* SPI_MASTER */
+
+
+#endif /* SPI_HW_H */
Copied: paparazzi3/trunk/sw/airborne/arch/avr/sys_time_hw.c (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/sys_time_hw.c)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/sys_time_hw.c
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/sys_time_hw.c 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,22 @@
+#include <inttypes.h>
+#if (__GNUC__ == 3)
+#include <avr/signal.h>
+#endif
+#include <avr/interrupt.h>
+
+#include CONFIG
+#include "std.h"
+
+uint16_t cpu_time_ticks;
+
+#if CLOCK == 8
+volatile uint8_t tmr2_ov_cnt;
+volatile bool_t tmr2_overflow;
+
+SIGNAL(SIG_OVERFLOW2) {
+ tmr2_ov_cnt++;
+ tmr2_overflow = TRUE;
+ return;
+}
+
+#endif
Copied: paparazzi3/trunk/sw/airborne/arch/avr/sys_time_hw.h (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/sys_time_hw.h)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/sys_time_hw.h
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/sys_time_hw.h 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,129 @@
+/*
+ * Paparazzi $Id$
+ *
+ * Copyright (C) 2005 Pascal Brisset, Antoine Drouin
+ *
+ * This file is part of paparazzi.
+ *
+ * paparazzi is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * paparazzi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with paparazzi; see the file COPYING. If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+/*
+ *\brief AVR timer functions
+ *
+ */
+
+#ifndef SYS_TIME_HW_H
+#define SYS_TIME_HW_H
+
+#include "std.h"
+#include <avr/io.h>
+
+extern uint16_t cpu_time_ticks;
+
+#define F_CPU (CLOCK*1000000UL)
+
+/*
+ * Enable Timer1 (16-bit) running at Clk/1 for the global system
+ * clock.
+ *
+ * Low frequency periodic tasks will be signaled by timer 2
+ * running at Clk/1024. For 16 Mhz clock, this will be every
+ * 16384 microseconds, or 61.03515625 Hz.
+ */
+static inline void sys_time_init( void ) {
+
+ /* Timer0: Modem clock is started in modem.h in ctc mode*/
+
+ /* Timer1 @ Clk/1: System clock */
+ TCCR1A = 0x00;
+ TCCR1B = _BV(CS10);
+
+ /* Timer2 @ Clk/1024: Periodic clock */
+#if defined (__AVR_ATmega8__)
+ TCCR2 = _BV(CS20) | _BV(CS21) | _BV(CS22);
+#elif defined (__AVR_ATmega128__)
+#if CLOCK == 16
+ TCCR2 = _BV(CS20) | _BV(CS22);
+#elif CLOCK == 8
+ TCCR2 = _BV(CS22);
+ sbi( TIMSK, TOIE2 );
+#else
+#error "Unknwon CLOCK"
+#endif
+#else
+#warning "Unknown arch"
+#endif
+
+#ifdef TIMER3
+ /* Timer3 @ Clk/1: motor controller */
+ TCCR3A = 0x00;
+ TCCR3B = _BV(CS10);
+#endif
+
+ cpu_time_sec = 0;
+ cpu_time_ticks = 0;
+}
+
+
+#define SYS_TICS_OF_USEC(us) (uint16_t)((us)*CLOCK)
+#define SIGNED_SYS_TICS_OF_USEC(us) (int16_t)((us)*CLOCK)
+
+#if CLOCK == 8
+#define LONG_SYS_TICS_OF_USEC(us) (uint16_t)(((uint32_t)(us)*CLOCK)/256ul)
+#else
+#define LONG_SYS_TICS_OF_USEC(us) (uint8_t)(((uint32_t)(us)*CLOCK)/1024ul)
+#endif
+
+/*
+ * Periodic tasks occur when Timer2 overflows. Check and unset
+ * the overflow bit. Occurs at 61.03515625 Hz with CLOCK = 16
+ * Occurs at 122Hz with CLOCK = 8
+ *
+ */
+
+#if CLOCK == 8
+extern volatile uint8_t tmr2_ov_cnt;
+extern volatile bool_t tmr2_overflow;
+#endif
+
+#define TICKS_PER_SEC (CLOCK * 1e6 / 1024)
+
+#if CLOCK == 8
+static inline bool_t sys_time_periodic( void ) {
+ if( !tmr2_overflow )
+ return FALSE;
+ tmr2_overflow = FALSE;
+
+ return (tmr2_ov_cnt & 0x1);
+}
+#else
+//#define TMR2_PER_SEC 7812
+static inline bool_t sys_time_periodic( void ) {
+ if( !bit_is_set( TIFR, TOV2 ) )
+ return FALSE;
+ TIFR = _BV(TOV2);
+ cpu_time_ticks += 256;
+ if (cpu_time_ticks > TICKS_PER_SEC) {
+ cpu_time_ticks -= TICKS_PER_SEC;
+ cpu_time_sec++;
+ }
+ return TRUE;
+}
+#endif
+
+#endif /* SYS_TIME_HW_H */
Copied: paparazzi3/trunk/sw/airborne/arch/avr/uart_hw.c (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/uart_hw.c)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/uart_hw.c
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/uart_hw.c 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,258 @@
+/*
+ * Paparazzi $Id$
+ *
+ * Copyright (C) 2003 Pascal Brisset, Antoine Drouin
+ *
+ * This file is part of paparazzi.
+ *
+ * paparazzi is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * paparazzi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with paparazzi; see the file COPYING. If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+/** \file uart_hw.c
+ * \brief avr uart low level functions
+ *
+ */
+#include "uart.h"
+#include "sys_time.h"
+
+#define B2400 2400UL
+#define B9600 9600UL
+#define B38400 38400UL
+
+#if defined (__AVR_ATmega8__)
+
+#define TX_BUF_SIZE 256
+static uint8_t tx_head; /* next free in buf */
+static volatile uint8_t tx_tail; /* next char to send */
+static uint8_t tx_buf[ TX_BUF_SIZE ];
+
+/*
+ * UART Baud rate generation settings:
+ *
+ * With 16.0 MHz clock,UBRR=25 => 38400 baud
+ *
+ */
+
+void uart0_init_tx( void ) {
+ UBRRH = 0;
+ UBRRL = F_CPU/(16*UART0_BAUD)-1;
+
+ /* single speed */
+ UCSRA = 0;
+ /* Enable transmitter */
+ UCSRB = _BV(TXEN);
+ /* Set frame format: 8data, 1stop bit */
+ UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0);
+}
+
+void uart0_init_rx( void ) {
+ /* Enable receiver */
+ UCSRB |= _BV(RXEN);
+ /* Enable uart receive interrupt */
+ sbi( UCSRB, RXCIE );
+}
+
+bool_t uart0_check_free_space( uint8_t len) {
+ int8_t space;
+ if ((space = (tx_tail - tx_head)) <= 0)
+ space += TX_BUF_SIZE;
+
+ return (uint8_t)(space - 1) >= len;
+}
+
+void uart0_transmit( unsigned char data ) {
+ if (UCSRB & _BV(TXCIE)) {
+ /* we are waiting for the last char to be sent : buffering */
+ if (tx_tail == tx_head + 1) { /* BUF_SIZE = 256 */
+ /* Buffer is full (almost, but tx_head = tx_tail means "empty" */
+ return;
+ }
+ tx_buf[tx_head] = data;
+ tx_head++; /* BUF_SIZE = 256 */
+ } else { /* Channel is free: just send */
+ UDR = data;
+ sbi(UCSRB, TXCIE);
+ }
+}
+
+
+SIGNAL(SIG_UART_TRANS) {
+ if (tx_head == tx_tail) {
+ /* Nothing more to send */
+ cbi(UCSRB, TXCIE); /* disable interrupt */
+ } else {
+ UDR = tx_buf[tx_tail];
+ tx_tail++; /* warning tx_buf_len is 256 */
+ }
+}
+
+#endif /* (__AVR_ATmega8__) */
+
+
+#if defined (__AVR_ATmega128__)
+
+#define TX_BUF_SIZE 256
+
+#ifdef USE_UART0
+static uint8_t tx_head0; /* next free in buf */
+static volatile uint8_t tx_tail0; /* next char to send */
+uint8_t tx_buf0[ TX_BUF_SIZE ];
+
+uint16_t uart0_rx_insert_idx, uart0_rx_extract_idx;
+uint8_t uart0_rx_buffer[UART0_RX_BUFFER_SIZE];
+
+void uart0_init_tx( void ) {
+ UBRR0H = 0;
+ UBRR0L = F_CPU/(16*UART0_BAUD)-1;
+
+ /* single speed */
+ UCSR0A = 0;
+ /* Enable transmitter */
+ UCSR0B = _BV(TXEN);
+ /* Set frame format: 8data, 1stop bit */
+ UCSR0C = _BV(UCSZ1) | _BV(UCSZ0);
+
+ tx_head0 = 0;
+ tx_tail0 = 0;
+}
+
+void uart0_init_rx( void ) {
+ /* Enable receiver */
+ UCSR0B |= _BV(RXEN);
+
+ /* Enable uart receive interrupt */
+ sbi(UCSR0B, RXCIE );
+}
+
+bool_t uart0_check_free_space( uint8_t len) {
+ int8_t space;
+ if ((space = (tx_tail0 - tx_head0)) <= 0)
+ space += TX_BUF_SIZE;
+
+ return (uint16_t)(space - 1) >= len;
+}
+
+void uart0_transmit( unsigned char data ) {
+ if (UCSR0B & _BV(TXCIE)) {
+ /* we are waiting for the last char to be sent : buffering */
+ if (tx_tail0 == tx_head0 + 1) { /* BUF_SIZE = 256 */
+ /* Buffer is full (almost, but tx_head = tx_tail means "empty" */
+ return;
+ }
+ tx_buf0[tx_head0] = data;
+ tx_head0++; /* BUF_SIZE = 256 */
+ } else { /* Channel is free: just send */
+ UDR0 = data;
+ sbi(UCSR0B, TXCIE);
+ }
+}
+
+SIGNAL(SIG_UART0_TRANS) {
+ if (tx_head0 == tx_tail0) {
+ /* Nothing more to send */
+ cbi(UCSR0B, TXCIE); /* disable interrupt */
+ } else {
+ UDR0 = tx_buf0[tx_tail0];
+ tx_tail0++; /* warning tx_buf_len is 256 */
+ }
+}
+
+
+SIGNAL( SIG_UART0_RECV ) {
+ uart0_rx_buffer[uart0_rx_insert_idx] = UDR0;
+ uart0_rx_insert_idx = Uart0RxBufferNext(uart0_rx_insert_idx);
+}
+
+#endif /** USE_UART0 */
+
+#ifdef USE_UART1
+
+static uint8_t tx_head1; /* next free in buf */
+static volatile uint8_t tx_tail1; /* next char to send */
+static uint8_t tx_buf1[ TX_BUF_SIZE ];
+
+uint16_t uart1_rx_insert_idx, uart1_rx_extract_idx;
+uint8_t uart1_rx_buffer[UART1_RX_BUFFER_SIZE];
+
+void uart1_init_tx( void ) {
+ /* set baud rate */
+ UBRR1H = 0;
+ UBRR1L = F_CPU/(16*UART1_BAUD)-1;
+
+ /* single speed */
+ UCSR1A = 0;
+ /* Enable transmitter */
+ UCSR1B = _BV(TXEN);
+ /* Set frame format: 8data, 1stop bit */
+ UCSR1C = _BV(UCSZ1) | _BV(UCSZ0);
+
+ tx_head1 = 0;
+ tx_tail1 = 0;
+}
+
+void uart1_init_rx( void ) {
+ /* Enable receiver */
+ UCSR1B |= _BV(RXEN);
+ /* Enable uart receive interrupt */
+ sbi(UCSR1B, RXCIE );
+}
+
+bool_t uart1_check_free_space( uint8_t len) {
+ int8_t space;
+ if ((space = (tx_tail1 - tx_head1)) <= 0)
+ space += TX_BUF_SIZE;
+
+ return (uint16_t)(space - 1) >= len;
+}
+
+void uart1_transmit( unsigned char data ) {
+ if (UCSR1B & _BV(TXCIE)) {
+ /* we are waiting for the last char to be sent : buffering */
+ if (tx_tail1 == tx_head1 + 1) { /* BUF_SIZE = 256 */
+ /* Buffer is full (almost, but tx_head = tx_tail means "empty" */
+ return;
+ }
+ tx_buf1[tx_head1] = data;
+ tx_head1++; /* BUF_SIZE = 256 */
+ } else { /* Channel is free: just send */
+ UDR1 = data;
+ sbi(UCSR1B, TXCIE);
+ }
+}
+
+
+SIGNAL(SIG_UART1_TRANS) {
+ if (tx_head1 == tx_tail1) {
+ /* Nothing more to send */
+ cbi(UCSR1B, TXCIE); /* disable interrupt */
+ } else {
+ UDR1 = tx_buf1[tx_tail1];
+ tx_tail1++; /* warning tx_buf_len is 256 */
+ }
+}
+
+
+SIGNAL( SIG_UART1_RECV ) {
+ uart1_rx_buffer[uart1_rx_insert_idx] = UDR1;
+ uart1_rx_insert_idx = Uart0RxBufferNext(uart1_rx_insert_idx);
+}
+
+#endif /* USE_UART1 */
+
+#endif /* (__AVR_ATmega128__) */
+
+
Copied: paparazzi3/trunk/sw/airborne/arch/avr/uart_hw.h (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/uart_hw.h)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/uart_hw.h
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/uart_hw.h 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,108 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2005 Pascal Brisset, Antoine Drouin
+ *
+ * This file is part of paparazzi.
+ *
+ * paparazzi is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * paparazzi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with paparazzi; see the file COPYING. If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+/** \file uart_hw.h
+ * \brief avr uart low level headers
+ *
+ */
+
+#ifndef UART_HW_H
+#define UART_HW_H
+
+#include <avr/io.h>
+#if (__GNUC__ == 3)
+#include <avr/signal.h>
+#endif
+#include <avr/interrupt.h>
+#include "std.h"
+
+
+/************************************************************************/
+#if defined (__AVR_ATmega8__)
+
+#define ReceiveUart(cb) \
+ SIGNAL( SIG_UART_RECV ) { \
+ uint8_t c = UDR; \
+ cb(c); \
+}
+
+#endif /* (__AVR_ATmega8__) */
+
+
+/************************************************************************/
+#if defined (__AVR_ATmega128__)
+
+extern uint8_t tx_buf0[256]; /** For debugging purpose */
+
+extern void uart0_init_tx(void);
+extern void uart0_init_rx(void);
+extern void uart1_init(void);
+
+extern void uart0_transmit(const uint8_t);
+extern void uart1_transmit(const uint8_t);
+
+#define UART0_RX_BUFFER_SIZE 32 // UART0 receive buffer size
+#define UART1_RX_BUFFER_SIZE 32 // UART1 receive buffer size
+#define UART0_RX_BUFFER_SIZE_MASK 0x1f
+#define UART1_RX_BUFFER_SIZE_MASK 0x1f
+
+#ifdef UART0_RX_BUFFER_SIZE_MASK
+#define Uart0RxBufferNext(_x) ((_x+1)&UART0_RX_BUFFER_SIZE_MASK)
+#else
+#define Uart0RxBufferNext(_x) ((_x+1)%UART0_RX_BUFFER_SIZE)
+#endif
+
+#ifdef UART1_RX_BUFFER_SIZE_MASK
+#define Uart1RxBufferNext(_x) ((_x+1)&UART1_RX_BUFFER_SIZE_MASK)
+#else
+#define Uart1RxBufferNext(_x) ((_x+1)%UART1_RX_BUFFER_SIZE)
+#endif
+
+
+extern uint16_t uart0_rx_insert_idx, uart0_rx_extract_idx;
+extern uint8_t uart0_rx_buffer[UART0_RX_BUFFER_SIZE];
+
+#define Uart0ChAvailable() (uart0_rx_insert_idx != uart0_rx_extract_idx)
+
+#define Uart0Getch() ({\
+ uint8_t ret = uart0_rx_buffer[uart0_rx_extract_idx]; \
+ uart0_rx_extract_idx = Uart0RxBufferNext(uart0_rx_extract_idx); \
+ ret; \
+})
+
+
+extern uint16_t uart1_rx_insert_idx, uart1_rx_extract_idx;
+extern uint8_t uart1_rx_buffer[UART1_RX_BUFFER_SIZE];
+
+#define Uart1ChAvailable() (uart1_rx_insert_idx != uart1_rx_extract_idx)
+
+#define Uart1Getch() ({\
+ uint8_t ret = uart1_rx_buffer[uart1_rx_extract_idx]; \
+ uart1_rx_extract_idx = Uart1RxBufferNext(uart1_rx_extract_idx); \
+ ret; \
+})
+
+#endif /* (__AVR_ATmega128__) */
+
+#endif /* UART_HW_H */
Copied: paparazzi3/trunk/sw/airborne/arch/avr/uart_tunnel.c (from rev 5938,
paparazzi3/trunk/sw/airborne/avr/uart_tunnel.c)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/avr/uart_tunnel.c
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/avr/uart_tunnel.c 2010-09-23 23:06:26 UTC
(rev 5939)
@@ -0,0 +1,61 @@
+#include <inttypes.h>
+#include <avr/io.h>
+#if (__GNUC__ == 3)
+#include <avr/signal.h>
+#endif
+#include <avr/interrupt.h>
+
+#define UART_PC_PORT PORTE
+#define UART_PC_DDR DDRE
+#define UART_PC_PIN PINE
+#define UART_PC_TX 1
+#define UART_PC_RX 0
+
+#define UART_PERPH_PORT PORTD
+#define UART_PERPH_DDR DDRD
+#define UART_PERPH_PIN PIND
+#define UART_PERPH_TX 3
+#define UART_PERPH_RX 2
+
+#ifndef cbi
+#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
+#endif
+#ifndef sbi
+#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
+#endif
+
+
+int main( void ) {
+
+ /* setup PC_TX as output */
+ UART_PC_DDR |= _BV(UART_PC_TX);
+
+ /* setup PC_RX as input, no pullup */
+ UART_PC_DDR &= ~_BV(UART_PC_RX);
+ UART_PC_PORT &= ~_BV(UART_PC_RX);
+
+ /* setup PERPH_TX as output */
+ UART_PERPH_DDR |= _BV(UART_PERPH_TX);
+
+ /* setup PERPH_RX as input, no pullup */
+ UART_PERPH_DDR &= ~_BV(UART_PERPH_RX);
+ UART_PERPH_PORT &= ~_BV(UART_PERPH_RX);
+
+ while(1)
+ {
+ if (bit_is_set(UART_PERPH_PIN, UART_PERPH_RX)) {
+ sbi(UART_PC_PORT, UART_PC_TX);
+ } else {
+ cbi(UART_PC_PORT, UART_PC_TX);
+ }
+ if (bit_is_set(UART_PC_PIN, UART_PC_RX)) {
+ sbi(UART_PERPH_PORT, UART_PERPH_TX);
+ } else {
+ cbi(UART_PERPH_PORT, UART_PERPH_TX);
+ }
+
+ }
+
+ return 0;
+
+}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [paparazzi-commits] [5939] moved avr to arch dir,
Felix Ruess <=