Hallo,
ich konnte die Tage den neuen Teil meiner RGB LED Steuerung in Betrieb nehmen, habe aber mit dem Slave noch ein paar Probleme.
Prinzipiell funktioniert es. Wenn man genauer und länger hinschaut, wieder nicht..
Werden Werte an den Slave (von Atmega 644 an den Atmega 48) gesendet funktioniert das meist nur beim ersten mal korrekt,
wenn sich die Werte dann nach einer Stunde oder so ändern, sollen diese auch an den Slave geschickt werden, dort kommen sie dann oft nicht an.
Ich habe dazu im Master Programm noch eine extra sub die ich mit einem Taster direkt anspreche, daher kann ich dann sehen das auch diese voreingestellten
Werte nicht beim Slave ankommen, (Da beim Slave dann falsche Farben dargestellt werden).
Hier mal der relevante Teil vom Master: (der ganze Code im Anhang, da zu lang)
Hier der Code vom Slave:
Um die Probleme besser in den Griff zu bekommen, bin ich davon weggegangen immer alle Werte in folge zu schreiben, also immer alle 6 bytes für die einzelnen Kanäle. Stattdessen schicke ich jetzt zu jedem Nutzbyte ein Positionsbyte, das der slave zunächst auch richtig auswerten kann..
Hat jemand einen Tipp?Anhang anzeigen aquarium_led_master.bas
ich konnte die Tage den neuen Teil meiner RGB LED Steuerung in Betrieb nehmen, habe aber mit dem Slave noch ein paar Probleme.
Prinzipiell funktioniert es. Wenn man genauer und länger hinschaut, wieder nicht..
Werden Werte an den Slave (von Atmega 644 an den Atmega 48) gesendet funktioniert das meist nur beim ersten mal korrekt,
wenn sich die Werte dann nach einer Stunde oder so ändern, sollen diese auch an den Slave geschickt werden, dort kommen sie dann oft nicht an.
Ich habe dazu im Master Programm noch eine extra sub die ich mit einem Taster direkt anspreche, daher kann ich dann sehen das auch diese voreingestellten
Werte nicht beim Slave ankommen, (Da beim Slave dann falsche Farben dargestellt werden).
Hier mal der relevante Teil vom Master: (der ganze Code im Anhang, da zu lang)
Code:
Pwm_senden:
Start Watchdog
Disable Interrupts
For Zeiger2 = 1 To 6
If Pwm_wert(zeiger2) <> Lastsend(zeiger2) Then
Do
Call Twi_send_byte(&H40 , Pwm_pos(zeiger2)) ' Den Wert zum Slave senden
Call Twi_send_byte(&H40 , Pwm_wert(zeiger2))
Try = Try + 1
Waitms 10
Loop Until Error = 0 Or Try >= 5
Error_send = Error
Lastsend(zeiger) = Pwm_wert(zeiger) ' Den Wert merken der zuletzt gesendet wurde
End If
Next
Ocr2b = Pwm_wert(7) 'PWM auch für den Atmega644 setzen
Ocr2a = Pwm_wert(7) 'PWM auch für den Atmega644 setzen
Stop Watchdog
Enable Interrupts
Return
Pwm_test:
Start Watchdog
Pwm_wert(1) = 0 'grün rechts
Pwm_wert(2) = 30 'rot rechts
Pwm_wert(3) = 30 'blau rechts
Pwm_wert(4) = 1 'blau links
Pwm_wert(5) = 30 'rot links
Pwm_wert(6) = 1 'grün links
For Zeiger3 = 1 To 6
Call Twi_send_byte(&H40 , Pwm_pos(zeiger3)) ' Den Wert zum Slave senden
Call Twi_send_byte(&H40 , Pwm_wert(zeiger3))
Waitms 10
Next
Stop Watchdog
Return
Hier der Code vom Slave:
Code:
'Der Atemga 644 steuert einen Atmega 48 der via I²C als Slave angesprochen wird.
'Der Atmega 48 ist für die Erzeugung von 6 PWM Signalen verantwortlich. (2 LED Bänder mit je RGB)
'Den Wert für die PWM Signale erhält er vom Master. 6 Bytes mit den PWM Werten werden für die einzelnen Kanäle übertagen.
$regfile = "m48def.dat"
$lib "mcsbyte.lbx"
$lib "i2c_twi.lbx"
Led_r1 Alias Ocr2b
Led_g1 Alias Ocr0b
Led_b1 Alias Ocr0a
Led_r2 Alias Ocr1a
Led_g2 Alias Ocr1b
Led_b2 Alias Ocr2a
Config Portd = Output
Config Portb = Output
Config Watchdog = 4096
'TWI Konfiguration
Twsr = 0 ' status und Prescaler auf 0
Twdr = &HFF ' default
Twar = &H40 ' Slaveadresse setzen
Twcr = &B01000100 ' TWI aktivieren, ACK einschalten
Dim Twi_control As Byte ' Controlregister lokale kopie
Dim Twi_status As Byte
Dim Twi_data As Byte
Dim Neuesbyte As Byte ' Bytemerker
Dim Pwm_pos As Byte
Dim Pwm_wert As Byte
Dim Pwm(6) As Byte
Dim Position_ok As Byte
Dim Error As Byte
Twi_data = 0
Position_ok = 0
Pwm_pos = 0
Error = 0
'PWM Kanäle konfigurieren
Tccr0a = &B10100001
Tccr0b = &B00000010
Tccr1a = &B10100001
Tccr1b = &B00000001
Tccr2a = &B10100001
Tccr2b = &B00000010
Led_r1 = 1
Led_g1 = 1
Led_b1 = 1
Led_r2 = 1
Led_g2 = 1
Led_b2 = 1
Do
Start Watchdog
If Pwm_pos <> 0 And Position_ok = 0 Then
Select Case Pwm_pos
Case 1 : Pwm(1) = Pwm_wert
Pwm_pos = 0 ' Ausgabe der PWM Spannung
Case 2 : Pwm(2) = Pwm_wert
Pwm_pos = 0
Case 3 : Pwm(3) = Pwm_wert
Pwm_pos = 0
Case 4 : Pwm(4) = Pwm_wert
Pwm_pos = 0
Case 5 : Pwm(5) = Pwm_wert
Pwm_pos = 0
Case 6 : Pwm(6) = Pwm_wert
Pwm_pos = 0
End Select
End If
Led_r1 = Pwm(1)
Led_g1 = Pwm(2)
Led_b1 = Pwm(3)
Led_r2 = Pwm(4)
Led_g2 = Pwm(5)
Led_b2 = Pwm(6)
'##########################################################################################################
' TWI bytes empfangen wenn etwas gesendet wird
'Neuesbyte = 0 ' Merker zurücksetzen
Twi_control = Twcr And &H80 ' schauen ob TWINT gesetzt ist - Bit7 von Controlregster
If Twi_control = &H80 Then
Twi_status = Twsr And &HF8 ' Status
If Twi_status = &H80 Or Twi_status = &H88 Then ' wurde ein Byte geschickt
Twi_data = Twdr ' neue Daten merken
Neuesbyte = 1 ' merken das ein neues Byte da ist
Else
Error = Twi_status ' Fehler
End If
Twcr = &B11000100 ' TWINT muss immer gelöscht werden, damit es auf dem Bus weiter geht - TWINT löschen, erzeugt ACK
Else
Error = Twi_status ' Fehler
End If
'#########################################################################################################
If Error = 1 Then ' Im Fehlerfall alles zurücksetzen
Error = 0
Neuesbyte = 0
Pwm_pos = 0
Position_ok = 0
End If
If Neuesbyte <> 0 And Position_ok = 0 Then ' wenn ein neues Byte gekommen ist, dieses an PortD ausgeben
Pwm_pos = Twi_data ' empfangen Bytes in Array speichern
Position_ok = 1
Neuesbyte = 0
End If
If Neuesbyte <> 0 And Position_ok = 1 Then
Pwm_wert = Twi_data
Neuesbyte = 0
Position_ok = 0
End If
Stop Watchdog
'##########################################################################################################
Loop
Um die Probleme besser in den Griff zu bekommen, bin ich davon weggegangen immer alle Werte in folge zu schreiben, also immer alle 6 bytes für die einzelnen Kanäle. Stattdessen schicke ich jetzt zu jedem Nutzbyte ein Positionsbyte, das der slave zunächst auch richtig auswerten kann..
Hat jemand einen Tipp?Anhang anzeigen aquarium_led_master.bas