// Autor: Michael Kinz
// michael@team-iwan.de

program Konrad_web_2;

{ $BOOTRST $00C00}         {Reset Jump to $00C00}
{$NOSHADOW}
{ $W+ Warnings}            {Warnings off}

Device = mega8, VCC = 4;

Import SysTick, RC5Rxport;

From System Import;

Define
  ProcClock      = 8000000;        {Hertz}
  SysTick        = 10;             {msec}
  StackSize      = $0064, iData;
  FrameSize      = $0064, iData;
  RC5RxPort      = PinD, 2; //, negative;
  RC5mode        = rc_6bit;        {command bit count}

Implementation


{$IDATA}

{--------------------------------------------------------------}
{ Type Declarations }

type


{--------------------------------------------------------------}
{ Const Declarations }
structconst  {constant in Rom, at startup copied into Ram}
  Table1         : array[0..25] of word = (1023, 890, 770, 674, 593, 532, 472, 436, 402, 376, 347, 322, 303, 287, 271, 256, 240, 234, 219, 211, 203, 196, 189, 174, 167, 163);
  Table2         : array[1..6] of byte = (0, 0, 0, 0, 0, 0);

{--------------------------------------------------------------}
{ Var Declarations }
{$IDATA}
var
  LEDgr[@PortC, 5]     : bit;
  LEDro[@PortC, 4]     : bit;
  Taster[@PinC, 3]     : bit;

  ADC1           : word;
  ADC1_lo[@ADC1] : byte;
  ADC1_hi[@ADC1 + 1]   : byte;
  ADCsh          : word;
  ADCsh_lo[@ADCsh]     : byte;
  ADCsh_hi[@ADCsh + 1]       : byte;
  ADz            : word;
  Sz             : integer;
  tempw          : word;
  a              : word;
  sharpr         : word;


  ADCvh          : word;
  ADCvh_lo[@ADCvh]     : byte;
  ADCvh_hi[@ADCvh + 1]       : byte;

  sharpv         : word;


  Richtung       : integer;
  links          : integer;
  rechts         : integer;
  speed          : integer;
  winkel         : integer;
  forz           : integer;


  sharpr_alt     : word;
  sharpv_alt     : word;
  tz             : byte;
  e              : byte;
  f              : byte;
  MR[@PortB, 0]  : bit;
  MRon[@PortD, 5]      : bit;
  MLon[@PortD, 6]      : bit;
  ML[@PortD, 7]  : bit;

  RC5[@PinD, 2]  : bit;
  rxAdr          : byte;
  rxCmd          : byte;
  hilfsbyte      : byte;
  rc5flag[@hilfsbyte, 0]     : bit;
  flagvor[@hilfsbyte, 1]     : bit;
{--------------------------------------------------------------}
{ functions }
procedure InitPorts;
begin
  PortB:= %00000000;
  DDRB:=  %00000001;
  DDRC:= %00110000;
  DDRD:= %11100000;
  PortC:= %00001000;
  PortD:= %00000000;
end InitPorts;
procedure initadc;
begin
  ADMUX := %11000001;
  ADCSRA := %11000101;
while (ADCSRA and %01000000) > 0 do endwhile;
end initadc;
procedure md;
begin
  mdelay(100);
  mdelay(100);


end md;
procedure mdk;
begin
  mdelay(20);



end mdk;
procedure vorre;
begin
//  MRX := 0;
//  MRY := 1;
  e:= 26;
end vorre;
procedure ruere;
begin
//  MRX := 1;
// MRY := 0;
  e:= 27;
end ruere;
procedure vorli;
begin
//  MLX := 1;
//  MLY := 0;
  f:= 26;
end vorli;
procedure rueli;
begin
//  MLX := 0;
//  MLY := 1;
  f:= 27;
end rueli;
procedure Spannungsanzeige;
begin
//  ADC1:= GetAdc(2);
  ADMUX := %11000001;
  ADCSRA := %11000101;
while (ADCSRA and %01000000) > 0 do endwhile;


  ADC1_lo := ADCL;
  ADC1_hi := ADCH;
  //771 = 3,99V
  //das heißt: 4,2V = 811
  //2,5V = 483
  //Differenz =   328
  //adz := integer(adc1) - 483;
  if adc1 < 483 then
    ledgr := 0;
    ledro:= 1;
  else
    adz := adz + 1;
    if adz < adc1 then
      ledgr := 1;
      ledro := 0;
    else
      ledgr := 0;
      ledro := 1;
    endif;
    if adz > 811 then
      adz := 483;
    endif;




  endif;



End Spannungsanzeige;
procedure sharplesen;
begin
  ADMUX := %11000110;
  ADCSRA := %11000101;
