- Akku Tests und Balkonkraftwerk Speicher         
Seite 8 von 8 ErsteErste ... 678
Ergebnis 71 bis 80 von 107

Thema: Erster Hexapod

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Moderator Robotik Einstein Avatar von HannoHupmann
    Registriert seit
    19.11.2005
    Ort
    München
    Alter
    42
    Beiträge
    4.534
    Blog-Einträge
    1
    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. #2
    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. #3
    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. #4
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.096
    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. #5
    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/

Seite 8 von 8 ErsteErste ... 678

Berechtigungen

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

12V Akku bauen