AVR: ISP über serielle Schnittstelle selber programmieren

Moin !

Wir arbeiten gerade an einem kleinen Projekt. Und zwar ein Datenlogger für den Modellbau. Das ganze funzt auch soweit schon ganz gut.

formatting link
Mein Part ist dabei die Software welche in Delphi geschrieben ist
formatting link
Auch die funzt mitlerweile ganz sauber. Nun kam die Idee auf, aus dieser Software den AVR zu Programmieren. Dazu steht entweder die PORT.DLL oder die RSAPI.DLL bereit, welche auch sauber laufen (wir haben damit I2C über COM1 realisiert). Nur an dem ISP beisse ich mir im Moment die Zähne aus. Genaugenommen geht es um eine Funktion, die Daten zum AVR sendet und gleichzeitig empfängt. Davon könnte man alles weitere ableiten. Ich habe am Ende mal meine aktuelle Funktion angehängt. Die Frage wäre nun, wer hat sich schonmal an dieses Thema rangewagt und könnte mir evtl. mit einer Funktion oder ein paar Tips helfen (Programmiersprache ist dabei fast egal). Und um es vorwegzunehmen... PonyProg ist bekannt und sorry wenn das Thema nicht 100% in diese Group passt, aber die Jungs ...delphi.misc können da sicher nicht so viel weiterhelfen :-)

Grüße Dominik

Ok, hier mein Quellcode. Die Schaltung dazu findet man übrigens hier (weit unten):

formatting link

// #### Leitungen: MOSI (Data In) = 9 RI (Einlesen) ##### // #### 4 DTR (Ausgeben) ##### // #### MISO (Data Out) = 8 CTS (Einlesen) ##### // #### SCK (Serial Clock) = 6 DSR (Einlesen) ##### // #### 7 RTS(0|1) (Ausgeben) ##### // #### Reset = 3 TXD(0|1) ##### //Byte auf den Bus ausgeben und Byte lesen //When WRITING serial data to the ATtiny26, data is clocked on the RISING EDGE of SCK. //When READING data from the ATtiny26, data is clocked on the FALLING EDGE of SCK. Function ISPInOut(Wert:integer): Integer; var n, bitwert, erg:integer; begin bitwert:= 128; erg := 0; RTS(0); // SCK auf 0 setzen Delay(5); For n:= 1 To 8 do begin If (Wert And bitwert) = bitwert Then begin // Wert (2^x) kommt in der Zahl vor (MOSI Bit auf 1 [DTR(1)]) DTR(1); // MOSI Bit setzen RTS(1); // Takt auf 1 setzen delay(1); end Else begin // Wert kommt nicht in der Zahl vor (MOSI Bit auf 0 [DTR(0)]) DTR(0); // MOSI Bit löschen RTS(1); // Takt auf 1 setzen delay(1); End; RTS(0); If CTS = 1 Then erg := erg + bitwert; //delay(1); bitwert := bitwert div 2; end; ISPInOut := erg; end;

Reply to
Dominik Schmidt
Loading thread data ...

Ist das der ganze Quelltext den du zum Programmieren von dem AVR hast? Wenn ja, das kann so nicht gehen ...

Hier ein kleines Programm, das ich vor 5 Jahren mal unter Borland Pascal geschrieben habe und erfolgreich AVRs programmiert - es sind sicher viele Sachen drin, die du brauchen kannst. (War nur mal schnell so hingeschustert und schaut nicht besonders toll aus - geht aber ...)

uses crt,dos;

const waittime=1;

var f:file of byte; t:text; s:string; w:word; hibyte,lobyte:byte; l:longint; LPT_Data:byte; b:byte; LPT_status:byte; LPT_IO:byte; current:word;

function bin(s:string):byte; var c:byte; b:byte; res:byte; begin c:=128; res:=0; for b:=1 to 8 do begin if s[b]='1' then inc(res,c); c:=c shr 1; end; bin:=res; end;

procedure error(msg:string); begin writeln; writeln(msg); halt; end;

procedure clk; begin LPT_Data:=LPT_Data or 128; Port[$378]:=LPT_Data; LPT_Data:=LPT_Data and not 128; Port[$378]:=LPT_Data; end;

procedure setreset; begin LPT_DATA:=LPT_DATA and not 1; port[$378]:=LPT_DATA; end;

procedure clrreset; begin LPT_DATA:=LPT_DATA or 1; port[$378]:=LPT_DATA; end;

procedure setSCK; begin LPT_DATA:=LPT_DATA or 128; port[$378]:=LPT_DATA; end;

procedure setPower; begin LPT_DATA:=LPT_DATA or 4; LPT_DATA:=LPT_DATA or 2; port[$378]:=LPT_DATA; end;