while (ADCSRA and %01000000) > 0 do endwhile;
  ADCsh_lo := ADCL;
  ADCsh_hi := ADCH;

  ADMUX := %11000111;
  ADCSRA := %11000101;
while (ADCSRA and %01000000) > 0 do endwhile;
  ADCvh_lo := ADCL;
  ADCvh_hi := ADCH;
  //0 1023
//1 890
//2 770
//3 674
//4 593
//5 532
//6 472
//7 436
//8 402
//9 376
//10 347
//11 322
//12 303
//13 287
//14 271
//15 256
//16 240
//17 234
//18 219
//19 211
//20 203
//21 196
//22 189
//23 174
//24 167
//25 163
  tz := 0;
  if adcsh > 162 then

    sharpr := table1[tz];





    while adcsh < table1[tz] do

      tz := tz + 1;
    endwhile;
    sharpr := word(tz);


  else
    sharpr := 26;
  endif;

  tz := 0;
end sharplesen;

procedure auswert;
begin
  rxCmd:= rxCmd and $3F;
  rxadr:= rxadr and $1F;
  if rxAdr = 13 then
    if rxcmd = 28 then
      rc5flag := 1;
    endif;




  else
    rc5flag := 0;
  endif;


end auswert;

{--------------------------------------------------------------}
{ Main Program }
{--------------------------------------------------------------}
{ Main Program }
{--------------------------------------------------------------}
{ Main Program }

{$IDATA}

begin


  EnableInts;
  initports;
  initadc;

  mr := 1;
  ml := 1;
  mlon := 0;
  mron := 0;
  md;
  md;
  md;
  md;

   rechts := 200;
      links := 200;
  
  
//  MR := 1;
//  ML := 1;
  speed := 328;
  md;
  md;
  
  flagvor :=1 ;
  
  
  

  
   repeat
    Spannungsanzeige;
    if RecvRC5(rxAdr, rxCmd) then
      auswert;
    endif;
   MR := 0;
  ML := 0;
  until not Taster or rc5flag;
  MR := 1;
  ML := 1;
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//----------------------- Wand finden ------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
  
  repeat
  
    adz := 483;
//for sz := 0 to  328   do
//   Spannungsanzeige;

//endfor;
    ledgr := 0;
    // ledro := 0;

    Sharplesen;
    winkel := 0;
    winkel := integer(sharpr) - integer(sharpr_alt);     //negativer Winkel -> nach links


    richtung := integer(sharpr) - 4;
    winkel := winkel + richtung;
    winkel := winkel * 40;
    if winkel > 0 then
      //    rechts := speed - winkel;
      //    links := speed;
    else
      //    links := speed + winkel;
      //    rechts := speed;
    endif;
    if winkel = 0 then
      //    rechts := speed;
      //    links := speed;
    endif;

// Ecke
    if adcvh > 900 then


      flagvor := 0;
      ml := 0;

    else

      ml := 1;
    endif;

//Ecke ende

    for forz := 0 to 328 do
      if rechts > forz then
        mron := 1;
      else
        mron := 0;
      endif;
      if links > forz then
        mlon := 1;
      else
        mlon := 0;
      endif;

      spannungsanzeige;

    endfor;
    sharpr_alt := sharpr;

    if not taster then
      md;
      md;
      System_Reset;
    endif;
    until not flagvor ;
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//----------------------- Hauptprogramm Wandfahren -----------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
    
  loop
     adz := 483;

    ledgr := 0;


    Sharplesen;
    winkel := 0;
    winkel := integer(sharpr) - integer(sharpr_alt);     //negativer Winkel -> nach links


    richtung := integer(sharpr) - 4;
    winkel := winkel + richtung;
    winkel := winkel * 40;
    if winkel > 0 then
          rechts := speed - winkel;
         links := speed;
    else
          links := speed + winkel;
         rechts := speed;
    endif;
    if winkel = 0 then
        rechts := speed;
       links := speed;
    endif;

   if rechts > 328 then
   rechts := 328;
   endif;
   if links > 328 then
   links := 328;
   endif;




// Ecke
    if adcvh > 900 then
          rechts := 200;
      links := 200;

      ml := 0;

    else

      ml := 1;
    endif;

//Ecke ende

    for forz := 0 to 328 do
      if rechts > forz then
        mron := 1;
      else
        mron := 0;
      endif;
      if links > forz then
        mlon := 1;
      else
        mlon := 0;
      endif;

      spannungsanzeige;

    endfor;
    sharpr_alt := sharpr;

    if not taster then
      md;
      md;
      System_Reset;
    endif;




  endloop;
end Konrad_web_2.


