-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Universeller AVR-Programmer

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.08.2004
    Ort
    Stuttgart
    Alter
    42
    Beiträge
    849

    Universeller AVR-Programmer

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    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. MEGA. 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:



    Link zur Seite: http://wiesolator.de/index.php?area=...ic=AVR-Progger

    Grüße Wolfgang

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    29.09.2007
    Ort
    Südbaden
    Beiträge
    182
    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

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.08.2004
    Ort
    Stuttgart
    Alter
    42
    Beiträge
    849
    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.

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.186
    Schönes Projekt, hat nur den Nachteil der parallelen Schnittstelle.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.08.2004
    Ort
    Stuttgart
    Alter
    42
    Beiträge
    849
    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)



    Die Leiterplatte (einseitig aktueller Stand)



    Die möglichen Steckbelegungen der Ziel-AVR's



    Grüße Wolfgang

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.10.2006
    Ort
    Hamburg
    Alter
    37
    Beiträge
    105
    Hi!
    Gute Arbeit! Sag mal, wie hast du die erkennung der AVR Tüpen realisiert?
    Nur weil ein Roboter Menschen umbringt wird er schon als radikal beschimpft!

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.02.2006
    Ort
    München
    Beiträge
    111
    Jetzt fehlt nur noch die Unterstützung für die 8 poligen Tinys (z.B. Tiny 13).

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.08.2004
    Ort
    Stuttgart
    Alter
    42
    Beiträge
    849
    @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.

    Code:
      ' 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

  9. #9
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.186
    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.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.08.2004
    Ort
    Stuttgart
    Alter
    42
    Beiträge
    849
    @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).

    Code:
      ' 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/%b5...ger/inhalt.htm

    Grüße Wolfgang

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •