Hallo zusammen, für das mitlesen am CAN BUS (100Kb/s) habe ich mir eine Schaltung mit AtMega328P und MCP2515 und MCP2551 aufgebaut. Sowohl der ATMega wie auch der MCP haben einen eigenen 16MHz Quarz. Den Basiscode (ursprünglich für ATMega8) habe ich hier aus dem Forum den ich nochmal anhand des Datenblattes und der Erklärungen von der Seite Kreatives Chaos gegen gelesen habe und aufgefallen ist mir nichts falsches. Der ATMega8 hat das gleiche Pinlayout wie der ATMega328p und war so gut zuersetzen - nahezu Pinkompatibel. Genutzt wird die Hardware SPI Der Code läßt sich kompelieren und auch in den MC laden, leider schein es bei der Initialisierung schon nicht hinzuhauen. Die Ini... läuft so durch und der MC hängt sich auch nicht weg, daher vermutet ich das die Routinen auch gehen. Nach der Initialisierung lese ich die Register aus und überall ist nur 255 drin. nichts geht........wie auch wenn ich die Register nicht gesetzt bekomme. Was mache ich falsch. ich brüte Stunde um Stunde schon seit Wochen und komm nicht dahinter. Anbei der Code und ein Abbild des Terminals.
Na ja, mit Bascom kenne ich mich nun leider gar nicht aus. Da aber die Resetwerte der Register üblicherweise Null sind, scheint es wohl schon an der grundlegenden Kommunikation mit dem Chip zu liegen. 'Initialisierung nochmal auslesen Mcp2515_read_register Caninte Print "CANINTE: " ; Canin Mcp2515_read_register Canintf Print "CANINTF: " ; Canin Wenn Canin eine Variable ist, wird die jetzt bei allen Prints einfach rausgeschrieben und nie upgedatet? Auf die Schnelle habe ich jetzt nur ein mal gesehen, daß Canin in Mcp25_read_register den Wert vom Spdr zugewiesen bekommt.
Hallo, was meinst du mit SPI-Problem? CPOL CPHA - Hardware? /CS Also CS wird immer genau wie im Code geschaltet Allerdings kann ich mit CPOL CPHA jetzt nichts anfangen !!!! Im Datenblatt des ATMega328 steht was von Data Modes, die in Bascom wohl durch Master = Yes , Polarity = Low , Phase = 0 eingestellt werden und so auch auf die Multi Slave hinweisen - da möchte ich später mal hin wenn 2 MCP am ATMega laufen.......... Hardware SPI Config Spi = Hard , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Noss = 1 , Clockrate = 4 'Test mir Atmega wegen HardwareSPI Gruß Schorschi
Am Ende des Artikel ist eine Tabelle mit Erklärung. http://de.wikipedia.org/wiki/Serial_Peripheral_Interface
Hallo Lutz mit dieser Routine wird die Variable immer nach Durchlauf mit den Werten neu beschrieben. Die Adresse von Caninte ( Const Caninte = &H2B )mit übergeben und in die Canin zurückgeschrieben Mcp2515_read_register Caninte Print "CANINTE: " ; Canin Mcp2515_read_register Canintf Print "CANINTF: " ; Canin '-------------- MCP2515 lesen ---------------------------- Sub Mcp2515_read_register(byval Adress As Byte ) Mcphilf = Spi_read Reset Css Spdr = Mcphilf Do Loop Until Spsr.spif = 1 Waitms 2 Spdr = Adress ----------> hier rein Caninte = &H2B Do Loop Until Spsr.spif = 1 Spdr = 0 Do Loop Until Spsr.spif = 1 Canin = Spdr ---------------> und hier zurück ??????????? Set Css End Sub '--------------------------------------------------------------------- oder interpretiere ich da was falsch ???????????? och muß sagen das das so in allen Beispielen aussieht die ich gefunden habe. Gruß Schorschi
Hallo Lutz, der Ansatz war schon mal ein super Tipp. Wenn ich den MCP2115 aus dem Sockel nehme werden mit Print die gleichen Werte ausgeworfen. Ein Ansatz zum suchen. Gruß Schorschi
Hallo und danke für die kompetente Unterstützung..........ich habs gefunden Es war ein Hardware Verdrahtungsfehler (Mosi und Miso vertauscht). Gruß Schorschi
Hallo, nachdem die Komunikation mit dem MCP2515 funktioniert stehe ich vor dem nächsten Problem. Der Empfang über Buffer0 geht einwandfrei, leider ist die Abfolge der Frames so hoch das Buffer0 es nicht allein schafft - es gehen mir Frames verloren. Mit meinen bescheidenen Englischkenntnissen konnte ich dem Datenblatt entlocken das ich bei setzen von Bit 3 = 1 BUKT im Rxb0ctrl Register auch Frames auf Buffer1 bekomme wenn Buffer0 gerade voll ist - Rollover. Nach Auslesen des Register Canintf sind dann tatsächlich auch die letzten beiden Bits gesetzt aber das Programm steht dann. Die Frage ist kann ich die Register Rxb0ctrl und Rxb1ctrl in Bit 5 und 6 (11 = Turn mask/filters off; receive any message) stehen lassen oder muß ich in der tat dann die Register Rxb0ctrl und Rxb1ctrl in Bit 5 und 6 (01 = Receive only valid messages with standard identifiers that meet filter criteria ) Maske und Filter so einstellen das allen Frames durch gehen können. Ich hatte in einem anderem Beitrag gelesen das der uneingeschränkte Empfang mit Buffer0 und 1 möglich ist. Ob der jenige aber Maske und Filter auf "0" gesetzt hatte oder nicht weiß ich leider nicht. Kann mir da jemand weiter helfen ??????? vielen Dank Schorsch '------------- MCP2515 Initialisieren ------------------------------ '**** CAN Sequenzen ************************************************************ Mcp2515_init: 'MCP2515 per Software Reset zurücksetzen Mcphilf = Spi_reset Reset Css Waitus 10 Spdr = Mcphilf Do Loop Until Spsr.spif = 1 Waitus 10 Set Css 'einstellen des Bit Timings Print "einstellen des Bit Timings " 'Einstellung für 100KBit Mcp2515_write_register Cnf1 , &H03 Mcp2515_write_register Cnf2 , &HBA Mcp2515_write_register Cnf3 , &H07 Print "einstellen des Bit Timings ...100KBits......OK" 'Interrupt einstellen Buffer 0 und 1 Mcp2515_write_register Caninte , &B00000011 'Einstellen der Filter 'Buffer 0: Empfangen aller Nachrichten 'wenn Buffer 0 voll dann mit Buffer 1 empfangen durch setzen Bit 3 =1 BUKT Rollover Mcp2515_write_register Rxb0ctrl , &B01100100 'Buffer 1: Empfang aller Nachrichten Mcp2515_write_register Rxb1ctrl , &B01100000 'alle Bits der Empfangsmaske löschen 'damit werden alle Nachrichten empfangen Mcp2515_write_register Rxm0sidh , 0 Mcp2515_write_register Rxm0sidl , 0 Mcp2515_write_register Rxm0eid8 , 0 Mcp2515_write_register Rxm0eid0 , 0 Mcp2515_write_register Rxm1sidh , 0 Mcp2515_write_register Rxm1sidl , 0 Mcp2515_write_register Rxm1eid8 , 0 Mcp2515_write_register Rxm1eid0 , 0 'Einstellen der Pin Funktionen 'Deaktivieren der Pins RXnBF Pins (High Impedance State) Mcp2515_write_register Bfpctrl , 0 'TXnRTS Bits als Input schalten Mcp2515_write_register Txrtsctrl , 0 'Device zurück in den normalen Modus versetzen Mcp2515_bitmodify Canctrl , &B11100000 , &B00000000 Print "ende MCP2515_init " Return
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.