PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : TWI-slave will nicht richtig



chaoscrack
24.09.2007, 21:40
Hallo

Versuche mich zur Zeit am folgenden Beitrag:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=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.

$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

linux_80
24.09.2007, 23:16
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. :-k


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

chaoscrack
25.09.2007, 21:46
Danke

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


Gruss