Der Atmega328pb hat zwei SPI. Das zweite anstelle shiftout könnte geschwindigkeitsvorteil bieten.
Byte zusammenfassen und schieben
Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen
Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.
Hinweis kann nach Kenntnisnahme deaktiviert werden!
-
-
Michael schrieb:
katipefendi schrieb:
Liege ich da richtig mit mein Fehler?
- vor der SPI-Konfiguration als Master muss der SS-Pin zwingend auf Ausgang gesetzt sein
- Stackwerte vergrößern
- Absturz des WIZ abfangen
- Watchdog
und natürlich auch
-Debug-LEDs nutzen, damit du siehst, wo der AVR hängen bleibt.
??
Stackwerte vergrößern
was wäre eine optimale Größe für die Stacks? -
katipefendi schrieb:
- vor der SPI-Konfiguration als Master muss der SS-Pin zwingend auf Ausgang gesetzt sein
??
Edit:
Master.png
Es reicht, wenn der Pin High ist oder als Ausgang konfiguriert.
Die älteren AVRs hatten da ein Problem.
Und nein, das ist kein Bascom-Bug. -
Michael schrieb:
katipefendi schrieb:
- vor der SPI-Konfiguration als Master muss der SS-Pin zwingend auf Ausgang gesetzt sein
??
Edit:
Master.png
Es reicht, wenn der Pin High ist oder als Ausgang konfiguriert.
Die älteren AVRs hatten da ein Problem.
Und nein, das ist kein Bascom-Bug.
BASCOM-Quellcode
- $regfile = "m328PBdef.dat"
- $crystal = 16000000
- '$baud = 19200
- $hwstack = 130
- $swstack = 180
- $framesize = 200
- Myss Alias Portb.2
- Config Myss = Output
- Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 0
- Spiinit
- Enable Interrupts
- '-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Config für den Manuellen IP Taster
- Config Pinb.0 = Input
- Portb.0 = 1
- Ipreset Alias Pinb.0
- '-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Config für den Schieberegister
- Config Portc.1 = Output
- Config Portc.2 = Output
- Config Portc.3 = Output
- Dout1 Alias Portc.1
- Sck1 Alias Portc.2
- Rck1 Alias Portc.3
- Config Portd.2 = Output
- 74hc595_g Alias Portd.2
- 74hc595_g = 1
- Config Portc.5 = Output
- Hc595_reset Alias Portc.5
- '-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Config für den Power LED Grün LED
- Config Portd.5 = Output
- Betriebsled Alias Portd.5
- Betriebsled = 1
- '-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Config für den W5500 RESET-- ----------------
- Config Portb.1 = Output
- W5500_nreset Alias Portb.1
- '######################### VARIABLEN FÜR DIE ETHERNET VERBINDUNG ###############
- Dim Xid(4) As Byte
- Dim Mac_add(6) As Byte
- '----- Zeitinterval für den W5500, damit das W5500 initialisieren kann ---------
- Reset W5500_nreset
- Waitms 5
- Set W5500_nreset
- Waitms 400
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- Xid(1) = 220
- Xid(2) = 05
- Xid(3) = 80
- Xid(4) = 91
- Mac_add(1) = 0
- Mac_add(2) = 8
- Mac_add(3) = 220
- Mac_add(4) = 05
- Mac_add(5) = 80
- Mac_add(6) = 80
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- Dim Ee_ip(4) As Eram Byte 'At 4
- Dim Ee_mask(4) As Eram Byte 'At 6
- Dim Ee_gateway(4) As Eram Byte 'At 14
- Dim Ee_port As Eram String * 5 'At 18
- Dim Eth_ip(4) As Byte
- Dim Eth_mask(4) As Byte
- Dim Eth_gateway(4) As Byte
- Dim Eth_port As String * 5
- Dim Ip_ As Long
- Dim Subnetmask_ As Long
- Dim Gateway_ As Long
- Dim Port_ As Long
- Config Tcpip = Noint , Mac = 0.8.220.05.80.91 , Ip = 192.168.0.11 , Submask = 255.255.255.0 , Gateway = 192.168.0.254 , Localport = 2005 , Chip = W5500 , Spi = 1 , Cs = Myss
- '######################## ENDE DER ETHERNET VARIABLEN ##########################
- Dim Bclient As Byte
- Dim Idx As Byte
- Dim Flags As Byte
- Dim Result1 As Word
- Dim Tmp As Byte
- Dim Sfc As String * 100
- Dim Y As String * 100
- Dim Command_array(14) As String * 35
- Dim Channel1 As String * 3
- Dim Channel2 As String * 3
- Dim Channel3 As String * 3
- Dim Channel4 As String * 3
- Dim Channel5 As String * 3
- Dim Channel6 As String * 3
- Dim Channel7 As String * 3
- Dim Channel8 As String * 3
- 'Dim Senddata1 As Byte
- 'Dim Senddata2 As Byte
- 'Dim Senddata3 As Byte
- 'Dim Senddata4 As Byte
- 'Dim Senddata5 As Byte
- 'Dim Senddata6 As Byte
- 'Dim Senddata7 As Byte
- 'Dim Senddata8 As Byte
- Dim Senddatato1 As Byte
- Dim Senddatato2 As Byte
- Dim Senddatato3 As Byte
- Dim Senddatato4 As Byte
- Dim Senddatato5 As Byte
- Dim Senddatato6 As Byte
- Dim Senddatato7 As Byte
- Dim Senddatato8 As Byte
- 'Dim Datenschieben As Double
- 'Dim Senddata(8) As Byte At Datenschieben Overlay
- 'Dim Temp_byte As Byte
- Dim Datenschieben As Double
- Dim Lsbdata8 As Byte At Datenschieben Overlay
- Dim Senddata7 As Byte At Datenschieben + 1 Overlay
- Dim Lsbdata6 As Byte At Datenschieben + 2 Overlay
- Dim Senddata5 As Byte At Datenschieben + 3 Overlay
- Dim Senddata1 As Byte At Datenschieben + 4 Overlay
- Dim Lsbdata2 As Byte At Datenschieben + 5 Overlay
- Dim Senddata3 As Byte At Datenschieben + 6 Overlay
- Dim Lsbdata4 As Byte At Datenschieben + 7 Overlay
- Dim Senddata8 As Byte
- Dim Senddata6 As Byte
- Dim Senddata2 As Byte
- Dim Senddata4 As Byte
- Wait 1
- Hc595_reset = 1
- '-------------------------------------------------------------------------------
- Local_port = Port_
- Settcp Mac_add(1) . Mac_add(2) . Mac_add(3) . Mac_add(4) . Mac_add(5) . Mac_add(6) , Ip_ , Subnetmask_ , Gateway_
- Do
- Debounce Ipreset , 0 , Set_ip_reset , Sub
- 'Start Watchdog
- For Idx = 0 To 3
- Result1 = Socketstat(idx , 0) ' get status
- Select Case Result1
- Case Sock_established
- If Flags.idx = 0 Then
- Sfc = "Verbindung aufgebaut"
- Flags.idx = 1
- Result1 = Tcpwritestr(idx , Sfc , 255 )
- End If
- Result1 = Socketstat(idx , Sel_recv) ' get number of bytes waiting
- If Result1 > 0 Then
- Do
- Result1 = Tcpread(idx , Sfc)
- Tmp = Split(sfc , Command_array(1) , "|")
- Select Case Command_array(1)
- Case "1"
- Command_array(1) = "-1"
- Channel1 = Command_array(2)
- Channel2 = Command_array(3)
- Channel3 = Command_array(4)
- Channel4 = Command_array(5)
- Channel5 = Command_array(6)
- Channel6 = Command_array(7)
- Channel7 = Command_array(8)
- Channel8 = Command_array(9)
- Senddata1 = Val(channel1)
- Senddata2 = Val(channel2)
- Senddata3 = Val(channel3)
- Senddata4 = Val(channel4)
- Senddata5 = Val(channel5)
- Senddata6 = Val(channel6)
- Senddata7 = Val(channel7)
- Senddata8 = Val(channel8)
- 'Temp_byte = Flip(senddata8)
- ' Senddata(1) = Temp_byte
- ' Senddata(2) = Senddata7
- ' Temp_byte = Flip(senddata6)
- ' Senddata(3) = Temp_byte
- ' Senddata(4) = Senddata5
- ' Senddata(5) = Senddata1
- ' Temp_byte = Flip(senddata2)
- ' Senddata(6) = Temp_byte
- ' Senddata(7) = Senddata3
- ' Temp_byte = Flip(senddata4)
- ' Senddata(8) = Temp_byte
- Lsbdata8 = Flip(senddata8)
- Lsbdata6 = Flip(senddata6)
- Lsbdata2 = Flip(senddata2)
- Lsbdata4 = Flip(senddata4)
- Shiftout Dout1 , Sck1 , Datenschieben , 0
- ' Shiftout Dout1 , Sck1 , Senddata8 , 2
- ' Shiftout Dout1 , Sck1 , Senddata7 , 0
- ' Shiftout Dout1 , Sck1 , Senddata6 , 2
- ' Shiftout Dout1 , Sck1 , Senddata5 , 0
- ' Shiftout Dout1 , Sck1 , Senddata1 , 0
- ' Shiftout Dout1 , Sck1 , Senddata2 , 2
- ' Shiftout Dout1 , Sck1 , Senddata3 , 0
- ' Shiftout Dout1 , Sck1 , Senddata4 , 2
- Rck1 = 1
- Rck1 = 0
- End Select
- Loop Until Sfc = ""
- End If
- Case Sock_close_wait
- Closesocket Idx
- Case Sock_closed
- Bclient = Getsocket(idx , Sock_stream , Local_port , 0)
- Socketlisten Idx
- Flags.idx = 0
- Case Sock_listen
- Case Else
- End Select
- Next
- 'Reset Watchdog
- Loop
- End
- '-------------------------------------------------------------------------------
- Set_ip_reset: 'IP SETZEN
- Eth_ip(1) = 192 : Eth_ip(2) = 168 : Eth_ip(3) = 55 : Eth_ip(4) = 55
- Eth_mask(1) = 255 : Eth_mask(2) = 255 : Eth_mask(3) = 255 : Eth_mask(4) = 0
- Eth_gateway(1) = 192 : Eth_gateway(2) = 168 : Eth_gateway(3) = 0 : Eth_gateway(4) = 254
- Eth_port = "1001"
- Ee_ip(1) = Eth_ip(1) : Ee_ip(2) = Eth_ip(2) : Ee_ip(3) = Eth_ip(3) : Ee_ip(4) = Eth_ip(4)
- Ee_mask(1) = Eth_mask(1) : Ee_mask(2) = Eth_mask(2) : Ee_mask(3) = Eth_mask(3) : Ee_mask(4) = Eth_mask(4)
- Ee_gateway(1) = Eth_gateway(1) : Ee_gateway(2) = Eth_gateway(2) : Ee_gateway(3) = Eth_gateway(3) : Ee_gateway(4) = Eth_gateway(4)
- Ee_port = Eth_port
- Goto _reset
- '-------------------------------------------------------------------------------
- Set_eth_values: 'BEIM START AUS DEM EEPROM LESEN
- Eth_ip(1) = Ee_ip(1) : Eth_ip(2) = Ee_ip(2) : Eth_ip(3) = Ee_ip(3) : Eth_ip(4) = Ee_ip(4)
- Eth_mask(1) = Ee_mask(1) : Eth_mask(2) = Ee_mask(2) : Eth_mask(3) = Ee_mask(3) : Eth_mask(4) = Ee_mask(4)
- Eth_gateway(1) = Ee_gateway(1) : Eth_gateway(2) = Ee_gateway(2) : Eth_gateway(3) = Ee_gateway(3) : Eth_gateway(4) = Ee_gateway(4)
- Eth_port = Ee_port
- Ip_ = Maketcp(eth_ip(1) , Eth_ip(2) , Eth_ip(3) , Eth_ip(4))
- Subnetmask_ = Maketcp(eth_mask(1) , Eth_mask(2) , Eth_mask(3) , Eth_mask(4) )
- Gateway_ = Maketcp(eth_gateway(1) , Eth_gateway(2) , Eth_gateway(3) , Eth_gateway(4))
- Port_ = Val(eth_port)
- Return
- '-------------------------------------------------------------------------------
Stacks bis zum geht nicht her erhört
$hwstack = 130
$swstack = 180
$framesize = 200
leider ist das verhalten wie zu vor. -
katipefendi schrieb:
Es schein danach, als wenn die Schleife langsam arbeitet oder bzw. nicht hinterher kommt.
Direktzuweisungen ( Senddata1 = Val(command_array(2)) ) holen noch ein bisschen raus (ca10%)
Dann kann das Spi noch doppelten Takt bekommen (Spsr.0 = 1) -
katipefendi schrieb:
leider ist das verhalten wie zu vor.
Schau dir mal den Traffic mit Wireshark an, ich denke nicht, dass das sauber läuft.
Wenn der WIZ mehrere Pakete kriegt, droppt oder sammelt er die Daten vielleicht auf und du steigst falsch in den Datenstrom ein.
Was macht die Debug-LED? Hast du schon rausbekommen, wo genau das Programm hängt? -
Hallo Zusammen,
Fehler wurde behoben.
WIZnet W5500 ausgetauscht, nun funktioniert es wie geschmiert
Anscheinend war der Chip defekt, merkwürdig.