PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Universeller AVR-Programmer



BlueNature
15.12.2007, 21:25
Servus,

habe hier einen neuen AVR-Programmer entwickelt, der weitgehendst alle üblichen AVR's programmieren kann. Im Prinzip basiert es auf einem IC-Sockel (40-poliger TexTool-Sockel) der darunter einen AVR hat um den Sockel anzusteuern. Die Verbindung geht direkt via LPT-Kabel und wird im üblichen SP12-Programmer-Protokoll bedient. Der AVR übernimmt dabei die Aufgabe den entsprechenden eingelegten AVR zu erkennen, und entsprechend dem eingelegten AVR die ISP-Leitungen durchzurouten. Unterstützt wird soweit alles von ATtiny2313 bis zum MEGA32 (incl. MEGA8). Denke das es sicher eine kostengünstige alterneative ist zu den "Profi-Programmiergeräten".

Hier ein Foto von meiner ersten Version, die Platine habe ich aber neu geroutet (kleiner) und ist auch schon verfügbar:

http://wiesolator.de/data/topics/yC/AVR/AVR-Progger/_images/th/RIMG0036.jpg

Link zur Seite: http://wiesolator.de/index.php?area=yC&topic=AVR&stopic=AVR-Progger

Grüße Wolfgang

elayne
15.12.2007, 22:05
Schönes Projekt und saubere Umsetzung. Hast du die Platine selbst geätzt?

Vor einiger Zeit wollte ich mir sowas auch bauen, bin aber leider gescheitert und habe mir ein fertiges Programmerboard gekauft. Wenn ich mal wieder Zeit hab hol ich das nach.

Gruß
elayne

BlueNature
15.12.2007, 22:17
Ja, die Platine habe ich selbst geätzt, sie ist nur etwas verbastelt, da ich zuerst mit Optokopplern eine galvanische Trennung entworfen hatte. Die neue die ich schon online gelegt habe werde ich die Tage ätzen und löten (Teile habe ich ja von der im Foto dargestellten Version). Dann bekommt es auch ein kleines Gehäuse.
Die Optokoppler hatten eigentlich den Hintergrund, das ich dort ein ISP-Kabel anstecken wollte, um in der Zielschaltung einen AVR zu programieren ohne Risiken für den PC. Das werde ich mir aber als kleines Kästchen nun separat bauen.

Hubert.G
16.12.2007, 09:03
Schönes Projekt, hat nur den Nachteil der parallelen Schnittstelle.

BlueNature
16.12.2007, 12:38
Servus Hubert.G,

es war nicht mein Ziel einen USB-fähigen Programmer zu bauen. Das gibt es schon fertig zu kaufen. Mir gieng es darum das Kabel löten in einer Zielschaltung wegzubekommen und alle meine soweit DIL-fähigen AVR's auf einfachste Weise zu supporten.

Hier noch der aktuelle Stand der neuen Version. Sie ist fast nur noch halb so groß und sauber gelötet, die erste war ja noch mit Optokopplern und total verbastelt.

Das Bild des aktuellen Programmieradapters mit einem ATMEGA8 als Beispiel. LED's zur Statusanzeige sind rechts am Sockel (rot/grün/gelb)

http://wiesolator.de/data/topics/yC/AVR/AVR-Progger/_images/th/RIMG0038.jpg

Die Leiterplatte (einseitig aktueller Stand)

http://wiesolator.de/data/topics/yC/AVR/AVR-Progger/_images/th/Board.gif

Die möglichen Steckbelegungen der Ziel-AVR's

http://wiesolator.de/data/topics/yC/AVR/AVR-Progger/_images/SockelBelegung2.gif

Grüße Wolfgang

Lebi
16.12.2007, 13:36
Hi!
Gute Arbeit! Sag mal, wie hast du die erkennung der AVR Tüpen realisiert?

Windi
16.12.2007, 13:40
Jetzt fehlt nur noch die Unterstützung für die 8 poligen Tinys (z.B. Tiny 13).

