@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.
@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 damitCode:' 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 ReturnSollte 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







Zitieren

Lesezeichen