- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 3 von 3

Thema: TWI-slave will nicht richtig

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    23.08.2007
    Alter
    47
    Beiträge
    27

    TWI-slave will nicht richtig

    Anzeige

    Praxistest und DIY Projekte
    Hallo

    Versuche mich zur Zeit am folgenden Beitrag:
    https://www.roboternetz.de/phpBB2/ze...=246777#246777

    Um das ganze zu verstehen wollte ich anstatt 2 Servos 2 LED' ansteuern. Diese sind aber auf dem PortD und so hab ich aus dem vorhandenen Prog die Ports von B auf D geändert und alle Dinge die auf D waren auskommentiert (siehe Code).
    Leider wollen die LED's sich aber nicht umschalten lassen egal welche kombination ich nehm (1/0 1/1 2/0 2/1). Die beiden LED's leuchten seit der Programmierung unverändert um die Wette.

    Was hab ich falsch gemacht?
    Danke für Eure Hilfe.
    Code:
     $regfile = "M32def.dat"                                    ' the used chip
    $crystal = 16000000                                    ' frequency used
    '$baud = 38400    ' brauchen wir nicht
    
    Waitms 100
    
    ' TWI init
    Gosub Twi_init_slave
    
    Config Servos = 2 , Servo1 = Portd.1 , Servo2 = Portd.6 , Reload = 8
    
    ' Ports für Servo auf Ausgang
    Config Portd.1 = Output
    Config Portd.6 = Output
    'Config Portd = Output
    
    ' Musik, wegen Stimmung usw. :-)
    'Sound Portb.0 , 300 , 450                              ' BEEP
    
    Servo(1) = 0
    Servo(2) = 0
    
    Const Maxanzahlbyte = 10                               ' Wenn mehr Zeichen kommen werden diese verworfen !
    Dim Messagebuf(maxanzahlbyte) As Byte
    Dim Anzahlbuf As Byte                                 ' Anzahl Zeichen die gesendet wurden
    
    Dim Neuemsg As Byte                                    ' zeigt an wenn eine neue Message gültig ist
    
    Dim Twi_control As Byte                                ' Controlregister lokale kopie
    Dim Twi_status As Byte
    Dim Twi_data As Byte
    
    Const Eigene_slave_adr = &H40                          ' Adresse evtl. Anpassen
    
    ' wegen der Servos, TWI braucht das hier nicht
    Enable Interrupts
    
    Twi_data = 0
    Neuemsg = 0                                            ' Paket ungültig
    Anzahlbuf = 0                                          ' Anzahl empfangener Bytes
    
    Portd = &HFF                                           ' alle LEDs aus
    
    'Print "M8 servo test"
    Do
    
        ' schauen ob TWINT gesetzt ist
        Twi_control = Twcr And &H80                        ' Bit7 von Controlregister
    
        If Twi_control = &H80 Then
            Twi_status = Twsr And &HF8                     ' Status
    
            'Portd = Not Twi_status                         ' test auf die LEDs
    
            Select Case Twi_status
    
                ' Slave Adress received, wir sind gemeint !
                Case &H60 :
                    Twcr = &B11000100                      ' TWINT löschen, erzeugt ACK
                    Anzahlbuf = 0
                    Neuemsg = 0                            ' Flag für Message ungültig
    
                ' Byte mit ACK
                Case &H80 :
                    If Anzahlbuf < Maxanzahlbyte Then
                        Incr Anzahlbuf                     ' zähler +1
                        Messagebuf(anzahlbuf) = Twdr
                    End If
                    Twcr = &B11000100                      ' TWINT löschen, erzeugt ACK
    
                ' Stop oder restart empfangen
                Case &HA0 :
                    Twcr = &B11000100                      ' TWINT löschen, erzeugt ACK
                    ' es müssen 3 Byte sein, damit das Paket OK ist
                    If Anzahlbuf = 3 Then
                        Neuemsg = 1                        ' Flag für Message gültig
                    Else
                        Neuemsg = 0                        ' Flag für Message ungültig
                    End If
    
                ' letztes Byte mit NACK, brauchen wir nicht
                Case &H88 :
                Case &HF8 :
                ' Fehler, dann reset TWI
                Case &H00 :
                    Twcr = &B11010100                      ' TWINT löschen, reset TWI
    
                ' was anderes empfangen, sollte nicht vorkommen
                Case Else :
                    Twcr = &B11000100                      ' TWINT löschen, erzeugt ACK
    
            End Select
    
        End If
    
        ' ein gültiges Paket angekommen
        If Neuemsg = 1 Then
            Neuemsg = 0                                    ' Flag wieder löschen
            ' nur wenn das erste Zeichen ein "S" ist tun wir was damit !
            If Messagebuf(1) = "S" Then
                Servo(messagebuf(2)) = Messagebuf(3)
                'Sound Portb.0 , 300 , 450                  ' Roger-BEEP
            End If
        End If
    
        Waitms 10
    
    Loop
    
    End
    
    ' TWI als slave aktivieren
    Twi_init_slave:
        Twsr = 0                                                ' status und Prescaler auf 0
        Twdr = &HFF                                             ' default
        Twar = Eigene_slave_adr                                 ' Slaveadresse setzen
        Twcr = &B01000100                                       ' TWI aktivieren, ACK einschalten
    Return

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Hallo,

    Du willst mit dem Servo-Befehl die LEDs ansteuern ?
    Ich glaub das man deshalb nix erkennt, da das Servo-Signal für die LEDs zu schnell geht.
    Die LED ist 20ms ein, 1ms aus, dann wieder 20ms ein usw. Die Zeit wird zu kurz sein um es zu sehen.


    Evtl. kannst du probieren, statt der Servos das empfangene Byte direkt an einen Port auszugeben, und dann leuchten die LEDs je nach Bitmuster.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    23.08.2007
    Alter
    47
    Beiträge
    27
    Danke

    Habs hingekriegt. Hatte nicht bedacht, dass config Servos ein Befehl ist.


    Gruss

Berechtigungen

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

LiFePO4 Speicher Test