procedure clrSCK; begin LPT_DATA:=LPT_DATA and not 128; port[$378]:=LPT_DATA; end;

procedure setDataBit; begin LPT_DATA:=LPT_DATA or 32; port[$378]:=LPT_DATA; end;

procedure clrDataBit; begin LPT_DATA:=LPT_DATA and not 32; port[$378]:=LPT_DATA; end;

procedure sendbyte(b:byte); var c:byte; v:byte; begin c:=128; for v:=1 to 8 do begin if b and c=c then setDataBit else ClrDatabit; c:=c shr 1; SetSCK; asm mov cx,$ffff repnz end; { delay(waittime);} clrsck; asm mov cx,$ffff repnz end; { delay(waittime);} end; delay(1); end;

procedure AVRStart; begin setpower; clrsck; setreset; delay(200); clrreset; delay(200); setreset; delay(200); end;

procedure enableprogramming; begin sendbyte(bin('10101100')); sendbyte(bin('01010011')); sendbyte(bin('00000000')); sendbyte(bin('00000000')); end;

procedure ChipErase; begin sendbyte(bin('10101100')); sendbyte(bin('10000000')); sendbyte(bin('00000000')); sendbyte(bin('00000000')); delay(20); end;

procedure WriteMEM(addr:word;b:word); begin sendbyte(bin('01000000')); { Lobyte programmieren } sendbyte(hi(addr)); { Hi-Byte von Adresse angeben } sendbyte(lo(addr)); { Lo-Byte von Adresse angeben } sendbyte(lo(b)); { Lo-Byte von Daten schreiben } delay(3); sendbyte(bin('01001000')); { Lobyte programmieren } sendbyte(hi(addr)); { Hi-Byte von Adresse angeben } sendbyte(lo(addr)); { Lo-Byte von Adresse angeben } sendbyte(hi(b)); { Lo-Byte von Daten schreiben } delay(3); end;

begin clrscr; if paramstr(1)=''then begin writeln('PROGRAM '); halt; end; assign(f,paramstr(1)+'.BIN'); {$i-} reset(f); {$i+} if ioresult0 then error('Cannot create '+paramstr(1)+'.BIN');

AVRStart; enableprogramming; chiperase; delay(10); clrReset; delay(5); setreset; enableprogramming; current:=0; delay(200); while not eof(f) do begin read(f,lobyte); read(f,hibyte);

asm mov al,lobyte mov ah,hibyte mov w,ax end;

writemem(current,w); write('Programming Adr.',current:6,#13); inc(current); end; writeln; writeln; close(f); clrreset;

end.

Viel Erfolg damit ...

Gruß

Thomas

"Dominik Schmidt" schrieb im Newsbeitrag news:cg813e$e6s$07$ snipped-for-privacy@news.t-online.com...

welche

es

Davon

formatting link

Reply to
Thomas Pototschnig

Moin Thomas!

Danke für deinen Quelltext. Leider komme ich da nicht so ganz mit den Assemblerpassagen klar. Könntest du mir die erlären? Oder evtl. mal kurz niederschreiben, wie das Senden/Empfangen theroretisch funktionieren sollte? Das Datenblatt ist nicht so ergibig, oder ich interpretiere es falsch...

Der Quelltext ist natürlich nicht alles. Ich nutze die RSAPI.DLL um direkt auf den seriellen Port zugreifen zu können. Das ganze Listing sieht im Mom so aus:

// ################################################################### // #### Versuch eines Atmel ISP Programmers ##### // #### ##### // #### 2004 by Dominik Schmidt ##### // #### ##### // #### Leitungen: MOSI (Data In) = 9 RI (Einlesen) ##### // #### 4 DTR (Ausgeben) ##### // #### MISO (Data Out) = 8 CTS (Einlesen) ##### // #### SCK (Serial Clock) = 6 DSR (Einlesen) ##### // #### 7 RTS(0|1) (Ausgeben) ##### // #### Reset = 3 TXD(0|1) ##### // #### ##### // #### Protzugriffe werden alle über RSAPI realisiert ! ##### // ###################################################################

// Serielle Schnittstelle // Funktion Pin PC uC // DCD 1 // GND 5 - // DSR 6 // CTS 8

Reply to
Dominik Schmidt
  • Dominik Schmidt [2004-08-21 19:34]:

also es gibt zwei gute OpenSource programmer: uisp und avrdude. Der Quellcode ist frei verfügbar (allerdings Lizenz beachten!) und in C. Müsste eigentlich weiterhelfen.

formatting link
formatting link

Gruß, Bernhard

--
"Ein Experte ist ein Mann, der hinterher genau sagen kann, warum
seine Prognose nicht gestimmt hat."
        -- Winston Churchill
Reply to
Bernhard Walle

Hallo,

die Assemblerpassagen sind leicht erklärt -

Hier handelt es sich nur um eine einfache Warteschleife - ein äquivalent wäre for i:=1 to 65535 do ;

nur von den meisten compilern wird sowas immer gern wegoptimiert ... es gibt unter windows sicher viel elegantere wege um eine wartezeit von asm

Das hier macht nix anderes als: w:=word(lobyte) or (word(hibyte) shl 8); In ein 16Bit Word kommt also in den unteren 8 Bits lobyte rein, in den oberen 8 Bits hibyte.

Wieso und was willst du eigentlich senden und empfangen? Du willst doch das Teil nur programmieren oder? Wenn du einen Verify-check machen willst, würde ich das Ding einfach programmieren und danach dann auslesen ...

Du könntest auch mal hier reinschauen:

formatting link

auf den Seiten 303 bis 307 (seriell programming) - da ist eigentlich alles gut erklärt ...

Falls es weiter fragen gibt einfach fragen :)

