Hallo!
ich kenne mein Code schon fast auswendig, aber ich habe das programm immer noch nicht zum Laufen bekommen.
Ich habe schon alles probiert, was mir nur einfallen konnte.
Habe jetzt den gesammten Code so weit gekürzt wie es nur geht.
Ich hoffe ich habe nichts "falsches" weggekürzt.
für mich scheint das Programm logisch zu sein, und müsste laufen. Tut es aber nicht.
ich habe am TX vom MCP2515 kein Signal.
Falls Jemand Zeit hat, BITTE durchgucken. Ich bin schon Ratlos.
Code:
$regfile = "m8def.dat" ' ATMega8
$crystal = 16000000 ' Baudratenquarz der AVR (mega8 mit 16MHz)
$hwstack = 40 ' default use 32 for the hardware stack
$swstack = 80 ' default use 10 for the SW stack
$framesize = 90
$baud = 9600
' Allgemeine Config ************************************************************
Config Pind.2 = Input 'Taster
Config Portb.0 = Output 'LED
Taster Alias Pind.2
Led Alias Portb.0
Led = 0 'Grundstellung
'CAN relevante Config **********************************************************
Declare Sub Mcp2515_write(byval Reg_add As Byte , Byval Reg_val As Word)
Declare Sub Mcp2515_bitmodify(byval Reg_add As Byte , Byval Reg_mask As Byte , Byval Reg_val As Byte)
Mcp2515cs Alias Portb.2 'CS am Mega8
Config Mcp2515cs = Output
Const Cmd_write = &H02 ' Write Command
Const Cmd_bitmodify = &H05 ' Bit-modify Command
Const Cmd_reset = &HC0 ' Reset Command
Const Cmd_rts0 = &H81
Const Cmd_rts1 = &H82
Const Caninte = &H2B
Const Canctrl = &H0F
Const Canstat = &H0E ' Statusregister
Const Eflg = &H2D ' Error Flag Register
Const Cnf3 = &H28 ' Configuration Register 3
Const Cnf2 = &H29 ' Configuration Register 2
Const Cnf1 = &H2A ' Configuration Register 1
Const Txb0ctrl = &B00110000 ' Transmit Buffer 0 Control Register
Const Txb0sidh = &B00110001 ' Transmit Buffer 0 Std Identifier High
Const Txb0sidl = &B00110010 ' Transmit Buffer 0 Std Identifier Low
Const Txb0dlc = &B00110101 ' Transmit Buffer 0 Data Length Code
Const Txb0d0 = &B00110110 ' Transmit Buffer 0 Data Byte 0
' Hardware SPI-Schnittstelle konfigurieren**************************************
Config Portb.4 = Input 'MISO von 2515
Config Portb.3 = Output 'MOSI von 2515
Config Portb.5 = Output 'SCK
Spcr = &B01010001 'Bit7=0:IntAus, Bit6=1:SPIAn, Bit5=0:MSBfirst,
'Bit4=1:Masterfunktion, Bit3=0:SCK=0wennIdle,
'Bit2=0:L-H-Flanke, Bit1+0=01:AVRClock/16
'Programm Start*****************************************************************
Gosub Can_init
Abfrage:
Do
If Taster = 0 Then
Set Led
Wait 1
Reset Led
Waitms 500
Gosub Data_send
Else
Goto Abfrage
Loop
End If
End
'CAN Initialisieren *****************************
Can_init:
Reset Mcp2515cs ' Reset MCP2515
Spdr = &HC0 ' IC reset
Do
Loop Until Spsr.spif = 1
Set Mcp2515cs
Waitms 2000
Mcp2515_write Canctrl , &B10001101 ' set configuration mode, osm=1, clkout enabled, prescaler /2
' CAN 100 kbit/s
Mcp2515_write Cnf1 , &B00000001 ' Can Geschwindigkeit einstellen (Cnf1-Cnf3)
Mcp2515_write Cnf2 , &B10111010 ' Cnf2 = &H29
Mcp2515_write Cnf3 , &B00000111 ' Cnf3 = &H28
Mcp2515_write Caninte , &B00000000 'Can interrupt disabled
Mcp2515_write Canctrl , &B00001101 ' set normal operation mode, osm=1, clkout enabled, prescaler /2
Return
'Daten ubertargen ***********************************************************
Data_send:
Mcp2515_bitmodify Txb0ctrl , &B00000011 , &B00000011 ' TX-Konfiguration
Mcp2515_write Txb0sidh , &B10101010 ' Empfangeradresse setzen
Mcp2515_write Txb0sidl , &B10101010 ' Empfangeradresse setzen
Mcp2515_write Txb0dlc , &B00000001 ' Paketlange festlegen fur ein Byte
'Daten zur Uebertragung************************
Mcp2515_write Txb0d0 , &B01011101 ' Zu ubertragende Daten setzen
' Ubertragung auslosen
Reset Mcp2515cs
Waitms 20
Spdr = Cmd_rts0 '!!!!! DIESE STELLE IST MIR UNKLAR
Do
Loop Until Spsr.spif = 1
Waitus 20
Set Mcp2515cs
Waitms 2
Set Led 'LED als Anzeige "Gesendet"
Waitms 200
Reset Led
Waitms 100
Goto Abfrage 'Zurück zur Abfrage
Sub Mcp2515_bitmodify(reg_add , Reg_mask , Reg_val)
Local Can_tmp2 As Byte
Mcp2515cs = 0
Can_tmp2 = Cmd_bitmodify
Spdr = Can_tmp2
Do
Loop Until Spsr.spif = 1
Waitms 2
Spdr = Reg_add
Do
Loop Until Spsr.spif = 1
Spdr = Reg_mask
Do
Loop Until Spsr.spif = 1
Spdr = Reg_val
Do
Loop Until Spsr.spif = 1
Mcp2515cs = 1
End Sub
Sub Mcp2515_write(reg_add , Reg_val)
Local Can_tmp2 As Byte
Mcp2515cs = 0
Can_tmp2 = Cmd_write
Spdr = Can_tmp2
Do
Loop Until Spsr.spif = 1
Waitms 2
Spdr = Reg_add
Do
Loop Until Spsr.spif = 1
Spdr = Reg_val
Do
Loop Until Spsr.spif = 1
Mcp2515cs = 1
End Sub
Im Anhang ist der Schaltplan.
Danke schön
Gruss Alexander
Lesezeichen