Also wenn es hilft poste ich mal was ich damals so Programmiert habe, also bei mir ging es super.
Code
procedure InitPorts;
begin
PortC:= %00001111;
DDRC:= %00001110;
end InitPorts;
//------------------------------------------------------
//Reset Set
procedure Set_Reset;
begin
Incl(At_Reset);
end Set_Reset;
//Reset Clr
procedure Clr_Reset;
begin
Excl(At_Reset);
end Clr_Reset;
//Set SCK ----------------------------------
procedure Set_SCK;
begin
Incl(At_SCK);
// Delay ? einbauen ?
end Set_SCK;
//Clr SCK
procedure Clr_SCK;
begin
Excl(At_SCK);
// Delay ? einbauen ?
end Clr_SCK;
//Set MOSI
procedure Set_MOSI;
begin
Incl(At_MOSI);
end Set_MOSI;
//Clr MOSI
procedure Clr_MOSI;
begin
Excl(At_MOSI);
end Clr_MOSI;
Das hier war erstmal das wichtigste das der Atmel Antwortet.
Code
//*****************************************
// 'P' Enable Programming
//*****************************************
procedure EnableChip;
begin
Set_SCK;
Clr_SCK;
Set_Reset;
mDelay(1);
Clr_Reset;
mDelay(50);
KumByt := $AC;
Hi_Adr := $53;
Lo_Adr := $0;
Data := $0;
Befehl_Senden;
if wertH = 83 then
SerOut($0D);
else
Write(SerOut, '?');
ENDIF;
end EnableChip;
Und das waren halt meine Routinen zur Kom. mit dem Atmel.
Code
//*****************************************
// Befehle an den Atmel Senden
//*****************************************
procedure Befehl_Senden;
Var stelle : byte;
begin
//byte 1 senden
stelle := 128;
for i:= 1 TO 8 DO
if (KumByt AND stelle) > 0 then Incl(At_MOSI); else Excl(At_MOSI); ENDIF;
Set_SCK;
stelle := stelle div 2;
Clr_SCK;
ENDFOR;
//byte 2 senden
stelle := 128;
for i:= 1 TO 8 DO
if (Hi_Adr AND stelle) > 0 then Incl(At_MOSI); else Excl(At_MOSI); ENDIF;
Set_SCK;
stelle := stelle div 2;
Clr_SCK;
ENDFOR;
//byte 3 senden + abholen wertH
stelle := 128;
for i:= 1 TO 8 DO
if (Lo_Adr AND stelle) > 0 then Incl(At_MOSI); else Excl(At_MOSI); ENDIF;
if At_MISO then wertH:= (wertH shl 1) or $1; else wertH:= wertH shl 1; ENDIF;
Set_SCK;
stelle := stelle div 2;
Clr_SCK;
ENDFOR;
//byte 4 senden + abholen wertL
stelle := 128;
for i:= 1 TO 8 DO
if (Data AND stelle) > 0 then Incl(At_MOSI); else Excl(At_MOSI); ENDIF;
if At_MISO then wertL:= (wertL shl 1) or $1; else wertL:= wertL shl 1; ENDIF;
Set_SCK;
stelle := stelle div 2;
Clr_SCK;
ENDFOR;
end Befehl_Senden;
//*****************************************
// Atmel Nur 4te byte Lesen
//*****************************************
procedure Befehl_Lesen;
Var stelle, i : byte;
begin
//byte 1 senden
for i:= 7 DownTO 0 DO
Clr_SCK;
SetBit( AT_MOSI, Bit(KumByt, i ));
Set_SCK;
ENDFOR;
//byte 2 senden
for i:= 7 DownTO 0 DO
Clr_SCK;
SetBit( AT_MOSI, Bit(Hi_Adr, i ));
Set_SCK;
ENDFOR;
//byte 3 senden
for i:= 7 DownTO 0 DO
Clr_SCK;
SetBit( AT_MOSI, Bit(Lo_Adr, i ));
Set_SCK;
ENDFOR;
Clr_SCK;
//byte 4 senden + abholen wertL
stelle := 128;
for i:= 1 TO 8 DO
if At_MISO then wertL:= (wertL shl 1) or $1; else wertL:= wertL shl 1; ENDIF;
Incl(At_SCK);
stelle := stelle div 2;
Excl(At_SCK);
ENDFOR;
end Befehl_Lesen;
//*****************************************
// Atmel Nur 4 byte write
//*****************************************
procedure Befehl_Write;
Var i : byte;
begin
//byte 1 senden
for i:= 7 DownTO 0 DO
Clr_SCK;
SetBit( AT_MOSI, Bit(KumByt, i ));
Set_SCK;
ENDFOR;
Clr_SCK;
//byte 2 senden
for i:= 7 DownTO 0 DO
Clr_SCK;
SetBit( AT_MOSI, Bit(Hi_Adr, i ));
Set_SCK;
ENDFOR;
Clr_SCK;
//byte 3 senden
for i:= 7 DownTO 0 DO
Clr_SCK;
SetBit( AT_MOSI, Bit(Lo_Adr, i ));
Set_SCK;
ENDFOR;
Clr_SCK;
//byte 3 senden
for i:= 7 DownTO 0 DO
Clr_SCK;
SetBit( AT_MOSI, Bit(Data, i ));
Set_SCK;
ENDFOR;
Clr_SCK;
end Befehl_Write;
ich hoffe es hilft ihm bissel, also mir hatte es damals geholfen.
Gruß Frank