Mfg

Thomas

"Dominik Schmidt" schrieb im Newsbeitrag news:cg9d3n$r73$05$ snipped-for-privacy@news.t-online.com...

sollte?

Forms,

geöffnet');

Reply to
Thomas Pototschnig

Noch eine Kleinigkeit ... wie hast du deine Funktionen ausprobiert? Einfach die RS232 Pins an den AVR angeschlossen? Oder habt ihr da noch einen Pegelwandler dazwischen wie den MAX232 um RS232 Pegel nach TTL-Pegel zu konvertieren? Sorry für die Frage - aber sowas kommt schon vor :-)

hmm - im Datenblatt steht drin: "the second byte ($53) will echo back when issuing the third byte of the Programming Enable instruction"

Also das wird heißen, dass du in deiner Ausgabe erstmal

0 0 $53

bekommen wirst ... vielleicht funktionierts ja so wie es soll ...

Mfg

Thomas

"Dominik Schmidt" schrieb im Newsbeitrag news:cg9d3n$r73$05$ snipped-for-privacy@news.t-online.com...

sollte?

Forms,

geöffnet');

Reply to
Thomas Pototschnig
  • Thomas Pototschnig [2004-08-22 10:43]:

gibt's in ObjectPascal nicht sowas wie in C

for (volatile i = 1; i < 65535; i++) ;

Wegen dem `volatile' darf der Compiler es dann nicht mehr wegoptimieren, weil die Variable von außerhalb verändert werden könnte.

Gruß, Bernhard

--
"Unix is the most user friendly system I know, the point is the it 
is really selective about who is indeed its friend."
        -- Luigi Genoni
Reply to
Bernhard Walle

Moin !

Jo, einfach angeschlossen, ohne Max232. Allerdings schon mit Widerständen in den Leitungen. Die Scahltung kann man auf

formatting link
sehen. Ich sag mal so, mit PonyProg funzt das wunderbar. Also muss man das ja auch irgendwie anders hinbekommen...

Greetz Dominik

Reply to
Dominik Schmidt

"Bernhard Walle" wrote

Viel Dank Bernd. Ich schaue mir das mal an. Mir geht es ja nur darum zu verstehen, wie das ganze vom Ablauf her funzt. Proggen werde ich es wenn überhaupt in Delphi.

Greetz Dominik

Reply to
Dominik Schmidt

Tschuldigung für meine nachfolgende Wortwahl:

Gibt volatile unter der armseligen Programmiersprache Delphi? :)

Gruß

Thomas

"Bernhard Walle" schrieb im Newsbeitrag news: snipped-for-privacy@news.bwalle.de...

Reply to
Thomas Pototschnig
  • Thomas Pototschnig [2004-08-22 11:19]:

das war ja meine Frage. Die Sprache ist meines Wissens ObjectPascal, Delphi ist die IDE. Oder irre ich da?

Gruß, Bernhard

--
Man soll Denken lehren, nicht Gedachtes.
	-- C. Gurlitt
Reply to
Bernhard Walle

Du irrst nicht :-)

Gruß

Thomas

"Bernhard Walle" schrieb im Newsbeitrag news: snipped-for-privacy@news.bwalle.de...

Reply to
Thomas Pototschnig

Meine Software, die den Sercon2-Mini als Hardware verwendet, verwendet diese Funktion (wichtig ist, dass man das Bit liest, *bevor* man den Clockimpuls gibt - das hatte ich zuerst auch falsch gemacht). Ist in Visual Basic geschrieben und verwendet die Port.dll:

Function Send(ByVal Data As Byte) As Byte Dim R As Byte R = 0 'R nimmt das gelesene Byte auf For A = 7 To 0 Step -1 '8 Bit schreiben/lesen, MSB zuerst R = R * 2 'R nach links schieben DTR (Data And (2 ^ A)) \ (2 ^ A) 'Bit schreiben (DTR = MOSI) R = R + CTS 'Bit lesen (CTS = MISO) RTS 1 'Einen Puls auf Clock (RTS = SCK) RTS 0 Next Send = R End Function

CTS gibt entweder 0 oder 1 zurück, also nicht True/False (-1/0)! CTS ist eine Funktion aus der Port.dll, DTR und RTS sind Prozeduren aus der Port.dll. Wenn man noch eine Wartezeit einbauen möchten, kann man DELAYUS aus der Port.dll verwenden (wartet n Microsekunden).

Meine Software gibt es übrigens hier:

formatting link
(ich habe sie geschrieben, weil ich AT-Prog nicht kaufen wollte ;-)).

Gruß, Arne

Reply to
Arne Rossius

"Thomas Pototschnig" schrieb im Newsbeitrag news: snipped-for-privacy@uni-berlin.de...

Weil der erste Ansatz falsch war, ist das kein Grund, mit einem noch faelscheren Ansatz zu kommen.

Wie waere es, mal ein gutes Buch zu lesen `? Oder sonstwie mal etwas hinzuzulernen ? Man muss ja nicht tmi unzureichenden Kenntnissen die Welt mit schlechter Softwqre ueberfluten. Das tut ja Microsoft schon zur Genuege, trotz Kenntnissen.

