- fchao-Sinus-Wechselrichter AliExpress         
Seite 8 von 11 ErsteErste ... 678910 ... LetzteLetzte
Ergebnis 71 bis 80 von 107

Thema: Erster Hexapod

  1. #71
    Moderator Robotik Einstein Avatar von HannoHupmann
    Registriert seit
    19.11.2005
    Ort
    München
    Alter
    42
    Beiträge
    4.534
    Blog-Einträge
    1
    Anzeige

    Powerstation Test
    Gibt ein I2C Tutorial in der Wiki, welches ich mal ausprobiert und verbessert hab. Das sollte funktionieren, zumindest klappt es bei meinen beiden Mega32 ganz gut. Das Problem bei der Komunikation zwischen µC ist, dass es soviele mögliche Fehlerquellen gibt und man so schwer nachprüfen kann woran es liegt.

  2. #72
    Erfahrener Benutzer Fleißiges Mitglied Avatar von High Light
    Registriert seit
    21.08.2009
    Ort
    Baden Württemberg
    Beiträge
    142
    Hallo zusammen,

    lange ist es her, dass ich mich hier gemeldet habe, aber es hat sich viel getan und ich möchte euch kurz davon berichten.
    - Ich habe mir ein LCD-Display besorgt, welches auf Susi montiert wird und
    verschiedene Sachen (wie z.B. Akkuzustand) anzeigen soll. Anschließend habe ich mich in
    die Programmierung eines solchen Displays eingearbeitet und ich muss sagen, dass es
    gar nicht so schwer ist.
    - Desweiteren funktioniert nun mein I2C-Bus, nachdem ich mich intensiv damit
    beschäftigt habe.
    - Susi hat auch noch einen Kopf bekommen, welcher mit Ultraschallsensoren ausgerüstet
    ist. Die Abstandswerte werden von einem Atmega48 erfasst und sollen dann über den
    Bus an den Master gesendet werden. Jedoch ist der Kopf noch nicht an den Bus
    angeschlossen.

    Näheres zu den beiden letzten Punkten hier:
    1.) https://www.roboternetz.de/community...n-Bascom/page3
    2.) https://www.roboternetz.de/community...hen-Atmegas-88

    Hier habe ich noch aktuelle Bilder von Susi:

    Klicke auf die Grafik für eine größere Ansicht

Name:	CIMG2242.jpg
Hits:	121
Größe:	73,6 KB
ID:	18664

    Klicke auf die Grafik für eine größere Ansicht