BlueNature
16.12.2007, 14:35
@Lebi, die Realisierung der Erkennung basiert auf "redet er mit mir oder tut ers nicht". Der AVR unten drin probiert eben reihum durch wie er eine Kommunikation aufbauen kann, hat er einen Kommuniaktionsweg gefunden, wird dieser gemerkt und die grüne LED leuchtet (AVR erkannt und gesprächig). Wird programmiert, wird der Kommikationsweg, ein Patchen der IO's vorgenommen. Das signalisiert bei aktivem Programiervorgang. Das Programm werde ich aber nochmals überarbeiten. Habe noch beim EEPROM-Flashen Fehllesungen, weil es zu früh den AVR trennt.



' AVR-Weiche für AVR-Programmiergerät
' (C) 2007 Wolfgang Schmid / www.wiesolator.de

$RegFile = "m8def.dat"
$Crystal = 8000000 ' interne 8 MHz

' Fuse-Bits
'$Prog &hFF, &h24, &hD9, &h00

LedRot Alias PortC.4
LedGruen Alias PortC.3
LedGelb Alias PortC.2

RES_T1 Alias PortB.7
SCK_T1 Alias PortB.5
MOSI_T1 Alias PortB.3
MISO_T1 Alias PinB.4

RES_T2 Alias PortD.2
SCK_T2 Alias PortB.2
MOSI_T2 Alias PortD.5
MISO_T2 Alias PinB.1

RES_T3 Alias PortB.7
SCK_T3 Alias PortB.6
MOSI_T3 Alias PortD.3
MISO_T3 Alias PinD.4

RES_PC Alias PinD.7
SCK_PC Alias PinB.0
MOSI_PC Alias PinD.6
MISO_PC Alias PortC.5

SupplyT1A Alias PortD.1
SupplyT1B Alias PortC.0
SupplyT23 Alias PortD.0

Const PrgEnB1 = &hAC
Const PrgEnB2 = &h53
Const PrgEnB3 = &h00
Const PRgEnB4 = &h00

Const TimeOut = 65000

Dim AvrTyp As Byte
Dim Retry As Byte
Dim Dummy As Byte
Dim Result As Byte
Dim AvrSend As Byte
Dim AvrEcho As Byte
Dim BitNr As Byte
Dim DeatTime As Word

Init:
' Allgemeine Signale von/zum PC
DDRD.7 = 0 : PortD.7 = 0 ' RESET von PC (Pull-Up aktiv)
DDRB.0 = 0 : PortB.0 = 0 ' SCK von PC (Pull-Up aktiv)
DDRD.6 = 0 : PortD.6 = 0 ' MOSI von PC (Pull-Up aktiv)
DDRC.5 = 1 : PortC.5 = 0 ' MISO an PC
' LED-Anzeige
DDRC.4 = 1
DDRC.3 = 1
DDRC.2 = 1

' AVR-Auswahl
Main:
GoSub DisConnectAvr
' LED's ausschalten
LedRot = 0
LedGruen = 0
LedGelb = 0
Do
Select Case AvrTyp
Case 0: ' AVR-Typ detektieren
LedRot = 1
LedGruen = 0
GoSub Find_T1
GoSub Find_T2
GoSub Find_T3
Case 1: ' ATTINY 2313
LedGruen = 1
LedRot = 0
GoSub Switch_T1
Case 2: ' ATMEGA 8 / ATMEGA 48 / ATMEGA 88 / ATMEGA 168
LedGruen = 1
LedRot = 0
GoSub Switch_T2
Case 3: ' ATMEGA 16 / ATMEGA 32 / ATMEGA 644
LedGruen = 1
LedRot = 0
GoSub Switch_T3
End Select
Loop

' Typ 1 schalten
Switch_T1:
GoSub DisConnectAvr
DDRB.7 = 1 : RES_T1 = 1 ' RESET = Output (High)
DDRB.5 = 1 : SCK_T1 = 0 ' SCK = Output (Low)
DDRB.3 = 1 : MOSI_T1 = 0 ' MOSI = Output (Low)
' Versorgungsspannung anlegen
GoSub PowerUpAvr
' Auf Programmierung warten
Do
If RES_PC = 0 Then Exit Do
If DeatTime >= TimeOut Then
DeatTime = 0
AvrTyp = 0
GoSub Find_T1
If AvrTyp <> 1 Then Return
Else
Incr DeatTime
End If
Loop
LedGelb = 1
Do
RES_T1 = RES_PC ' RESET PC => Ziel-AVR
SCK_T1 = SCK_PC ' SCK PC => Ziel-AVR
MOSI_T1 = MOSI_PC ' MOSI PC => Ziel-AVR
MISO_PC = MISO_T1 ' MISO PC <= Ziel-AVR
' Programmierende detektieren
If RES_PC = 0 Then DeatTime = TimeOut
Decr DeatTime
If DeatTime = 0 Then Exit Do
Loop
LedGelb = 0
' AVR aus Sockel entnehmen
Do
AvrTyp = 0
GoSub Find_T1
If AvrTyp <> 1 Then Exit Do
WaitMs 800
Loop
LedGruen = 0
Return

' Typ 2 schalten
Switch_T2:
GoSub DisConnectAvr
DDRD.2 = 1 : RES_T2 = 1 ' RESET = Output (High)
DDRB.2 = 1 : SCK_T2 = 0 ' SCK = Output (Low)
DDRD.5 = 1 : MOSI_T2 = 0 ' MOSI = Output (Low)
' Versorgungsspannung anlegen
GoSub PowerUpAvr
' Auf Programmierung warten
Do
If RES_PC = 0 Then Exit Do
If DeatTime >= TimeOut Then
DeatTime = 0
AvrTyp = 0
GoSub Find_T2
If AvrTyp <> 2 Then Return
Else
Incr DeatTime
End If
Loop
LedGelb = 1
Do
RES_T2 = RES_PC ' RESET PC => Ziel-AVR
SCK_T2 = SCK_PC ' SCK PC => Ziel-AVR
MOSI_T2 = MOSI_PC ' MOSI PC => Ziel-AVR
MISO_PC = MISO_T2 ' MISO PC <= Ziel-AVR
' Programmierende detektieren
If RES_PC = 0 Then DeatTime = TimeOut
Decr DeatTime
If DeatTime = 0 Then Exit Do
Loop
LedGelb = 0
' AVR aus Sockel entnehmen
Do
AvrTyp = 0
GoSub Find_T2
If AvrTyp <> 2 Then Exit Do
WaitMs 800
Loop
LedGruen = 0
Return

' Typ 3 schalten
Switch_T3:
GoSub DisConnectAvr
DDRB.7 = 1 : RES_T3 = 1 ' RESET = Output (High)
DDRB.6 = 1 : SCK_T3 = 0 ' SCK = Output (Low)
DDRD.3 = 1 : MOSI_T3 = 0 ' MOSI = Output (Low)
' Versorgungsspannung anlegen
GoSub PowerUpAvr
' Auf Programmierung warten
Do
If RES_PC = 0 Then Exit Do
If DeatTime >= TimeOut Then
DeatTime = 0
AvrTyp = 0
GoSub Find_T3
If AvrTyp <> 3 Then Return
Else
Incr DeatTime
End If
Loop
LedGelb = 1
Do
RES_T3 = RES_PC ' RESET PC => Ziel-AVR
SCK_T3 = SCK_PC ' SCK PC => Ziel-AVR
MOSI_T3 = MOSI_PC ' MOSI PC => Ziel-AVR
MISO_PC = MISO_T3 ' MISO PC <= Ziel-AVR
' Programmierende detektieren
If RES_PC = 0 Then DeatTime = TimeOut
Decr DeatTime
If DeatTime = 0 Then Exit Do
Loop
LedGelb = 0
' AVR aus Sockel entnehmen
Do
AvrTyp = 0
GoSub Find_T3
If AvrTyp <> 3 Then Exit Do
WaitMs 800
Loop
LedGruen = 0
Return

' Typ 1 - ATTINY 2313 ...
Find_T1:
If AvrTyp > 0 Then Return
AvrTyp = 1
GoSub DisConnectAvr
DDRB.7 = 1 : RES_T1 = 1 ' RESET = Output (High)
DDRB.5 = 1 : SCK_T1 = 0 ' SCK = Output (Low)
DDRB.3 = 1 : MOSI_T1 = 0 ' MOSI = Output (Low)
' Versorgungsspannung anlegen
GoSub PowerUpAvr
' >20 ms warten
WaitMs 25
RES_T1 = 0 ' RESET = Low
' >20 ms warten
WaitMs 25
' Prog. Enable anstoßen
For Retry = 1 To 5
AvrSend = PrgEnB1 : GoSub TalkAvr
AvrSend = PrgEnB2 : GoSub TalkAvr
AvrSend = PrgEnB3 : GoSub TalkAvr
Result = AvrEcho
AvrSend = PrgEnB4 : GoSub TalkAvr
If Result = PrgEnB2 Then Exit For
Next Retry
RES_T1 = 1 ' RESET = High
If Result = PrgEnB2 Then Return
AVRTyp = 0
GoSub DisconnectAvr
Return

' Typ 2 - ATMEGA8 ...
Find_T2:
If AvrTyp > 0 Then Return
AvrTyp = 2
GoSub DisConnectAvr
DDRD.2 = 1 : RES_T2 = 1 ' RESET = Output (High)
DDRB.2 = 1 : SCK_T2 = 0 ' SCK = Output (Low)
DDRD.5 = 1 : MOSI_T2 = 0 ' MOSI = Output (Low)
' Versorgungsspannung anlegen
GoSub PowerUpAvr
' >20 ms warten
WaitMs 25
RES_T2 = 0 ' RESET = Low
' >20 ms warten
WaitMs 25
' Prog. Enable anstoßen
For Retry = 1 To 5
AvrSend = PrgEnB1 : GoSub TalkAvr
AvrSend = PrgEnB2 : GoSub TalkAvr
AvrSend = PrgEnB3 : GoSub TalkAvr
Result = AvrEcho
AvrSend = PrgEnB4 : GoSub TalkAvr
If Result = PrgEnB2 Then Exit For
Next Retry
RES_T2 = 1 ' RESET = High
If Result = PrgEnB2 Then Return
AVRTyp = 0
GoSub DisconnectAvr
Return

' Typ 3 - ATMEGA16 ...
Find_T3:
If AvrTyp > 0 Then Return
AvrTyp = 3
GoSub DisConnectAvr
DDRB.7 = 1 : RES_T3 = 1 ' RESET = Output (High)
DDRB.6 = 1 : SCK_T3 = 0 ' SCK = Output (Low)
DDRD.3 = 1 : MOSI_T3 = 0 ' MOSI = Output (Low)
' Versorgungsspannung anlegen
GoSub PowerUpAvr
' >20 ms warten
WaitMs 25
RES_T3 = 0 ' RESET = Low
' >20 ms warten
WaitMs 25
' Prog. Enable anstoßen
For Retry = 1 To 5
AvrSend = PrgEnB1 : GoSub TalkAvr
AvrSend = PrgEnB2 : GoSub TalkAvr
AvrSend = PrgEnB3 : GoSub TalkAvr
Result = AvrEcho
AvrSend = PrgEnB4 : GoSub TalkAvr
If Result = PrgEnB2 Then Exit For
Next Retry
RES_T3 = 1 ' RESET = High
If Result = PrgEnB2 Then Return
AVRTyp = 0
GoSub DisconnectAvr
Return

' SPI-Kommunikation mit AVR
TalkAvr:
For BitNr = 7 To 0 Step -1
Select Case AvrTyp
Case 1:
MOSI_T1 = AvrSend.BitNr
SCK_T1 = 1
WaitUs 11
AvrEcho.BitNr = MISO_T1
SCK_T1 = 0
Case 2:
MOSI_T2 = AvrSend.BitNr
SCK_T2 = 1
WaitUs 11
AvrEcho.BitNr = MISO_T2
SCK_T2 = 0
Case 3:
MOSI_T3 = AvrSend.BitNr
SCK_T3 = 1
WaitUs 11
AvrEcho.BitNr = MISO_T3
SCK_T3 = 0
End Select
WaitUs 11
Next BitNr
Return

' AVR mit Spannung versorgen
PowerUpAvr:
Select Case AvrTyp
Case 1:
SupplyT1A = 1 ' Supply T1 GND aktiv
SupplyT1B = 0 ' Supply T1 VCC aktiv
Case 2:
SupplyT23 = 1 ' Supply M8/M16 GND/VCC aktiv
Case 3:
SupplyT23 = 1 ' Supply M8/M16 GND/VCC aktiv
End Select
Return

' AVR trennen
DisConnectAvr:
' Supply deaktivieren
DDRD.0 = 1 : PortD.0 = 0 ' Supply M8/M16 inaktiv
DDRC.0 = 1 : PortC.0 = 1 ' Supply 2313 VCC inaktiv
DDRD.1 = 1 : PortD.1 = 0 ' Supply 2313 GND inaktiv
' Signale zum Ziel-AVR deaktivieren (Input)
DDRB.7 = 0 : PortB.7 = 0 ' RESET Typ 1 - 3
DDRD.2 = 0 : PortD.2 = 0 ' RESET Typ - 2 -
DDRB.5 = 0 : PortB.5 = 0 ' SCK Typ 1 - -
DDRB.2 = 0 : PortB.2 = 0 ' SCK Typ - 2 -
DDRB.6 = 0 : PortB.6 = 0 ' SCK Typ - - 3
DDRB.3 = 0 : PortB.3 = 0 ' MOSI Typ 1 - -
DDRD.5 = 0 : PortD.5 = 0 ' MOSI Typ - 2 -
DDRD.3 = 0 : PortD.3 = 0 ' MOSI Typ - - 3
DDRB.4 = 0 : PortB.4 = 0 ' MISO Typ 1 - -
DDRB.1 = 0 : PortB.1 = 0 ' MISO Typ - 2 -
DDRD.4 = 0 : PortD.4 = 0 ' MISO Typ - - 3
Return


@windi, die Unterstützung für 8-Füßler habe ich nicht realisiert. Denke wenn man sowas wirklich brauchen sollte, dann kann man das wohl recht flott auf eine Lochraster aufbauen. Das Layout solte ja selbst ätzbar und einseitig ausfallen. Aber wenn du es schaffen solltest das in das Layout zu implementieren, gerne her damit :) Sollte man aber mit einem 20-poligen Adaptersockel basteln können wenn es da dringend drauf soll. Muß eben VCC/GND/MIOS/MOSI/SCK und RESET verbinden auf einen ATINY2313.

Grüße Wolfgang

Hubert.G
16.12.2007, 17:46
Hallo Wolfgang
Wenn es deinen Anforderungen entspricht dann ist alles OK. Im Prinzip ja ein schönes Projekt, sieht auch sehr sauber aus und wenn du das auch noch selber programmiert hast dann ist es schon von der Seite her keinesfalls zu verachten.

BlueNature
16.12.2007, 22:23
@Hubert.G, gieng mir eben darum, wenn ichs hier verstauben lass und versteck bringts keinem was, so kanns halt jeder nutzen der es brauchen kann. Hab erst noch ein "Bugfix" gemacht. Hatte ja Probleme mit EEPROM-Lesen. Die jetzt lauffähige Version ist hier als Code. Den alten nicht nehmen, der ist fehlerbehaftet. Habs mit MEGA8, 16, 32 und Tiny2313 getestet reihum kreuz und quer und geht nun sauber alles (Fusen, EEPROM, Programm).



' AVR-Weiche für AVR-Programmiergerät

$RegFile = "m8def.dat"
$Crystal = 8000000 ' interne 8 MHz

' Fuse-Bits
'$Prog &hFF, &h24, &hD9, &h00

LedRot Alias PortC.4
LedGruen Alias PortC.3
LedGelb Alias PortC.2

RES_T1 Alias PortB.7
SCK_T1 Alias PortB.5
MOSI_T1 Alias PortB.3
MISO_T1 Alias PinB.4

RES_T2 Alias PortD.2
SCK_T2 Alias PortB.2
MOSI_T2 Alias PortD.5
MISO_T2 Alias PinB.1

RES_T3 Alias PortB.7
SCK_T3 Alias PortB.6
MOSI_T3 Alias PortD.3
MISO_T3 Alias PinD.4

RES_PC Alias PinD.7
SCK_PC Alias PinB.0
MOSI_PC Alias PinD.6
MISO_PC Alias PortC.5

SupplyT1A Alias PortD.1
SupplyT1B Alias PortC.0
SupplyT23 Alias PortD.0

Const PrgEnB1 = &HAC
Const PrgEnB2 = &H53
Const PrgEnB3 = &H0
Const PrgEnB4 = &H0

Const TimeOut = 65000

Dim AvrTyp As Byte
Dim Retry As Byte
Dim Dummy As Byte
Dim Result As Byte
Dim AvrSend As Byte
Dim AvrEcho As Byte
Dim BitNr As Byte
Dim DeatTime As Boolean

Init:
' Allgemeine Signale von/zum PC
DDRD 0.7 = 0: PortD 0.7 = 0 ' RESET von PC (Pull-Up aktiv)
DDRB 0# = 0: PortB 0# = 0 ' SCK von PC (Pull-Up aktiv)
DDRD 0.6 = 0: PortD 0.6 = 0 ' MOSI von PC (Pull-Up aktiv)
DDRC 0.5 = 1: PortC 0.5 = 0 ' MISO an PC
' LED-Anzeige
DDRC 0.4 = 1
DDRC 0.3 = 1
DDRC 0.2 = 1
' Deat-Time Überwachung parametrieren
On Timer1 IntTimer1
Config Timer1 = Timer, Prescale = 256
Start Timer1
Enable Interrupts
Enable Timer1

' AVR-Auswahl
Main:
GoSub DisConnectAvr
' LED's ausschalten
LedRot = 0
LedGruen = 0
LedGelb = 0
Do
Select Case AvrTyp
Case 0: ' AVR-Typ detektieren
LedRot = 1
LedGruen = 0
GoSub Find_T1
GoSub Find_T2
GoSub Find_T3
Case 1: ' ATTINY 2313
LedGruen = 1
LedRot = 0
GoSub Switch_T1
Case 2: ' ATMEGA 8 / ATMEGA 48 / ATMEGA 88 / ATMEGA 168
LedGruen = 1
LedRot = 0
GoSub Switch_T2
Case 3: ' ATMEGA 16 / ATMEGA 32 / ATMEGA 644
LedGruen = 1
LedRot = 0
GoSub Switch_T3
End Select
Loop

' Timer 1 Overflow-Interrupt ausgelöst
IntTimer1:
DeatTime = 1
Return

' Typ 1 schalten
Switch_T1:
GoSub DisConnectAvr
DDRB 0.7 = 1: RES_T1 = 1 ' RESET = Output (High)
DDRB 0.5 = 1: SCK_T1 = 0 ' SCK = Output (Low)
DDRB 0.3 = 1: MOSI_T1 = 0 ' MOSI = Output (Low)
' Versorgungsspannung anlegen
GoSub PowerUpAvr
Timer1 = 0
DeatTime = 0
Do
' Idle-State
Do
If DeatTime = 1 Then
Timer1 = 0
DeatTime = 0
AvrTyp = 0
GoSub Find_T1
If AvrTyp <> 1 Then Return
End If
' Daten patchen
RES_T1 = 1
If RES_PC = 0 Then Exit Do
If SCK_PC = 1 Then Exit Do
Loop
' Busy-State
LedGelb = 1
DeatTime = 0
Timer1 = 0
Do
' Daten patchen
RES_T1 = RES_PC
SCK_T1 = SCK_PC
MOSI_T1 = MOSI_PC
MISO_PC = MISO_T1
If SCK_PC = 1 Then Timer1 = 0
Loop Until DeatTime = 1
LedGelb = 0
Loop
Return

' Typ 2 schalten
Switch_T2:
GoSub DisConnectAvr
DDRD 0.2 = 1: RES_T2 = 1 ' RESET = Output (High)
DDRB 0.2 = 1: SCK_T2 = 0 ' SCK = Output (Low)
DDRD 0.5 = 1: MOSI_T2 = 0 ' MOSI = Output (Low)
' Versorgungsspannung anlegen
GoSub PowerUpAvr
Timer1 = 0
DeatTime = 0
Do
' Idle-State
Do
If DeatTime = 1 Then
Timer1 = 0
DeatTime = 0
AvrTyp = 0
GoSub Find_T2
If AvrTyp <> 2 Then Return
End If
' Daten patchen
RES_T2 = 1
If RES_PC = 0 Then Exit Do
If SCK_PC = 1 Then Exit Do
Loop
' Busy-State
LedGelb = 1
DeatTime = 0
Timer1 = 0
Do
' Daten patchen
RES_T2 = RES_PC
SCK_T2 = SCK_PC
MOSI_T2 = MOSI_PC
MISO_PC = MISO_T2
If SCK_PC = 1 Then Timer1 = 0
Loop Until DeatTime = 1
LedGelb = 0
Loop
Return

' Typ 3 schalten
Switch_T3:
GoSub DisConnectAvr
DDRB 0.7 = 1: RES_T3 = 1 ' RESET = Output (High)
DDRB 0.6 = 1: SCK_T3 = 0 ' SCK = Output (Low)
DDRD 0.3 = 1: MOSI_T3 = 0 ' MOSI = Output (Low)
' Versorgungsspannung anlegen
GoSub PowerUpAvr
Timer1 = 0
DeatTime = 0
Do
' Idle-State
Do
If DeatTime = 1 Then
Timer1 = 0
DeatTime = 0
AvrTyp = 0
GoSub Find_T3
If AvrTyp <> 1 Then Return
End If
' Daten patchen
RES_T3 = 1
If RES_PC = 0 Then Exit Do
If SCK_PC = 1 Then Exit Do
Loop
' Busy-State
LedGelb = 1
DeatTime = 0
Timer1 = 0
Do
' Daten patchen
RES_T3 = RES_PC
SCK_T3 = SCK_PC
MOSI_T3 = MOSI_PC
MISO_PC = MISO_T3
If SCK_PC = 1 Then Timer1 = 0
Loop Until DeatTime = 1
LedGelb = 0
Loop
Return

' Typ 1 - ATTINY 2313 ...
Find_T1:
If AvrTyp > 0 Then Return
AvrTyp = 1
GoSub DisConnectAvr
DDRB 0.7 = 1: RES_T1 = 1 ' RESET = Output (High)
DDRB 0.5 = 1: SCK_T1 = 0 ' SCK = Output (Low)
DDRB 0.3 = 1: MOSI_T1 = 0 ' MOSI = Output (Low)
' Versorgungsspannung anlegen
GoSub PowerUpAvr
' >20 ms warten
WaitMs 25
RES_T1 = 0 ' RESET = Low
' >20 ms warten
WaitMs 25
' Prog. Enable anstoßen
For Retry = 1 To 5
AvrSend = PrgEnB1: GoSub TalkAvr
AvrSend = PrgEnB2: GoSub TalkAvr
AvrSend = PrgEnB3: GoSub TalkAvr
Result = AvrEcho
AvrSend = PrgEnB4: GoSub TalkAvr
If Result = PrgEnB2 Then Exit For
Next Retry
RES_T1 = 1 ' RESET = High
If Result = PrgEnB2 Then Return
AvrTyp = 0
GoSub DisConnectAvr
Return

' Typ 2 - ATMEGA8 ...
Find_T2:
If AvrTyp > 0 Then Return
AvrTyp = 2
GoSub DisConnectAvr
DDRD 0.2 = 1: RES_T2 = 1 ' RESET = Output (High)
DDRB 0.2 = 1: SCK_T2 = 0 ' SCK = Output (Low)
DDRD 0.5 = 1: MOSI_T2 = 0 ' MOSI = Output (Low)
' Versorgungsspannung anlegen
GoSub PowerUpAvr
' >20 ms warten
WaitMs 25
RES_T2 = 0 ' RESET = Low
' >20 ms warten
WaitMs 25
' Prog. Enable anstoßen
For Retry = 1 To 5
AvrSend = PrgEnB1: GoSub TalkAvr
AvrSend = PrgEnB2: GoSub TalkAvr
AvrSend = PrgEnB3: GoSub TalkAvr
Result = AvrEcho
AvrSend = PrgEnB4: GoSub TalkAvr
If Result = PrgEnB2 Then Exit For
Next Retry
RES_T2 = 1 ' RESET = High
If Result = PrgEnB2 Then Return
AvrTyp = 0
GoSub DisConnectAvr
Return

' Typ 3 - ATMEGA16 ...
Find_T3:
If AvrTyp > 0 Then Return
AvrTyp = 3
GoSub DisConnectAvr
DDRB 0.7 = 1: RES_T3 = 1 ' RESET = Output (High)
DDRB 0.6 = 1: SCK_T3 = 0 ' SCK = Output (Low)
DDRD 0.3 = 1: MOSI_T3 = 0 ' MOSI = Output (Low)
' Versorgungsspannung anlegen
GoSub PowerUpAvr
' >20 ms warten
WaitMs 25
RES_T3 = 0 ' RESET = Low
' >20 ms warten
WaitMs 25
' Prog. Enable anstoßen
For Retry = 1 To 5
AvrSend = PrgEnB1: GoSub TalkAvr
AvrSend = PrgEnB2: GoSub TalkAvr
AvrSend = PrgEnB3: GoSub TalkAvr
Result = AvrEcho
AvrSend = PrgEnB4: GoSub TalkAvr
If Result = PrgEnB2 Then Exit For
Next Retry
RES_T3 = 1 ' RESET = High
If Result = PrgEnB2 Then Return
AvrTyp = 0
GoSub DisConnectAvr
Return

' SPI-Kommunikation mit AVR
TalkAvr:
For BitNr = 7 To 0 Step -1
Select Case AvrTyp
Case 1:
MOSI_T1 = AvrSend.BitNr
SCK_T1 = 1
WaitUs 11
AvrEcho.BitNr = MISO_T1
SCK_T1 = 0
Case 2:
MOSI_T2 = AvrSend.BitNr
SCK_T2 = 1
WaitUs 11
AvrEcho.BitNr = MISO_T2
SCK_T2 = 0
Case 3:
MOSI_T3 = AvrSend.BitNr
SCK_T3 = 1
WaitUs 11
AvrEcho.BitNr = MISO_T3
SCK_T3 = 0
End Select
WaitUs 11
Next BitNr
Return

' AVR mit Spannung versorgen
PowerUpAvr:
Select Case AvrTyp
Case 1:
SupplyT1A = 1 ' Supply T1 GND aktiv
SupplyT1B = 0 ' Supply T1 VCC aktiv
Case 2:
SupplyT23 = 1 ' Supply M8/M16 GND/VCC aktiv
Case 3:
SupplyT23 = 1 ' Supply M8/M16 GND/VCC aktiv
End Select
Return

' AVR trennen
DisConnectAvr:
' Supply deaktivieren
DDRD 0# = 1: PortD 0# = 0 ' Supply M8/M16 inaktiv
DDRC 0# = 1: PortC 0# = 1 ' Supply 2313 VCC inaktiv
DDRD 0.1 = 1: PortD 0.1 = 0 ' Supply 2313 GND inaktiv
' Signale zum Ziel-AVR deaktivieren (Input)
DDRB 0.7 = 0: PortB 0.7 = 0 ' RESET Typ 1 - 3
DDRD 0.2 = 0: PortD 0.2 = 0 ' RESET Typ - 2 -
DDRB 0.5 = 0: PortB 0.5 = 0 ' SCK Typ 1 - -
DDRB 0.2 = 0: PortB 0.2 = 0 ' SCK Typ - 2 -
DDRB 0.6 = 0: PortB 0.6 = 0 ' SCK Typ - - 3
DDRB 0.3 = 0: PortB 0.3 = 0 ' MOSI Typ 1 - -
DDRD 0.5 = 0: PortD 0.5 = 0 ' MOSI Typ - 2 -
DDRD 0.3 = 0: PortD 0.3 = 0 ' MOSI Typ - - 3
DDRB 0.4 = 0: PortB 0.4 = 0 ' MISO Typ 1 - -
DDRB 0.1 = 0: PortB 0.1 = 0 ' MISO Typ - 2 -
DDRD 0.4 = 0: PortD 0.4 = 0 ' MISO Typ - - 3
Return


Ansonsten ist hier alles weitere als HTML-Version: http://wiesolator.de/data/topics/%b5C/AVR/AVR-Progger/inhalt.htm

Grüße Wolfgang

BlueNature
17.12.2007, 01:54
Servus, Für dich, Windi, habe ich mal die Adaption auf einen 8-Beiner gezeichnet. das adaptiert auf einen ATTINY2313 und andere als 8-Füssler

http://www.wiesolator.gotdns.org/data/topics/yC/AVR/AVR-Progger/_images/Tinysupport.gif

Oder anders gesagt, alles passt, bis auf Pin 4 (GND), der muß eben paar Stellen weiter nach unten velrlegt werden, wenn es dein Brennprogramm (SP12-Programmer) kennt, dann klappt das auch.

Aktueller Stand: Im Gehäuse nun fest montiert

http://wiesolator.de/data/topics/yC/AVR/AVR-Progger/_images/th/RIMG0044.jpg

Grüße Wolfgang

Windi
17.12.2007, 20:51
Sollte man aber mit einem 20-poligen Adaptersockel basteln können wenn es da dringend drauf soll. Muß eben VCC/GND/MIOS/MOSI/SCK und RESET verbinden auf einen ATINY2313.
Diese Idee ist ja so einfach dass ich selbst nicht draufgekommen bin.