Subversion Repositories Projects

Rev

Rev 297 | Blame | Last modification | View Log | RSS feed

#include <avr/boot.h>

#include <avr/io.h>
#include <avr/interrupt.h>

#include "main.h"
#include "timer0.h"
#include "uart0.h"
#include "uart1.h"
#include "fat16.h"
#include "led.h"
#include "menu.h"
#include "printf_P.h"
#include "analog.h"
#include "ubx.h"
#include "button.h"

#ifdef USE_FOLLOWME
int16_t UBat = 120;
int16_t Zellenzahl = 0;
int16_t PowerOn = 0;
int16_t i = 0;
int16_t delay = 0;
#endif

#define GPS_RX_TIMEOUT  0x0001


int main (void)
{
        static uint16_t GPS_Timer = 0;
        static uint16_t Error = 0;

        // disable interrupts global
        cli();

        // disable watchdog
    MCUSR &=~(1<<WDRF);
    WDTCSR |= (1<<WDCE)|(1<<WDE);
    WDTCSR = 0;

        // initalize modules
        LED_Init();
        LEDRED_ON;
    TIMER0_Init();
        USART0_Init();
        UBX_Init();
        USART1_Init();
        ADC_Init();
        Button_Init();
        // enable interrupts global
        sei();

        LEDRED_OFF;
        #ifdef USE_FOLLOWME
        LEDGRN_ON;
        #endif

        // try to initialize the FAT 16 filesystem on the SD-Card
        Fat16_Init();

        #ifdef USE_SDLOGGER
        printf("\r\n\r\nHW: SD-Logger");
        #endif
        #ifdef USE_FOLLOWME
        printf("\r\n\r\nHW: Follow-Me");
        #endif
        printf("\r\nFollow Me\n\rSoftware:V%d.%d%c ",VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH + 'a');
        printf("\r\n------------------------------");
        printf("\r\n");


        #ifdef USE_FOLLOWME
        //BeepTime = 2000;
        #endif

    LCD_Clear();

        GPS_Timer = SetDelay(1000);
        while (1)
        {
                // check for button action
                if(GetButton())
                {
                        BeepTime = 200;
                        Fat16_Init();

                }

                // restart ADConversion if ready
                if(ADReady)
                {
                        DebugOut.Analog[0] = Adc0;
                        DebugOut.Analog[1] = Adc1;
                        DebugOut.Analog[2] = Adc2;
                        DebugOut.Analog[3] = Adc3;
                        DebugOut.Analog[4] = Adc4;
                        DebugOut.Analog[5] = Adc5;
                        DebugOut.Analog[6] = Adc6;
                        DebugOut.Analog[7] = Adc7;

                        #ifdef USE_FOLLOWME
                        // AVcc = 5V --> 5V = 1024 counts
                        // the voltage at the voltage divider reference point is 0.8V less that the UBat
                        // because of the silicon diode inbetween.
                        // voltage divider R2=10K, R3=3K9
                        // UAdc4 = R3/(R3+R2)*UBat= 3.9/(3.9+10)*UBat = UBat/3.564
                        UBat = (3 * UBat + (64 * Adc4) / 368) / 4;
                        DebugOut.Analog[8] = UBat;
                       
                        // check for zellenzahl
                        if(PowerOn < 100)
                        {
                                if(UBat<=84) Zellenzahl = 2;
                                else Zellenzahl = 3;
                                PowerOn++;
                        }
                        DebugOut.Analog[16] = Zellenzahl;
                        DebugOut.Analog[17] = PowerOn;
                       
                        //show recognised Zellenzahl to user
                        if(i < Zellenzahl && PowerOn >= 100 && BeepTime == 0 && delay > 1000)
                        {
                                BeepTime = 100;
                                i++;
                                delay = 0;
                        }
                        if(delay < 1500) delay++;
                       
                        // monitor battery undervoltage
                        if(UBat < Zellenzahl * 31 && PowerOn >= 100) BeepTime = 200;
                        #endif
                        ADReady = 0;
                        ADC_Enable(); // restart ad conversion sequence
                }


                if(GPSData.Status == NEWDATA)
                {
                        Error &= ~GPS_RX_TIMEOUT;       // clear possible error
                        GPS_Timer = SetDelay(1000); // reset timeout
                        if(CheckGPSOkay >= 5)
                        {
                                // trigger transmission of FollowMe message here.

                                CheckGPSOkay = 0;
                        }
                        GPSData.Status = PROCESSED;
                }
                else // invalid or already processed
                {
                        if(CheckDelay(GPS_Timer))
                        {
                                Error |= GPS_RX_TIMEOUT;
                        }
                }

                USART0_ProcessRxData();
                USART0_TransmitTxData();
    }
        return (1);
}