Name:	CIMG2244.jpg
Hits:	68
Größe:	70,6 KB
ID:	18665

    Und hier noch den aktuelle Code des Masters:

    Code:
    $regfile = "m88def.dat"
    $crystal = 16000000
    
    'I2C Konfiguration
    Declare Sub Twi_send_byte(byval Slave As Byte , Zeichen As Byte)
    
    Dim Twi_control As Byte                                     ' Controlregister lokale kopie
    Dim Twi_status As Byte
    Dim Twi_data As Byte
    
    Dim B As Byte                                               ' Zeichen von UART
    Dim Error As Byte                                           ' Fehlermerker
    
    Dim Wert As Byte                                            'Wertvariable
    
    ' TWI init
    Twcr = &B00000100                                           ' erstmal nur TWI aktivieren
    Twsr = 0                                                    ' Status und Prescaler Register
    Twbr = 72                                                   ' Bit Rate Register, 100kHz
    
    'StatusLEDs
    Statusled_rot Alias Portd.0
    Config Statusled_rot = Output
    
    Statusled_gruen Alias Portd.2
    Config Statusled_gruen = Output
    
    Statusled_rot = 0
    Statusled_gruen = 1
    
    
    ' Hauptschleife
    Do
        'Start
        Wert = 10
        Call Twi_send_byte(&Hc0 , Wert)                         'Slave SL1
        Call Twi_send_byte(&Hc2 , Wert)                         'Slave SL2
        Call Twi_send_byte(&Hc4 , Wert)                         'Slave SL3
        Call Twi_send_byte(&Hc6 , Wert)                         'Slave SR1
        Call Twi_send_byte(&Hc8 , Wert)                         'Slave SR2
        Call Twi_send_byte(&Hca , Wert)                         'Slave SR3
        Statusled_rot = 1
        Statusled_gruen = 0
        Waitms 6000
    
        'Vorwärts
        Wert = 20
        Call Twi_send_byte(&Hc0 , Wert)                         'Slave SL1
        Call Twi_send_byte(&Hc2 , Wert)                         'Slave SL2
        Call Twi_send_byte(&Hc4 , Wert)                         'Slave SL3
        Call Twi_send_byte(&Hc6 , Wert)                         'Slave SR1
        Call Twi_send_byte(&Hc8 , Wert)                         'Slave SR2
        Call Twi_send_byte(&Hca , Wert)                         'Slave SR3
        Statusled_rot = 1
        Statusled_gruen = 0
        Waitms 20000
    
        'Stop
        Wert = 100
        Call Twi_send_byte(&Hc0 , Wert)                         'Slave SL1
        Call Twi_send_byte(&Hc2 , Wert)                         'Slave SL2
        Call Twi_send_byte(&Hc4 , Wert)                         'Slave SL3
        Call Twi_send_byte(&Hc6 , Wert)                         'Slave SR1
        Call Twi_send_byte(&Hc8 , Wert)                         'Slave SR2
        Call Twi_send_byte(&Hca , Wert)                         'Slave SR3
        Statusled_rot = 0
        Statusled_gruen = 1
        Waitms 2000
    
    Loop
    
    End
    
    ' Unterprogramme
    
    ' TWI send_byte
    ' sendet ein Byte und schliesst die Übertragung ab
    Sub Twi_send_byte(byval Slave As Byte , Zeichen As Byte)
        Error = 0                                               ' Fehler zurücksetzen
    
        ' Startbedingung
        Twcr = &B10100100                                       ' TWINT
    
        ' warten bis TWINT gesetzt ist
        Gosub Twi_wait_int
    
        ' wenn Zugriff auf den Bus erlaubt, Slaveadresse ausgeben
        If Twi_status = &H08 Or Twi_status = &H10 Then
            Twdr = Slave And &HFE                               ' slave adresse + Write
            Twcr = &B10000100                                   ' TWINT löschen, Byte senden
    
            ' warten bis TWINT gesetzt ist
            Gosub Twi_wait_int
    
            ' Slave hat sich gemeldet
            If Twi_status = &H18 Or Twi_status = &H20 Then
                Twdr = Zeichen                                  ' Daten
                Twcr = &B10000100                               ' TWINT löschen, Byte senden
    
                ' warten bis TWINT gesetzt ist
                Gosub Twi_wait_int
    
                ' Zeichen wurden gesendet
                If Twi_status = &H28 Or Twi_status = &H30 Then
                    Error = 0                                   ' kein Fehler
                Else
                    Error = Twi_status                          ' Fehler
                End If
    
            Else
                ' kein slave
                Error = Twi_status                              ' Fehler
            End If
    
            ' STOPbedingung kommt hier immer im Ablauf, egal welcher Status
            Twcr = &B10010100                                   ' TWINT löschen, STOP senden
            ' nach einem STOP wird TWINT nicht mehr gesetzt,
            ' man darf/kann also nicht darauf warten !
    
        Else
            ' Bus belegt, wird er wieder freigegeben
            Twcr = &B10000100                                   ' TWINT löschen, Bus freigeben
            Error = Twi_status                                  ' Fehler
        End If
    
    End Sub
    
    ' warten bis TWINT gesetzt ist, status auslesen
    Twi_wait_int:
        Do
            Twi_control = Twcr And &H80
        Loop Until Twi_control = &H80
    
        Twi_status = Twsr And &HF8                              ' status
    
        ' status nur zu Debugzwecken ausgeben, weil Bus sehr langsam wird !
    '    Print "Err " ; Hex(twi_status)
    Return
    und hier eines Slaves:
    Code:
    $regfile = "m88def.dat"
    $crystal = 16000000
    
    
    'I2C Konfiguration
    Dim Twi_control As Byte                                     ' Controlregister lokale kopie
    Dim Twi_status As Byte
    Dim Twi_data As Byte
    
    Dim Neuesbyte As Byte                                       ' Bytemerker
    
    Declare Sub Twi_init_slave
    
    Twi_data = 0
    Call Twi_init_slave                                         ' TWI aktivieren
    
    'Servokonfiguration
    Config Portb = Output
    
    Config Servos = 3 , Servo1 = Portb.0 , Servo2 = Portb.1 , Servo3 = Portb.2 , Reload = 10
    
    Enable Interrupts
    
    Dim Xpos1 As Byte
    
    'StatusLED
    Config Portd.0 = Output
    Statusled Alias Portd.0
    Statusled = 1
    
    'Variablen
    Dim Freigabe As Byte
    Freigabe = 0
    
    ' Hauptschleife
    Do
       ' Merker zurücksetzen
        Neuesbyte = 0
    
        ' schauen ob TWINT gesetzt ist
        Twi_control = Twcr And &H80                             ' Bit7 von Controlregister
    
        If Twi_control = &H80 Then
            Twi_status = Twsr And &HF8                          ' Status
    
            ' wurde ein Byte geschickt
            If Twi_status = &H80 Or Twi_status = &H88 Then
                Twi_data = Twdr                                 ' neue Daten merken
                Neuesbyte = 1                                   ' merken das ein neues Byte da ist
            End If
    
            ' TWINT muss immer gelöscht werden, damit es auf dem Bus weiter geht
            Twcr = &B11000100                                   ' TWINT löschen, erzeugt ACK
        End If
    
    
        'Start
        If Twi_data = 10 Then
            Statusled = 0                                       ' StatusLED anschalten
            Freigabe = 1
        End If
    
        'Stop
        If Twi_data = 100 Then
            Statusled = 1                                       ' StatusLED ausschalten
            Freigabe = 0
        End If
    
        'Ablauf start
        If Freigabe = 1 Then
             Select Case Twi_data
    
             Case 10:
             Servo(1) = 100
             Servo(2) = 125
             Servo(3) = 130
    
             Case 20:
             Servo(1) = 100
             Servo(2) = 125
             Servo(3) = 130
    
             For Xpos1 = 100 To 97 Step -1
             Servo(1) = Xpos1
             Waitms 167
             Next
    
             For Xpos1 = 97 To 94 Step -1
             Servo(1) = Xpos1
             Waitms 167
             Next
    
             For Xpos1 = 94 To 90 Step -1
             Servo(1) = Xpos1
             Waitms 167
             Next
    
             Servo(1) = 98
             Servo(2) = 90
             Servo(3) = 160
              Waitms 250
    
             Servo(1) = 106
             Servo(2) = 125
             Servo(3) = 130
              Waitms 250
    
             For Xpos1 = 106 To 103 Step -1
             Servo(1) = Xpos1
             Waitms 167
             Next
    
             For Xpos1 = 103 To 100 Step -1
             Servo(1) = Xpos1
             Waitms 167
             Next
    
             Case 100:
             Servo(1) = 100
             Servo(2) = 125
             Servo(3) = 130
    
             End Select
        End If
    
        Loop
    
    End
    
    
    ' Unterprogramme
    
    
    ' TWI als slave aktivieren
    Sub Twi_init_slave
        Twsr = 0                                                ' status und Prescaler auf 0
        Twdr = &HFF                                             ' default
        Twar = &HC0                                             ' Slaveadresse setzen
        Twcr = &B01000100                                       ' TWI aktivieren, ACK einschalten
    
    End Sub
    - Wie kann ich auf die ganzen Waitms-Befehle verzichten??? Denn so lange die ausgeführt werden,
    bekommt zum Beispiel der Slave nicht mehr mit, wenn der Master ihn anspricht.
    - Dass Andere, was ich sehr gerne anders realisieren möchte, ist, dass wenn der Master "Stopp" sagt,
    dass dann alle Slaves in ihrer Postion verharren und die Servos nicht mehr angesteuert werden,
    außer ein Fuß befindet sich gerade in der Luft.

    Hat jemand eine Idee oder Anregung um dies so zu realisieren???

    Grüße High Light
    __________________________________________________ _____________
    http://pe-products.jimdo.com/

  3. #73
    Erfahrener Benutzer Fleißiges Mitglied Avatar von High Light
    Registriert seit
    21.08.2009
    Ort
    Baden Württemberg
    Beiträge
    142
    Kann mir keiner weiterhelfen?

    Gruß High Light
    __________________________________________________ _____________
    http://pe-products.jimdo.com/

  4. #74
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.082
    Bei Bascom kann ich dir leider nicht helfen. Könntest du mit einem Timer einen Int auslösen und diese Int zählst du. So sparst du dir die Waitms Befehle.

    MfG Hannes

  5. #75
    Erfahrener Benutzer Fleißiges Mitglied Avatar von High Light
    Registriert seit
    21.08.2009
    Ort
    Baden Württemberg
    Beiträge
    142
    So irgendwie hatte ich es mir auch gedacht, nur weiß ich nicht wie???
    __________________________________________________ _____________
    http://pe-products.jimdo.com/

  6. #76
    Neuer Benutzer Öfters hier
    Registriert seit
    05.03.2011
    Ort
    Graz
    Beiträge
    29
    Hallo,

    Im Prinzip läufts genauso wie von 021aet04 beschrieben, ich habe das für 255 Software Timer in einer Library verpackt:
    http://bascom-forum.de/index.php/topic,2821.0.html

    mfg

  7. #77
    Erfahrener Benutzer Fleißiges Mitglied Avatar von High Light
    Registriert seit
    21.08.2009
    Ort
    Baden Württemberg
    Beiträge
    142
    Danke für den interesanten Link,
    als ich ihn letzte Woche gelesen hatte, dachte ich sehr schön,
    aber diese Woche geht er leider nicht mehr...

    Aber ich kam mit dem Beispiel nicht ganz zu recht,
    könnte mir jemand sagen, wie ich die Theorie, in mein Programm bekomme,
    als zum Beispiel für einen Servo? So eine Art Muster?

    Grüße High Light
    __________________________________________________ _____________
    http://pe-products.jimdo.com/

  8. #78
    Neuer Benutzer Öfters hier
    Registriert seit
    05.03.2011
    Ort
    Graz
    Beiträge
    29
    Hallo,

    Im Zuge der Umstellung des deutschen Bascom-Forums wurden auch die Beiträge verschoben: http://bascom-forum.de/showthread.ph...Software-Timer

    Eine Möglichkeit wäre, die Bewegungsdaten in eine Tabelle einzutragen (Servo-Nummer, Zeit, Servoposition), das könnten zb. Arrays oder Data-Anweisungen sein.
    Dann definierst du dir für jeden Servo einen Software-Timer, der bei jedem Auslösen den Servo nach den Daten in der Tabelle neu positioniert und gleichzeitig setzt du dessen Auslöse-Intervall auf die nächste Zeit in der Tabelle.
    Mit einer State-Machine und ein paar gespeicherten einfachen Grundabläufen sollten dann schon komplexere Abläufe möglich sein.

    Bascom verwendet für die Servo-Ansteuerung den Timer0, der steht somit nicht für den Software-Timer zur Verfügung.

    mfg

  9. #79
    Erfahrener Benutzer Fleißiges Mitglied Avatar von High Light
    Registriert seit
    21.08.2009
    Ort
    Baden Württemberg
    Beiträge
    142
    Danke für den neuen Link!!!

    Hättest du für mich ein Beispiel, wie ich deine Timer in Verbindung mit den Servo-Befehlen bringen muss?
    Ich weiß zwar, dass Bascom den Timer0 für die Servos verwendet, aber nicht wie man da einen anderen verwendet...

    Grüße High Light
    __________________________________________________ _____________
    http://pe-products.jimdo.com/

  10. #80
    Erfahrener Benutzer Fleißiges Mitglied Avatar von High Light
    Registriert seit
    21.08.2009
    Ort
    Baden Württemberg
    Beiträge
    142
    Anscheinend kann mir wohl niemand weiter helfen???

    Aber ich habe da noch ein anderes Problem.
    Und zwar:
    - Wenn der Master einen Wert an seine Slaves schickt und diese ihren "Fußablauf" starten sollen,
    dann tun sie dies nur so versetzt, dass wenn der erste Slave einen Durchlauf gemacht hat, dann der Nächste
    anfängt und so weiter.
    Also starten sie ihre Ablaufprogramme nicht gleichzeitig, sondern immer um einen Durchlauf versetzt.
    - Wenn aber LEDs statt Servos eingeschaltet werden funktioniert alles.

    Woran kann dies liegen?

    Grüße High Light
    __________________________________________________ _____________
    http://pe-products.jimdo.com/

Seite 8 von 11 ErsteErste ... 678910 ... LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests