Prototype Code

From $1

    Table of contents
    No headers

    /*********************************************

    Project : ATmega128_MT

    Version : 01

    Date    : 14.1.2007

    Author  : Slavcho TOmov  - altered by Paul McIntosh              

    Company : Olimex                           

    Comments: Demo program

     

     

    Chip type           : ATmega128

    Program type        : Application

    Clock frequency     : 16,000000 MHz

    Memory model        : Small

    External SRAM size  : 0

    Data Stack size     : 1024

    *********************************************/

    #include <avr/io.h>

    // #include <avr/iom128.h>

    #include <avr/interrupt.h>

     

    #include <stdio.h>

    #include "system.h"

    #include "bits.h"

    #include "lcd.h"

    #include "delay.h"

                                                           

     

    #define              B1                         (PINA&BIT0) 

    #define              B2                         (PINA&BIT1)

    #define              B3                         (PINA&BIT2)

    #define              B4                         (PINA&BIT3)

    #define              B5                          (PINA&BIT4)

     

     

    #define       RELAY_HIGH           PORTA |= BIT6

    #define       RELAY_LOW            PORTA &= ~BIT6                            

     

    #define              TXD                        (PIND&BIT3)  

    #define              RXD                        (PIND&BIT2)  

    #define              DALLAS               (PINA&BIT5)

        

    unsigned char ch;

    int wheelSensorTiggered = 0;                           // rising edge trigger for wheelsensor (debounce needed?)

    double volatile wheelSensorPeriodms = 0; // measure ms since last sensor trigger

    double volatile lastWheelSensorPeriodms = 0;// last measure ms since last sensor trigger

    double volatile wheelDiameter = 1.354;                        // metre measureed around tyre 1354mm Vespa PX Sava MC18

    double volatile speedmps = 0;                          // internally we'll use m/s for keeping track of speed

    double volatile lastSpeedmps = 0;                             // keep the last reading for keeping a track of acceleration

    int triggerCount = 0;                                         // int speedkmhr = 0;

    int flash = 0;

    int volatile vespaMass = 110;                                        // Kg (wet weight)

    int volatile riderMass = 100;                                        // Kg (rider plus gear)

    double volatile maxKWpositive = 0;              // Highest positive reading of KW based on change in speed

    double volatile lastKWpositive = 0;                    // Last positive reading of KW based on change in speed

    double volatile maxKWnegative = 0;              // Highest negative reading of KW based on change in speed

    double volatile lastKWnegative = 0;                    // Last negative reading of KW based on change in speed

     

    int main(void) {    

     

           //Ports

           InitPorts();

     

           // Enable Interupts

           InterruptInit();

     

           // 1 second timer for display updates

           TCCR1B |= (1 << WGM12); // Configure timer 1 for CTC mode

           TCCR1B |= ((1 << CS10) | (1 << CS12)); // Start timer at Fcpu/1024

           OCR1A   = 15625; // Set CTC compare value to 1Hz at 16MHz AVR clock, with a prescaler of 1024

     

           // A timer for speed measurement

           //  (may decrease this later for more accurate measurement)

           TCCR3B |= ((1 << CS30) | (1 << CS32)); // Start timer at Fcpu/1024

                                 

           //LCD initialisation

           LCD_Ini();                                    

           // delay_ms(2);           

           SEND_CMD(DISP_ON);

           // delay_ms(10);                                      

           SEND_CMD(CLR_DISP);

           // write

     

           char  buf[14];

           sprintf(buf, "Vespa Labs");

           SEND_STR(buf);

           delay_ms( 200 );

     

           while (1)

           { 

                  if (B4==0) // reset max values

                  {

                         maxKWpositive = 0;

                         maxKWnegative = 0;

                         SEND_CMD(CLR_DISP);

                  }

     

                  if (TIFR & (1 << OCF1A))

          {

                         if (flash)

                         {

                               sprintf(buf, "km/hr: %3.1f %3.1f %3.1f ", speedmps*60*60/1000,maxKWpositive*1.341,maxKWnegative*1.341);//(speedmps/1000*60*60));

                               flash = 0;

                         }

                         else

                         {

                               sprintf(buf, "km/hr  %3.1f %3.1f %3.1f ", speedmps*60*60/1000,maxKWpositive*1.341,maxKWnegative*1.341);//(speedmps/1000*60*60));

                               flash = 1;

                         }

                         SEND_STR(buf);

                  TIFR = (1 << OCF1A); // clear the CTC flag (writing a logic one to the set flag clears it)

          }

           }

    }

     

    //-------------------------------

    // Initialize External Interrupts

    //-------------------------------

    void InterruptInit()

    {

           EIMSK |= (0 << INT0);   // disable interrupt INT0 in external interrupt mask

          

           DDRD |= (0 << DDD0);    // enable Port D, pin 0 (INT0) for input

           EICRA |= (1 << ISC01) | (0 << ISC00);   // falling edge generates interrupt

           // set port pin for internal pull up, so only when switch grounds out should this interrupt

           PORTD &= 0xff;  

          

           EIFR  = (1 << INTF0 );  // clear interrupt flag for INT0 before setting mask

           EIMSK |= (1 << INT0);   // enable interrupt INT0 in external interrupt mask

     

           sei();

     

    } // InterruptInit()

     

    //-------------------------------

    // Wheel Sensor Interrupt

    //-------------------------------

    ISR (INT0_vect)

    {

           cli();                                   // disable interrupts    

            

          

           // Measure wheel sensor period and reset the clock                                                                  

           wheelSensorPeriodms = TCNT3 / 15.625;    // calculated time to revolve in ms

           TCNT3 = 0;

                                                                  // Reset timer value

           // Calculate speed in metres per second                                                               

           speedmps = 1000/wheelSensorPeriodms * wheelDiameter;

                 

           // Determine KW from change in speed (letting compiler optimize this to make it easier to read)

           double acceleration = (speedmps - lastSpeedmps)/(wheelSensorPeriodms + lastWheelSensorPeriodms) * 1000; // metres second per second

           double newtons = (vespaMass + riderMass) * acceleration;     

           double KWatts = (newtons * ((lastSpeedmps + speedmps)/2))/1000;

           if (KWatts >= 0 && KWatts > maxKWpositive) maxKWpositive = KWatts;

           if (KWatts <= 0 && KWatts < maxKWnegative) maxKWnegative = KWatts;

           EIFR  |= (1 << INTF0 );  // clear interrupt flag for INT0, ya it's odd to write a 1 to clear it, but that's AVR

          

           // Keep a track of last value for other measurements

           lastSpeedmps = speedmps;

           lastWheelSensorPeriodms = wheelSensorPeriodms;

     

           //debounce delay

           int i = 1000;

           while (--i!=0);

     

           sei();

     

    } // ISR (INT0_vect)

     

     

    </body> </html>

    Tags: (Edit tags)
    • No tags
     
    Comments (0)
    You must login to post a comment.

     
    Powered by MindTouch Core

    Disclaimer: Vespa Labs contains information that is VERY likely to wreck your scooter and possibly yourself both intentionally (i.e. gaining more peformance while sacrificing reliability + safety) and unintentionally (i.e. misleading or incorrect information). Vespa Labs is only a wiki and intended as a dumping ground for information and not as a properly reviewed source. The same disclaimers that wikipedia.org use apply to Vespa Labs. The short version is use information at your own risk, both information on the main wiki and in the user areas are intended to be used only as "thought provoking" for someone that knows what they are doing. If you try to implement a "thought" Vespa Labs is not reponsible and if something goes wrong we hope that you live and update the offending information with corrections to warn others.

    Vespa Labs is an international site and therefore may contain information that is not road legal in some countries/states and may also invalidate insurance policies. Treat all information as experimental and for "race use only" (i.e. not for road use - even if it is implied or explicitly stated). Refer to and adhere to your local road and legal rules, as well as the manufacturers recommendations.