- SF800 Solar Speicher Tutorial         
Seite 4 von 6 ErsteErste ... 23456 LetzteLetzte
Ergebnis 31 bis 40 von 52

Thema: realiskarte ***updated*** #bitte reischauen#

  1. #31
    tzlo
    Gast

    so, an die pro's

    Anzeige

    Praxistest und DIY Projekte
    Ist der Code von [glow=red:58b4a2ae18]python_rocks[/glow:58b4a2ae18] so richtig???


    Code:
    '========================================================================
    ' Relais mit dem ATmega8 schalten. Die Steuerung läuft mit Kommandos
    ' über eine RS232-Verbindung.
    '
    ' Es sind mehrere Arten von Kommandos möglich:
    '
    ' - "011" = Kommando um einen einzelnen Kanal zu stellen
    '    - Die ersten zwei Zeichen kennzeichnen den Kanal
    '    - Das dritte Zeichen (0 oder 1) steht für den einzustellenden Zustand
    '    - Ein ZEILENUMBRUCH (``chr(10)``) wird herausgefiltert und hat keine Auswirkungen
    '    - Der Befehl wird mit RETURN (``chr(13)``) abgeschlossen
    '
    ' - "ALL00000000000000000000" = Kommando um alle Kanäle auf einmal zu stellen
    '    - ALL kennzeichnet den Befehl
    '    - Die restlichen 20 Zeichen (0 oder 1) stehen für den Zustand jedes
    '      einzelnen Kanals.
    '    - Ein ZEILENUMBRUCH (``chr(10)``) wird herausgefiltert und hat keine Auswirkungen
    '    - Der Befehl wird mit RETURN (``chr(13)``) abgeschlossen
    '
    ' - "STATUS" = Kommando um den aktuellen Zustand der Kanäle abzufragen
    '    - Ein ZEILENUMBRUCH (``chr(10)``) wird herausgefiltert und hat keine Auswirkungen
    '    - Der Befehl wird mit RETURN (``chr(13)``) abgeschlossen
    '    - Rückgabe: "STATUS:<je ein 0 oder 1 für jeden Kanal>" (links beginnend)
    '
    ' - "RESET_COMMAND" = Setzt den Kommandostring auf "" zurück
    '    - Ein ZEILENUMBRUCH (``chr(10)``) wird herausgefiltert und hat keine Auswirkungen
    '    - Der Befehl wird mit RETURN (``chr(13)``) abgeschlossen
    '========================================================================
    $regfile = "M8def.dat"
    $crystal = 8000000
    $hwstack = 32
    $swstack = 10
    $framesize = 40
    $baud = 9600
    
    'Anschlüsse nach Pin-Reihenfolge (1-28)
    Channel_01 Alias Portd.2
    Channel_02 Alias Portd.3
    Channel_03 Alias Portd.4
    Channel_04 Alias Portb.6
    Channel_05 Alias Portb.7
    Channel_06 Alias Portd.5
    Channel_07 Alias Portd.6
    Channel_08 Alias Portd.7
    Channel_09 Alias Portb.0
    Channel_10 Alias Portb.1
    Channel_11 Alias Portb.2
    
    Channel_12 Alias Portb.3                     'SPI
    Channel_13 Alias Portb.4                     'SPI
    Channel_14 Alias Portb.5                     'SPI
    
    Channel_15 Alias Portc.0
    Channel_16 Alias Portc.1
    Channel_17 Alias Portc.2
    Channel_18 Alias Portc.3
    Channel_19 Alias Portc.4
    Channel_20 Alias Portc.5
    
    Config Channel_01 = Output
    Config Channel_02 = Output
    Config Channel_03 = Output
    Config Channel_04 = Output
    Config Channel_05 = Output
    Config Channel_06 = Output
    Config Channel_07 = Output
    Config Channel_08 = Output
    Config Channel_09 = Output
    Config Channel_10 = Output
    Config Channel_11 = Output
    Config Channel_12 = Output
    Config Channel_13 = Output
    Config Channel_14 = Output
    Config Channel_15 = Output
    Config Channel_16 = Output
    Config Channel_17 = Output
    Config Channel_18 = Output
    Config Channel_19 = Output
    Config Channel_20 = Output
    
    'die maximale Kommandolänge muss exakt ANZAHL_KANÄLE + 3 sein
    Const Max_command_lenght = 23
    
    Dim Command As String * Max_command_lenght
    Dim Command_byte(max_command_lenght) As Byte At Command Overlay
    Dim Do_command As Bit
    Dim Channel_string As String * 2
    Dim Channel As Byte
    Dim Value_string As String * 1
    Dim Value_bit As Bit
    Dim Bt As Byte
    Dim Cnt As Byte
    Dim Key As Byte
    Dim Error As Bit
    
    'Vor dem Aufruf der Prozedur *Set_channel_value* muss Channel und Value_string gesetzt werden
    Declare Sub Set_channel_value()
    Declare Sub Reset_command()
    Declare Sub Print_status()
    
    Config Serialin = Buffered , Size = 20
    Enable Interrupts
    
    
    Print "STATUS: START"
    
    
    'Main-Loop
    Do
    
       'Kommando empfangen und vorbereiten
       If Ischarwaiting() = 1 Then
          Key = Waitkey()
          'Zeilenumbruch herausfiltern
          If Key <> Chr(10) Then
             'Ein RETURN schließt das Kommando ab
             If Key = Chr(13) Then
                'Das Kommando ist fertiggestellt
                Do_command = 1
                Print "COMMAND: " ; Command
             Else
                'Kommando ergänzen
                Incr Cnt
                If Cnt > Max_command_lenght Then
                   Call Reset_command()
                   Print "ERROR: COMMAND TO LONG"
                Else
                   Command_byte(cnt) = Key
                End If
             End If
          End If
       End If
    
       'Kommando umsetzen
       If Do_command = 1 Then
          If Left(command , 6) = "STATUS" Then
             'pass
          Elseif Left(command , 13) = "RESET_COMMAND" Then
             'pass
          Elseif Left(command , 3) = "ALL" Then
             If Len(command) = Max_command_lenght Then
                For Bt = 4 To Max_command_lenght
                   Channel = Bt - 3
                   Value_string = Mid(command , Bt , 1)
                   Call Set_channel_value()
                   If Error = 1 Then
                      Print "ERROR: COMMAND INTERRUPTED"
                      Exit For
                   End If
                Next Bt
             Else
                Print "ERROR: " ; Max_command_lenght ; " CHARACTERS EXPECTED"
             End If
          Elseif Len(command) = 3 Then
             Channel_string = Mid(command , 1 , 2)
             Channel = Val(channel_string)
             Value_string = Mid(command , 3 , 1)
             Call Set_channel_value()
          Else
             Print "ERROR: UNKNOWN COMMAND"
          End If
    
          'Kommando zurück setzen
          Call Reset_command()
    
          'Status zurück geben
          Call Print_status()
       End If
    
    Loop
    End
    
    
    Sub Set_channel_value()
    
       If Value_string = "1" Then
          Value_bit = 1
       Else
          Value_bit = 0
       End If
    
       Select Case Channel
       Case 1
          Channel_01 = Value_bit
       Case 2
          Channel_02 = Value_bit
       Case 3
          Channel_03 = Value_bit
       Case 4
          Channel_04 = Value_bit
       Case 5
          Channel_05 = Value_bit
       Case 6
          Channel_06 = Value_bit
       Case 7
          Channel_07 = Value_bit
       Case 8
          Channel_08 = Value_bit
       Case 9
          Channel_09 = Value_bit
       Case 10
          Channel_10 = Value_bit
       Case 11
          Channel_11 = Value_bit
       Case 12
          Channel_12 = Value_bit
       Case 13
          Channel_13 = Value_bit
       Case 14
          Channel_14 = Value_bit
       Case 15
          Channel_15 = Value_bit
       Case 16
          Channel_16 = Value_bit
       Case 17
          Channel_17 = Value_bit
       Case 18
          Channel_18 = Value_bit
       Case 19
          Channel_19 = Value_bit
       Case 20
          Channel_20 = Value_bit
       Case Else
          Print "ERROR: UNSUPPORTED CHANNEL"
          Error = 1
       End Select
    
    End Sub
    
    
    Sub Reset_command()
       Command = String(max_command_lenght , 0)
       Cnt = 0
       Error = 0
       Do_command = 0
    End Sub
    
    
    Sub Print_status()
       Print "STATUS: " ; _
          Channel_01 ; _
          Channel_02 ; _
          Channel_03 ; _
          Channel_04 ; _
          Channel_05 ; _
          Channel_06 ; _
          Channel_07 ; _
          Channel_08 ; _
          Channel_09 ; _
          Channel_10 ; _
          Channel_11 ; _
          Channel_12 ; _
          Channel_13 ; _
          Channel_14 ; _
          Channel_15 ; _
          Channel_16 ; _
          Channel_17 ; _
          Channel_18 ; _
          Channel_19 ; _
          Channel_20
    End Sub


    Wenn ich diesen code atmega 32 oder 16 compatible machen will, muss ich doch nur oben den code in diesen ändern, oder??????


    Code:
    $regfile = "M32def.dat"
    $crystal = 16000000
    oder ist 16 mhz nicht so gut für serial communication, sollte doch 14,*** sein, nich war?[/code]

  2. #32
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.08.2007
    Ort
    Oberhofen im Inntal (Tirol)
    Alter
    50
    Beiträge
    377

    Re: so, an die pro's

    Zitat Zitat von tzlo
    Code:
    $regfile = "M32def.dat"
    $crystal = 16000000
    oder ist 16 mhz nicht so gut für serial communication, sollte doch 14,*** sein, nich war?[/code]
    Hallo tzlo!

    Der ATmega16 und der ATmega32 haben beide einen 8 Mhz-RC-Oscillator eingebaut. Bei 8 Mhz und 9600 Baud hast du eine Fehlerrate von 0,16 %. Weniger als ein Prozent bei großen Frequenzen wie z.B. 8 Mhz ist OK. Siehe Seite 27 in der ATmega32-Dokumentation.

    Auf den Seiten 163 bis 166 ist eine Tabelle mit Frequenzen und Baudraten.

    mfg
    Gerold

  3. #33
    tzlo
    Gast
    aber ich will nen externen quarz, der interne ist doch nicht so genau

  4. #34
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.08.2007
    Ort
    Oberhofen im Inntal (Tirol)
    Alter
    50
    Beiträge
    377
    Hallo tzlo!
    Zitat Zitat von tzlo
    aber ich will nen externen quarz, der interne ist doch nicht so genau
    Aber was bringt dir der genaue Quarz, wenn du mit dem Ding nur Relais schaltest? Für 9600 Baud genügt der interne RC-Oscillator.

    Bei 9600 Baud werden die Sekunde 960 Byte übertragen. Wenn du keine Statusmeldungen an den Computer zurück gibst, dann könntest du damit (geschätzt) 48 mal die Sekunde alle Relais ein- oder ausschalten. Damit ist das Relais die Bremse und nicht die Datenübertragung.

    Aber du könntest bei 8 Mhz statt 9600 Baud auch locker noch mit 19200 oder 38400 Baud raus fahren. Ich dachte nur, dass es nicht notwendig sei, die Daten so schnell zu übertragen. Bei langsameren Verbindungen kann das Kabel auch länger sein.


    Zitat Zitat von tzlo
    Wenn ich diesen code atmega 32 oder 16 compatible machen will, muss ich doch nur oben den code in diesen ändern, oder?
    Du musst natürlich auch die Ports und die zugehörigen Kanäle anpassen/erweitern. Und überall im Code, in dem direkt auf die Ports zugegriffen wird (Channel_01, channel_02,...) musst du auch daran denken, dass du mehr Kanäle hast. Den Code musst du also einfach nur erweitern. Ansonsten fällt mir nichts ein, was du berücksichtigen musst.

    mfg
    Gerold

  5. #35
    tzlo
    Gast
    okay, vielen Dank für eure hilfe, ganz besonders phyton_rocks wg. dem code und der andern hilfe.....

  6. #36
    tzlo
    Gast

    moin

    so, hat schon wer den code getestet oder so??


    gibt es eigentlich nen atmega simulator?

  7. #37
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.08.2007
    Ort
    Oberhofen im Inntal (Tirol)
    Alter
    50
    Beiträge
    377

    Re: moin

    Zitat Zitat von tzlo
    so, hat schon wer den code getestet oder so??
    gibt es eigentlich nen atmega simulator?
    Hallo tzlo!

    Mit Bascom kannst du Simulationen durchführen. Und so einfachen Code wie diesen schluckt es leicht. Du kannst dann direkt in Bascom etwas ins Terminal-Fenster eingeben und auf die Reaktion warten.

    Dieser Code:
    Für 17-Ausgänge: http://paste.pocoo.org/show/21858/
    Für 20-Ausgänge: http://paste.pocoo.org/show/21859/

    Wurde von mir unter Bascom getestet. Weiters habe ich die Programme auf den ATmega8 meines Testboards überspielt und damit getestet.

    Bild hier  

    Die LEDs kann ich damit gezielt ein- und ausschalten. Dass es dann auch mit Relais geht, nehme ich stark an.

    Die STATUS-Rückmeldungen geben außerdem immer den echten Status der Ausgänge zurück.

    Statt der LED brauchst du für jeden Ausgang nur je einen 10k Widerstand, einen Transistor (z.B. 2N2222), eine Diode (z.B. 1N4148 oder 1N4001) und ein Relais.

    mfg
    Gerold

  8. #38
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.08.2007
    Ort
    Oberhofen im Inntal (Tirol)
    Alter
    50
    Beiträge
    377
    Hallo tzlo!

    Ich habe das Programm getestet.

    Bild hier  

    Video: http://halvar.at/krimskrams/relais_beim_schalten.avi

    Python Testprogramm: http://paste.pocoo.org/show/22172/

    EDIT:

    Mögliche Schaltung:

    Bild hier  

    mfg
    Gerold


    EDIT2: Link zu verbessertem Testprogramm hinzugefügt

  9. #39
    tzlo
    Gast
    super! *freu* aber das ist ja ziemlicher aufwand, wenn ich immer eine platine für jedes realis brauche, bw. eine "monster platine" für alle 20 stk.^^

  10. #40
    tzlo
    Gast
    der code ist doch in bascom, weil du hast ja als nickname phython, aber die ist ja eh nicht fürn avr

Seite 4 von 6 ErsteErste ... 23456 LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests