Hi Leute !!!
Ich möchte gern eine Funkstrecke zwischen zwei ATTiny45 mittels zweier nRF24L01+ Module aufbauen, welche über SPI angesprochen werden. Da ich allerdings mit diesem Interface noch nicht gearbeitet habe, wollte ich die SPI-Kommunikation zunächst einmal nur zwischen den direkt miteinander verbundenen µCs testen.
Dabei sendet der Master abwechselnd im Abstand von 20 Sekunden jeweils den Wert "1" und "2". Empfängt der Slave eine "1", schaltet er eine LED an, empfängt er eine "2", wieder aus. Als Sendesignal blinkt am Master eine LED kurz. Das Ganze sollte dementsprechend also folgendermaßen ablaufen:
> Master-LED blinkt --> Wert "1" wird gesendet --> Slave empfängt "1" --> LED am Slave leuchtet
> 20 Sekunden warten
> Master-LED blinkt --> Wert "2" wird gesendet --> Slave empfängt "2" --> LED am Slave aus
> 20 Sekunden warten
usw. .....
Leider tut sich am Slave nichts, d. h. die LED bleibt aus.
------------------------------------------------------------------------
' MASTER
$regfile = "attiny45.dat"
$crystal = 128000
$hwstack = 36
$swstack = 8
$framesize = 24
Dim Datatosend As Byte
' USCK ----> SCK (Slave)
Config Portb.2 = Output
' DO ----> SDI (Slave)
Config Portb.1 = Output
' DI ----> SDO (Slave)
Config Portb.0 = Input
Portb.0 = 1
' Sende-LED
Config Portb.4 = Output
Portb.4 = 0
Usicr = Bits(usiwm0 , Usics1 , Usiclk , Usitc)
Do
Datatosend = 1
Gosub Transmission
Wait 20
Datatosend = 2
Gosub Transmission
Wait 20
Loop
End
Transmission:
Portb.4 = 1
Waitms 200
Portb.4 = 0
' USIOIF löschen und USI-Zähler auf 0
Usisr = Bits(usioif)
' Datenregister beschreiben
Usidr = Datatosend
' 8 Takte warten bis Byte übertragen
While Usisr.usioif = 0 : Set Usicr.usitc : Wend
Return
------------------------------------------------------------------------
' SLAVE
$regfile = "attiny45.dat"
$crystal = 128000
$hwstack = 36
$swstack = 8
$framesize = 24
Dim Empfangsbyte As Byte
Dim Usi_data_ready As Bit
' USCK ----> SCK (Slave)
Config Portb.2 = Output
' DO ----> SDI (Slave)
Config Portb.1 = Output
' DI ----> SDO (Slave)
Config Portb.0 = Input
Portb.0 = 1
' Signal-LED
Config Portb.4 = Output
Usicr = Bits(usiwm0 , Usics1 , Usioie)
On Usi_ovf Usi_overflow_int
Enable Usi_ovf
Enable Interrupts
Do
If Usi_data_ready = 1 Then
Reset Usi_data_ready
If Empfangsbyte = 1 Then Portb.4 = 1
If Empfangsbyte = 2 Then Portb.4 = 0
End If
Loop
End
Usi_overflow_int:
Set Usi_data_ready
Empfangsbyte = Usidr
'Reset Overflow Flag and reset 4-Bit USI counter
Usisr = &B01_000000
Return
------------------------------------------------------------------------
Dann ist auch immer die Rede von "Slave Select" als Leitung, über die der Master dem Slave den Beginn einer Übertragung signalisiert. Diese Funktion ist bei dem USI der Tinys aber gar nicht vorgesehen und kann laut Hilfe offensichtlich in diesem Fall auch weggelassen werden: "... We do not use Slave Select in this example ... ". Das verwirrt mich etwas. Ist es nun notwendig, den Übertragungsstart zu signalisieren, oder nicht?
Außerdem verstehe ich nicht so ganz, wie es sich mit der Clock-Einstellung verhält. Im Bascom-Beispiel wird diese für den Master überhaupt nicht definiert, für den Slave dann allerdings schon: " ... Clock Source: External, positive edge ; External, both edges ... " ?
Naja, und dann sollte nach meinem Verständnis während der Übertragung doch eigentlich ein Pegel am USCK-Pin (Clock) des Master messbar sein, oder liege ich da falsch? Denn dort messe ich konstant 0 V.
Grüße,
The SphereX
Ich möchte gern eine Funkstrecke zwischen zwei ATTiny45 mittels zweier nRF24L01+ Module aufbauen, welche über SPI angesprochen werden. Da ich allerdings mit diesem Interface noch nicht gearbeitet habe, wollte ich die SPI-Kommunikation zunächst einmal nur zwischen den direkt miteinander verbundenen µCs testen.
Dabei sendet der Master abwechselnd im Abstand von 20 Sekunden jeweils den Wert "1" und "2". Empfängt der Slave eine "1", schaltet er eine LED an, empfängt er eine "2", wieder aus. Als Sendesignal blinkt am Master eine LED kurz. Das Ganze sollte dementsprechend also folgendermaßen ablaufen:
> Master-LED blinkt --> Wert "1" wird gesendet --> Slave empfängt "1" --> LED am Slave leuchtet
> 20 Sekunden warten
> Master-LED blinkt --> Wert "2" wird gesendet --> Slave empfängt "2" --> LED am Slave aus
> 20 Sekunden warten
usw. .....
Leider tut sich am Slave nichts, d. h. die LED bleibt aus.
------------------------------------------------------------------------
' MASTER
$regfile = "attiny45.dat"
$crystal = 128000
$hwstack = 36
$swstack = 8
$framesize = 24
Dim Datatosend As Byte
' USCK ----> SCK (Slave)
Config Portb.2 = Output
' DO ----> SDI (Slave)
Config Portb.1 = Output
' DI ----> SDO (Slave)
Config Portb.0 = Input
Portb.0 = 1
' Sende-LED
Config Portb.4 = Output
Portb.4 = 0
Usicr = Bits(usiwm0 , Usics1 , Usiclk , Usitc)
Do
Datatosend = 1
Gosub Transmission
Wait 20
Datatosend = 2
Gosub Transmission
Wait 20
Loop
End
Transmission:
Portb.4 = 1
Waitms 200
Portb.4 = 0
' USIOIF löschen und USI-Zähler auf 0
Usisr = Bits(usioif)
' Datenregister beschreiben
Usidr = Datatosend
' 8 Takte warten bis Byte übertragen
While Usisr.usioif = 0 : Set Usicr.usitc : Wend
Return
------------------------------------------------------------------------
' SLAVE
$regfile = "attiny45.dat"
$crystal = 128000
$hwstack = 36
$swstack = 8
$framesize = 24
Dim Empfangsbyte As Byte
Dim Usi_data_ready As Bit
' USCK ----> SCK (Slave)
Config Portb.2 = Output
' DO ----> SDI (Slave)
Config Portb.1 = Output
' DI ----> SDO (Slave)
Config Portb.0 = Input
Portb.0 = 1
' Signal-LED
Config Portb.4 = Output
Usicr = Bits(usiwm0 , Usics1 , Usioie)
On Usi_ovf Usi_overflow_int
Enable Usi_ovf
Enable Interrupts
Do
If Usi_data_ready = 1 Then
Reset Usi_data_ready
If Empfangsbyte = 1 Then Portb.4 = 1
If Empfangsbyte = 2 Then Portb.4 = 0
End If
Loop
End
Usi_overflow_int:
Set Usi_data_ready
Empfangsbyte = Usidr
'Reset Overflow Flag and reset 4-Bit USI counter
Usisr = &B01_000000
Return
------------------------------------------------------------------------
Dann ist auch immer die Rede von "Slave Select" als Leitung, über die der Master dem Slave den Beginn einer Übertragung signalisiert. Diese Funktion ist bei dem USI der Tinys aber gar nicht vorgesehen und kann laut Hilfe offensichtlich in diesem Fall auch weggelassen werden: "... We do not use Slave Select in this example ... ". Das verwirrt mich etwas. Ist es nun notwendig, den Übertragungsstart zu signalisieren, oder nicht?
Außerdem verstehe ich nicht so ganz, wie es sich mit der Clock-Einstellung verhält. Im Bascom-Beispiel wird diese für den Master überhaupt nicht definiert, für den Slave dann allerdings schon: " ... Clock Source: External, positive edge ; External, both edges ... " ?
Naja, und dann sollte nach meinem Verständnis während der Übertragung doch eigentlich ein Pegel am USCK-Pin (Clock) des Master messbar sein, oder liege ich da falsch? Denn dort messe ich konstant 0 V.
Grüße,
The SphereX