chaoscrack
24.09.2007, 22: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
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