D
Dominik Schmidt
Guest
Moin Arne!
Du hast mir am 22.08. bei einem AVR Progger Problerm geholfen. Nun habe ich
da nochmal ne kleine Frage (Muss es leider über diesen Weg machen, denn
dein Formmailer geht irgendwie nicht.)
Und zwar kriege ich das Proggen des Speichers nicht sauber hin. Das ist
meine Funktion:
// Load Program Memory Page 0100 H000 xxxx xxxx xxxx bbbb iiii iiii
// Write H (high or low) data i to Program Memory page at word address b.
// Data low byte must be loaded before data high byte is applied within
// the same address.
// Write Program Memory Page 0100 1100 xxxx xxaa bbbb xxxx xxxx xxxx
// Write Program Memory Page at address a:b.
// i = data in a = address high bits b = address low bits
// H = 0 - Low byte, 1 - High Byte o = data out
procedure TForm1.AVRFlashSchreibenClick(Sender: TObject);
var i,j,k,l:integer;
begin
ComOpen(COMCombo.Text);
SPIInit;
// Speicher löschen
ISPInOut(172);
ISPInOut(128);
ISPInOut(0);
ISPInOut(0);
Delay(10);
l := 0; // Positionszeiger für HexEdit
for k := 0 to 3 do // \
for j := 1 to 16 do // / 16Byte Blöcke wegschreiben
begin
for i := 0 to 15 do // Puffer füllen
begin
// erst Low Byte schreiben
ISPInOut(64);
ISPInOut(0);
ISPInOut(i);
ISPInOut(hextoint(chartohex(AVRHex.GetMemory(l+1))));
// dann HighByte schreiben
ISPInOut(72);
ISPInOut(0);
ISPInOut(i);
ISPInOut(hextoint(chartohex(AVRHex.GetMemory(l))));
inc(l);
inc(l);
end;
// checken ob ein Byte aus der Page geschrieben wurde
// wenn dem so ist, kann erst die nächste Page geschrieben werden!
{ISPInOut(32); //< Hi-Byte
ISPInOut(k);
ISPInOut(j);
res := ISPInOut(0); }
// Schreibe Memory Page
ISPInOut(76);
ISPInOut(k);
ISPInOut(j*16);
ISPInOut(0);
delay(10);
//Memo1.Lines.Add('Schreibe Memory Page');
end;
CLOSECOM;
end;
Und das ist SPIInit (funzt auch sauber):
// SPI Proceduren & Funktionen
procedure SPIInit;
var i:integer;
begin
TXD(1); //
RTS(0); // Initialisierung einleiten
Delay(100);
TXD(0);
Delay(100);
TXD(1);
Delay(100);
for i:=1 to 4 do // Synchronisieren
begin
ISPInOut(172);
ISPInOut(83);
ISPInOut(0);
ISPInOut(0);
end;
end;
Er schreibt die Werte einfach nicht sauber weg. Kannst du mir mal erklären
auf was man da achten muss? Oder kannst du mir nochmal deine Funktion für
das Flashen schicken?
Grüße Dominik
Du hast mir am 22.08. bei einem AVR Progger Problerm geholfen. Nun habe ich
da nochmal ne kleine Frage (Muss es leider über diesen Weg machen, denn
dein Formmailer geht irgendwie nicht.)
Und zwar kriege ich das Proggen des Speichers nicht sauber hin. Das ist
meine Funktion:
// Load Program Memory Page 0100 H000 xxxx xxxx xxxx bbbb iiii iiii
// Write H (high or low) data i to Program Memory page at word address b.
// Data low byte must be loaded before data high byte is applied within
// the same address.
// Write Program Memory Page 0100 1100 xxxx xxaa bbbb xxxx xxxx xxxx
// Write Program Memory Page at address a:b.
// i = data in a = address high bits b = address low bits
// H = 0 - Low byte, 1 - High Byte o = data out
procedure TForm1.AVRFlashSchreibenClick(Sender: TObject);
var i,j,k,l:integer;
begin
ComOpen(COMCombo.Text);
SPIInit;
// Speicher löschen
ISPInOut(172);
ISPInOut(128);
ISPInOut(0);
ISPInOut(0);
Delay(10);
l := 0; // Positionszeiger für HexEdit
for k := 0 to 3 do // \
for j := 1 to 16 do // / 16Byte Blöcke wegschreiben
begin
for i := 0 to 15 do // Puffer füllen
begin
// erst Low Byte schreiben
ISPInOut(64);
ISPInOut(0);
ISPInOut(i);
ISPInOut(hextoint(chartohex(AVRHex.GetMemory(l+1))));
// dann HighByte schreiben
ISPInOut(72);
ISPInOut(0);
ISPInOut(i);
ISPInOut(hextoint(chartohex(AVRHex.GetMemory(l))));
inc(l);
inc(l);
end;
// checken ob ein Byte aus der Page geschrieben wurde
// wenn dem so ist, kann erst die nächste Page geschrieben werden!
{ISPInOut(32); //< Hi-Byte
ISPInOut(k);
ISPInOut(j);
res := ISPInOut(0); }
// Schreibe Memory Page
ISPInOut(76);
ISPInOut(k);
ISPInOut(j*16);
ISPInOut(0);
delay(10);
//Memo1.Lines.Add('Schreibe Memory Page');
end;
CLOSECOM;
end;
Und das ist SPIInit (funzt auch sauber):
// SPI Proceduren & Funktionen
procedure SPIInit;
var i:integer;
begin
TXD(1); //
RTS(0); // Initialisierung einleiten
Delay(100);
TXD(0);
Delay(100);
TXD(1);
Delay(100);
for i:=1 to 4 do // Synchronisieren
begin
ISPInOut(172);
ISPInOut(83);
ISPInOut(0);
ISPInOut(0);
end;
end;
Er schreibt die Werte einfach nicht sauber weg. Kannst du mir mal erklären
auf was man da achten muss? Oder kannst du mir nochmal deine Funktion für
das Flashen schicken?
Grüße Dominik