Subversion Repositories Projects

Rev

Blame | Last modification | View Log | RSS feed


/****************************************************************/
/*                                                                                                                              */
/*                               NG-Video 5,8GHz                                                        */
/*                                                                                                                              */
/*                              Copyright (C) 2011 - gebad                                              */
/*                                                                                                                              */
/*  This code is distributed under the GNU Public License               */
/*      which can be found at http://www.gnu.org/licenses/gpl.txt       */
/*                                                                                                                              */
/****************************************************************/

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

#include "servo.h"
#include "config.h"
#include "dogm.h"
#include "keys.h"
#include "ngvideo.c"
#include "menue.c"
#include "usart.h"


int main(void)
{ uint8_t ep_reset = 1;
  uint8_t val;

  _delay_ms(100);  // Einschaltstörungen unterdrücken

  DDRB |= (1<<POWER);
  PORTB &= ~(1<<POWER); //NOT(SHDN) LT1776

  // switch init
  KEY_MP_DDR &= ~((1<<KEY_MINUS) | (1<<KEY_PLUS));
  KEY_ENTER_DDR &= ~((1<<KEY_ENTER));
 
  // auf default rücksetzen - Tasten direkt lesen, da noch kein Interrupt
  if( !(KEY_MP_PIN & ((1<<KEY_MINUS) | (1<<KEY_PLUS))))
    --ep_reset;

  Init_EEPROM(ep_reset);

   // auf DOGM 5V/3,3V rück-/setzen - Tasten direkt lesen, da noch kein Interrupt
  if(!((KEY_ENTER_PIN & (1<<KEY_ENTER)) || (KEY_MP_PIN & (1<<KEY_PLUS))))
    Set_DOGM_Version();

  DDRA |= (1<<CHANNel_12) | (1<<CHANNel_11) | (1<<CHANNel_10) | (1<<MUX_IN) | (1<<MUX_EN);
  DDRB |= (1<<BEEPER) | (1<<CHANNel_02) | (1<<CHANNel_01) | (1<<CHANNel_00);
  Set_Channel(channel);
  ch_stored = channel;
  PORTA &= ~(1<<MUX_EN);                                // MUX enable

  ADC_Init();
   
  // Timer 0 für Tasten und Anzeigen(Task's)
  TCCR0B = (1<<CS02)|(1<<CS00);         // divide by 1024
  TIMSK0 |= 1<<TOIE0;                                   // 8 bit Timer/Counter0 Overflow Interrupt aktiviert

  // Timer 2 für Diversity vSync und GPS-Tracking MK Datensatz senden
  TCCR2B = (1<<CS21) | (1<<CS20);               // divide by 64
  TIMSK2 |= 1<<TOIE2;                                   // 8 bit Timer/Counter2 Overflow Interrupt aktiviert

  // Interrupt für sync - RX-Umschaltung bei Diversity
  DDRD &= ~((1<<VSYNC1) | (1<<VSYNC0));
  //EICRA |= (1<<ISC11) | (1<<ISC10) | (1<<ISC01) | (1<<ISC00);// interrupt on INT0 and INT1 pin rising edge
  EICRA |= (1<<ISC11) | (1<<ISC01);     // interrupt on INT0 and INT1 pin falling edge
  Set_AV_Source(av_source);                             // MUX auf av-x setzen; EIMSK Int0 und Int1 für Sync-Diversity ein

  DDRD |= (1<<SERVO1) | (1<<SERVO2);    // Servoports als Ausgang
  if (tracking > TRACKING_MIN)                  // Servos sind nur bei Tracking und Servokalibrierung zugeschaltet
    servoInit(SERVO_PERIODE);

  // LCD init
  lcdInit(dogm_vers, contrast, 0, 0);
  lcd_BackgrLight_On();
  lcdWriteCGRAM_Array(lcdSpecialChr, 7);

  Displ_Version();
  Double_Beep(DBEEPVERS, DBEEPVERSP);

  sei();

  if (language == NO_LANGUAGE) {
    language = GERMAN;                  // Beim Einschalten pmenu[] vordefiniert mit "0"
    Menu_Language();
  }
  pmenu[0] = '\0';                              // falls GPS-Antennennachführung ==> Empfang blinken

  Displ_Main_Disp();

  while(1)
  {
    if (pmenu[0] == '\0') {     // nur wegen Menu_MK_BatteryChangeNr()
          Task_0_1();
      Task_0_2();
        }
    Tasks_unvisible();
    if (bat_low != 0) {
      if (Get_Key_Short( 1<<SW_ENTER )) {
        m_pkt = 1;                              // 0 wäre "zurück", so aber ins Untermenü immer erster Menüpunkt
        Menu_Main();
      }
      val = Change_Value_plmi(channel, CHANNEL_MIN, CHANNEL_MAX, 0, 0, Displ_Channels, 1, C_REPEAT);
      if (val != channel) {     // nicht bei jeden Schleifendurchlauf Set_Channel()
        channel = val;
        Set_Channel(channel);
      }
    }
  }
}