program Sharp_sensor_master;
// Bilderzeugung mittels Sharp-IR-Sensor, Master Programm
// Michael Kinz
// www.team-iwan.de

{ $BOOTRST $00C00}         {Reset Jump to $00C00}
{$NOSHADOW}
{ $W+ Warnings}            {Warnings off}

Device = mega8, VCC = 5;

Import SysTick, SerPort, PWMport1A, PWMport1B, ADCPort, TWInet;

From System Import;

Define
  ProcClock      = 16000000;        {Hertz}
  SysTick        = 10;             {msec}
  StackSize      = $00128, iData;
  FrameSize      = $00128, iData;
  SerPort        = 9600, Stop2;    {Baud, StopBits|Parity}
  RxBuffer       = 8, iData;
  TxBuffer       = 8, iData;
  ADCchans       = [7, 8], iData;
  ADCpresc       = 8;
  PWMres1        = 8;              {bits}
  PWMpresc1      = 1;
  TWInetMode     = Master;
  TWInode        = 02;             {default address in slave mode}
  TWIpresc       = TWI_BR100;              {Bitrate}
  TWIframe       = 8, iData;       {buffer/packet size}

Implementation

{$IDATA}

{--------------------------------------------------------------}
{ Type Declarations }

type


{--------------------------------------------------------------}
{ Const Declarations }
const
//  LF             : ^J;


{--------------------------------------------------------------}
{ Var Declarations }
{$IDATA}
var
  LED[@Portb, 5] : bit;   //nur zum Test f. Programmdurchlaufzeit
  Taste1[@PinD, 3]     : bit;
  ADC1           : word;
  ADC0           : word;
  admax          : word;
  admin          : word;
  i              : byte;
  j              : byte;
  k              : byte;
  x              : word;
  xl[@x]         : byte;
  y              : word;
  zaehler        : word;
  waitv          : word;
  tempw          : word;
  temp[@tempw]   : byte;
  Hilfsvariable  : byte;
  richtung[@Hilfsvariable, 0]: bit;
  M8slave        : array[1..8] of byte;
  Ar1            : array[0..2] of byte;
  bla_slave      : byte;
  St1            : string[6];  {string mit Länge 6}
  St2            : string[5];
  st3            : string[3];
  st4            : string[4];
  st01           : string[1];
  st02           : string[2];
  hilfsvar       : byte;
  slavey         : byte;
  fehler         : byte;
  Flag0[@Hilfsvar, 0]  : bit;
{--------------------------------------------------------------}
{ functions }

procedure InitPorts;
begin
  DDRB:=  %00100111;
  DDRC:=  %00000001;
  DDRD:=  %11110001;
  portd:= %11111000;
end InitPorts;
procedure motor;
begin
  if i > 32 then
    i := 1;
  endif;
  if i < 1 then
    i := 32;
  endif;


//Sindata2:
//Data 255 , 200 , 157 , 113 , 75 , 43 , 19 , 5 , 0 ,

  Case i of
    1  : portd := %10100000;
         PWMport1A:= 255;
         PWMport1B:= 0;
         led := 1;
       |
    2  : portd := %10100000;
         PWMport1A:= 200;
         PWMport1B:= 5;
       |
    3  : portd := %10100000;
         PWMport1A:= 157;
         PWMport1B:= 19;
       |
    4  : portd := %10100000;
         PWMport1A:= 113;
         PWMport1B:= 43;
       |
    5  :  portd := %10100000;
         PWMport1A:= 75;
         PWMport1B:= 75;
       |
    6  : portd := %10100000;
         PWMport1A:= 43;
         PWMport1B:= 113;
       |
    7  : portd := %10100000;
         PWMport1A:= 19;
         PWMport1B:= 157;
       |
    8  :     portd := %10100000;
         PWMport1A:= 5;
         PWMport1B:= 200;
       |
    //Data 255 , 200 , 157 , 113 , 75 , 43 , 19 , 5 , 0 ,
    9  :      portd := %01100000;
         PWMport1A:= 0;
         PWMport1B:= 255;
       |
    10 :      portd := %01100000;
         PWMport1A:= 5;
         PWMport1B:= 200;
       |
    11 :      portd := %01100000;
         PWMport1A:= 19;
         PWMport1B:= 157;
       |
    12 :      portd := %01100000;
         PWMport1A:= 43;
         PWMport1B:= 113;
       |
    13 :      portd := %01100000;
         PWMport1A:= 75;
         PWMport1B:= 75;
       |
    14 :      portd := %01100000;
         PWMport1A:= 113;
         PWMport1B:= 43;
       |
    15 :      portd := %01100000;
         PWMport1A:= 157;
         PWMport1B:= 19;
       |
    16 :      portd := %01100000;
         PWMport1A:= 200;
         PWMport1B:= 5;
         led := 0;
       |
    17 :      portd := %01010000;
         PWMport1A:= 255;
         PWMport1B:= 0;
       |
//Data 255 , 200 , 157 , 113 , 75 , 43 , 19 , 5 , 0 ,
    18 :      portd := %01010000;
         PWMport1A:= 200;
         PWMport1B:= 5;
       |
    19 :      portd := %01010000;
         PWMport1A:= 157;
         PWMport1B:= 19;
       |
    20 :      portd := %01010000;
         PWMport1A:= 113;
         PWMport1B:= 43;
       |
    21 :      portd := %01010000;
         PWMport1A:= 75;
         PWMport1B:= 75;
       |
    22 :      portd := %01010000;
         PWMport1A:= 43;
         PWMport1B:= 113;
       |
    23 :      portd := %01010000;
         PWMport1A:= 19;
         PWMport1B:= 157;
       |
    24 :      portd := %01010000;
         PWMport1A:= 5;
         PWMport1B:= 200;
       |
//Data 255 , 200 , 157 , 113 , 75 , 43 , 19 , 5 , 0 ,
    25 :      portd := %10010000;
         PWMport1A:= 0;
         PWMport1B:= 255;
       |
    26 :      portd := %10010000;
         PWMport1A:= 5;
         PWMport1B:= 200;
       |
    27 :      portd := %10010000;
         PWMport1A:= 19;
         PWMport1B:= 157;
       |
    28 :      portd := %10010000;
         PWMport1A:= 43;
         PWMport1B:= 113;
       |
    29 :      portd := %10010000;
         PWMport1A:= 75;
         PWMport1B:= 75;
       |
    30 :      portd := %10010000;
         PWMport1A:= 113;
         PWMport1B:= 43;
       |
    31 :      portd := %10010000;
         PWMport1A:= 157;
         PWMport1B:= 19;
       |
    32 :      portd := %10010000;
         PWMport1A:= 200;
         PWMport1B:= 5;
       |
  EndCase;
end motor;


procedure ADlesen;
begin
  adc0:= 0;
  for j := 1 to 16 do
    ADC1:= GetAdc(7);
    mdelay(1);
    ADC0:= ADC0 + ADC1;
  endfor;



//  Write(SerOut, 'X =' + intToStr(x : 4) + ' : ' + 'Y =' + intToStr(y : 4) + ' Bla Slave =' + byteToStr(bla_slave : 3) + inttostr(ADC1) + ^J + ^M ); {-> '   100'}
//  Write(SerOut, 'AD1 =' + intToStr(ADC1 : 4) + ' AD0 =' + intToStr(ADC0 : 4)  );

  adc0:= adc0 div 16;
  if admax < adc0 then
    admax := adc0;
  endif;
  if admin > adc0 then
    admin := adc0;
  endif;
// D = A/(X-B)
// D Endwert
// A = 50769
// B = 9
  if adc0 > 9 then
    tempw  := adc0 - 9;
    tempw := 50769 div tempw;
  else
    tempw := 900;
  endif;
//  Write(SerOut, ' ADC0mitt =' + intToStr(ADC0 : 4) + ' Amax =' + intToStr(ADmax : 4) + ' Amin =' + intToStr(ADmin : 4)+ ' Endw =' + intToStr(tempw : 4) + ^J + ^M );

// 80-900 mm  255-0
  if tempw < 80 then
    tempw := 80;
  endif;
  if tempw > 900 then
    tempw := 900;
  endif;

  tempw := tempw - 80;     //820 = 0 , 0 = 255
  tempw := 820 - tempw;       // div 3,2156862745098039215686274509804
  tempw := tempw * 79;
  tempw := tempw div 255;
  if tempw > 255 then
    fehler := fehler + 1;
    tempw := 255;
//    ar1[0] := 3;
//    ar1[1] := 4;
//    ar1[2] := 2;
//    TWIout($63, 0, ar1);
//    st1 := 'Err = ';
//    TWIout($63, 0, st2);
//    st2 := bytetostr(fehler : 3);
//    TWIout($63, 0, st2);
  endif;


  Write(SerOut, temp + temp + temp);

end ADlesen;

procedure twiroutine;
begin
  TWIout($05, 1, Y);
  TWIout($05, 1);
  TWIinp($05, M8slave);
  bla_slave := M8slave[1];
//  TWIout($63, 1);
  ar1[0] := 3;
  ar1[1] := 3;
  ar1[2] := 6;
  TWIout($63, 0, ar1);
  st2 := inttostr(x : 3);
  TWIout($63, 0, st2);
  ar1[0] := 3;
  ar1[1] := 3;
  ar1[2] := 10;
  TWIout($63, 0, ar1);
  st2 := 'Y= ';
  TWIout($63, 0, st2);
  st2 := inttostr(y : 3);
  TWIout($63, 0, st2);
end twiroutine;
procedure twiroutine1;
begin
  TWIout($05, 1, slaveY);
  TWIout($05, 1);
  TWIinp($05, M8slave);
  bla_slave := M8slave[1];
//  TWIout($63, 1);
  ar1[0] := 3;
  ar1[1] := 3;
  ar1[2] := 6;
  TWIout($63, 0, ar1);
  st2 := inttostr(x : 3);
  TWIout($63, 0, st2);
  ar1[0] := 3;
  ar1[1] := 3;
  ar1[2] := 10;
  TWIout($63, 0, ar1);
  st2 := 'Y= ';
  TWIout($63, 0, st2);
  st2 := bytetostr(slavey : 3);
  TWIout($63, 0, st2);
  ar1[0] := 3;
  ar1[1] := 4;
  ar1[2] := 1;
  TWIout($63, 0, ar1);
  st02 := 'E ';
  TWIout($63, 0, st02);
  st3 := bytetostr(fehler : 3);
  TWIout($63, 0, st3);

  st02 := ' i';
  TWIout($63, 0, st02);
  st4 := inttostr(admin : 4);
  TWIout($63, 0, st4);
  st02 := ' a';
  TWIout($63, 0, st3);
  st4 := inttostr(admax : 4);
  TWIout($63, 0, st4);

end twiroutine1;
//..................Referenz....
procedure referenz;
begin
  ar1[0] := 3;
  ar1[1] := 3;
  ar1[2] := 6;
  TWIout($63, 0, ar1);
  st2 := 'REF';
  TWIout($63, 0, st2);
  Y := 255;
  TWIout($05, 1, Y);
  for x := 0 to 500 do
    i := i - 1;
    motor;

    mdelay(20);
  endfor;

  for x := 0 to 350 do
    i := i + 1;
    motor;
    twiroutine;
    mdelay(30);
  endfor;
  x := 0;

end referenz;
//.......................Display.Anfang....
procedure display;
begin
  TWIout($63, 0, 12);
  TWIout($63, 0, 4);
  ar1[0] := 3;
  ar1[1] := 2;
  ar1[2] := 2;
  TWIout($63, 0, ar1);

  st1 := 'Sharp ';
  TWIout($63,  0, st1);
  st1 := 'Sensor';
  TWIout($63,  0, st1);
  st1 := 'Test 1';
  TWIout($63,  0, st1);

  ar1[0] := 3;
  ar1[1] := 3;
  ar1[2] := 2;
  TWIout($63, 0, ar1);
  st1 := 'X = ';
  TWIout($63,  0, st1);
end Display;
//...........................Display_Taster......
procedure display_taster;
begin
  ar1[0] := 3;
  ar1[1] := 3;
  ar1[2] := 6;
  TWIout($63, 0, ar1);
  st2 := 'Tst';
  TWIout($63, 0, st2);
end display_taster;
//..........................Serheader.........
procedure Serheader;
begin
  Write(SerOut, #66 + #77 + #198 + #95 + #1 + #0 + #0 + #0 );
  Write(serout, #0 + #0  + #54 + #0 + #0 + #0 + #40 + #0 );
  Write(serout, #0 + #0 + #200 + #0 + #0 + #0 + #150 + #0 );
  Write(serout, #0 + #0 + #1 + #0 + #24 + #0 + #0 + #0 );
  Write(serout, #0 + #0 + #0 + #192 + #0 + #0 + #0 + #0 );
  Write(serout, #0 + #0 + #0 + #0 + #0 + #0 + #0 + #0 );
  Write(serout, #0 + #0 + #0 + #0 + #0 + #0);
//  for J := 1 to 150 do
//    for x := 1 to 200 do
//      k := j div 3;
//      k := k + xl;
//      Write(SerOut, k + k + k);
//    endfor;
//  endfor;
end serheader;
//..................................Bild.........
procedure Bild;
begin

// X 80 -100
// Y 75-95
  slaveY := 0;
  for y := 1 to 150 do
    for x := 1 to 200 do
      i := i + 1;
      motor;
      mdelay(50);
      twiroutine1;
      ADlesen;
    endfor;
    slaveY := slaveY + 1;
    for x := 200 downto 1 do
      i := i - 1;
      motor;
      mdelay(20);
      twiroutine1;
    endfor;
    mdelay(300);
  endfor;
end Bild;
procedure Bild1;
begin

// X 80 -100
// Y 75-95
  slaveY := 75;
  for x := 1 to 80 do
    i := i + 1;
    motor;
     twiroutine1;
    mdelay(50);
  endfor;


  for y := 76 to 95 do
    for x := 81 to 100 do
      i := i + 1;
      motor;
      mdelay(50);
      twiroutine1;
      ADlesen;
    endfor;
    slaveY := slaveY + 1;
    for x := 100 downto 81 do
      i := i - 1;
      motor;
      mdelay(20);
      twiroutine1;
    endfor;
    mdelay(300);
  endfor;
end Bild1;
{--------------------------------------------------------------}
{ Main Program }
{$IDATA}

begin
  admin := 1023;
  admax := 0;
  mdelay(2000);
  Display;
  InitPorts;


  EnableInts;

  display_taster;

  repeat
    mDelay(300);
    toggle(Led);
  until not Taste1;


  Serheader;

  J := 1;
  I := 1;

  referenz;
  repeat
    Flag0 := 1;
    TWIout($05, 1);
    TWIinp($05, M8slave);
    bla_slave := M8slave[1];
    if bla_slave = 255 then
      Flag0 := 0;
    endif;
    toggle(LED);
  until not Flag0;

  Bild;
  portd := %11110000;
  loop
    toggle(LED);
    mdelay(100);
    TWIout($05, 1, #254 );
//    ADlesen;
  endloop;
end Sharp_sensor_master.

