@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).
Ansonsten ist hier alles weitere als HTML-Version: http://wiesolator.de/data/topics/%b5...ger/inhalt.htmCode:' 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
Grüße Wolfgang







Zitieren

Lesezeichen