Nur mal als Denkansatz: Es gibt seit dem Original IBM-PC einen Hardwaretimer, der mit 1.8432 MHz Takt zaehlt. Den kann man auslesen, und warten, bis sich sein Zaehlerwert ausreichend veraendert hat. Es gibt dabei einige Besonderheiten, z.B. zaehlt er zwei mal rueckwaerts, macht bei 0 einen Sprung auf 65535, ist der Zugriff unter NT nicht mehr ohne vorheriges Freischalten erlaubt, aber dazu schreibt man sich eine halt Funktion oder sucht sich eine fertige. Z.B. einen Timer aus Windows.

Unter DotNET bei C++ gibt es die Stopwatch-Klasse mit einer Aufloesung des Prozessorttaktes, also bei mir hier 2.8GHz: -->

Operations timed using the system's high-resolution performance counter. Timer frequency in ticks per second = 2798710000

Man muss halt bloss mal ein Buch lesen....

--
Manfred Winterhoff, reply-to invalid, use mawin at despammed.com
homepage: http://www.geocities.com/mwinterhoff/
de.sci.electronics FAQ: http://dse-faq.elektronik-kompendium.de/
Read 'Art of Electronics' Horowitz/Hill before you ask.
Lese 'Hohe Schule der Elektronik 1+2' bevor du fragst.
Reply to
MaWin

Problem ist, dass man die gewünschte funktionalität auch mit einfachen Tricks erreichen kann ohne ein Buch lesen zu müssen ...

Mfg

Thomas

Reply to
Thomas Pototschnig

"Thomas Pototschnig" schrieb im Newsbeitrag news: snipped-for-privacy@uni-berlin.de...

Njet, eben nicht. An statt das man eine bestimmte Zeit abwartet, halst man dem Prozessor Arbeit auf, und hofft, das er die notwendige Zeit damit zubringt. Das ist mehr als bloss durch die Brust ins Auge. Benutzer mit langsameren Systemen kriegen die Krise, bei Benutzer mit schnelleren System (also dein naechster Rechner) wartet es nicht lange genug. Warum Probleme nicht auf direktem Wege loesen ? Wenn ich eine ZEIT verstreichen lassen will, frage ich nach irgendeiner ZEIT (Timer).

Es gibt wirklich schon genug schlechte Software.

--
Manfred Winterhoff, reply-to invalid, use mawin at despammed.com
homepage: http://www.geocities.com/mwinterhoff/
de.sci.electronics FAQ: http://dse-faq.elektronik-kompendium.de/
Read 'Art of Electronics' Horowitz/Hill before you ask.
Lese 'Hohe Schule der Elektronik 1+2' bevor du fragst.
Reply to
MaWin

"Arne Rossius" wrote

Das wars. Es funzt.

Wenn du meine Freundin wärst, dann würde ich dich jetzt zum Essen einladen :-)

VIELEN DANK!!!!

Grüße Dominik

PS: Wenn ich nochmal mit was Stress habe, kann ich dich dann nochmal kontakten?

Reply to
Dominik Schmidt

Selbstverfreilich. Aber falls nicht hier, dann bitte über die Kontaktseite meiner Website, despammed.com frisst leider manchmal auch nicht-Spam.

Gruß, Arne

Reply to
Arne Rossius

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.