mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MCP2515 behebn von Buffer0 Overflow


Autor: Andreas Herrmann (andy78)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Habe eine Displayeinheit wo die Daten von 6 Knoten ausgwertet werden.
Habe aber das problem das ich beim Auslesen des Registers 0x2d immer das 
Bit 6 RX0OVR aktiv ist ich setzte es zurück und bekomme immer wieder 
einen Overflow auf Buffer0

obwohl ich nurch setzten des Bits BULK=1 den MCP sage das wenn Buffer0 
voll ist auf Buffer 1 zugeriffen wird.

Der Code ist von hier
http://www.kreatives-chaos.com/artikel/ansteuerung...

wie kann man den Buffer0 Overflow beseitigen.
Bus läuft mit 250kbit.

MCP alle mit 16Mhz SPI Takt 8Mhz.


void mcp2515_init(void)
{


    // MCP2515 per Software Reset zuruecksetzten,
    // danach ist der MCP2515 im Configuration Mode
    CAN_cs_low();
    spi_putc( SPI_RESET );
    _delay_ms(1);
    CAN_cs_high();
    // etwas warten bis sich der MCP2515 zurueckgesetzt hat
    _delay_ms(10);



    mcp2515_write_register( CNF1, 0x01 );

    mcp2515_write_register( CNF2, 0xB8);

    mcp2515_write_register( CNF3, 0x05 );


    mcp2515_write_register( CANINTE, (1<<RX1IE)|(1<<RX0IE) );




    // Buffer 0 : Empfangen aller Nachrichten
    mcp2515_write_register( RXB0CTRL, (1<<RXM1)|(1<<RXM0)|(1<<BUKT) );

    // Buffer 1 : Empfangen aller Nachrichten
    mcp2515_write_register( RXB1CTRL, (1<<RXM1)|(1<<RXM0) );

    // Alle Bits der Empfangsmaske loeschen,
    // 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 );


    // Deaktivieren der Pins RXnBF Pins (High Impedance State)
    mcp2515_write_register( BFPCTRL, 0 );

    // TXnRTS Bits als Inputs schalten
    mcp2515_write_register( TXRTSCTRL, 0 );

    // Device zurueck in den normalen Modus versetzten
    mcp2515_bit_modify( CANCTRL, 0xE0, 0);

}


Danke

Gruß

ANdy

Autor: Andreas Herrmann (andy78)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich habe mal eine Frage zur realisierung der Interrupt abfrage vom MCP

Momentan mache ich dies in der Hauptschleife mit abfrage ob INT Pin high 
oder low.

habe mir gedacht ich frage den mcp int pin in der Hauptschleife 3x ab 
und ich bekomme jetzt pro minute 150 overflows statt vorher in der 
minute >1500.

Ist es noch besser den Interrupt pin des AVR zu benutzen um die 
Hauptschleife zu un terbrechen????

Ich merke jetzt schon das die anzeigen flüssiger und sofort reagieren 
wie z.b Tankanzeige und Batteriespannungsanzeige da hat man vorher 2sek 
geartet bis was kommt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.