July 22nd, 2017

 vorheriger Artikel
« Einstellungen im EEPROM eines AVR speichern


Beispiel CAN Bus Testapplikation für AT90CAN128

at90can128 Ich habe es in letzter Zeit oft erlebt, dass sich angehende Mikrocontrollerprogrammierer mit dem AT90CAN beschäftigen wollen oder müssen um eine CAN Anwendung zu entwickeln. Dabei stößt man immer auf folgendes Problem: Man wird in den Wald geworfen und weiß nicht welchen Baum man zuerst studieren soll. Wenn man nach einfachen Testanwendungen sucht, dann findet man meist ausgeklügelte Bibliotheken oder Anwendungen wo man zunächst nicht durchsieht. Außerdem sind die meist viel zu umfangreich und können auch beide CAN 2.0 Standards. Diesem Problem mache ich heute ein Ende, hier folgt eine einfache Anwendung für den AT90CAN und eine kleine Einführung in die Software. Es sind alle Derivate des AT90CAN verwendbar (32, 64, 128), man muss selbstverständlich beim Kompilieren darauf achten den Richtigen einzustellen.

Beginnen wir mit der Struktur der Software:

- main.c Hauptdatei, Aufruf der Funktionen
- at90can.c Sourcedatei für CAN-Funktionen, inkl. ISR
- at90can.h Headerdatei für CAN, Definition der Struktur, Geschwindigkeiten
- utils.h Korrekte Definitionen für True/False und nützliche Dinge

Für die Variablen in denen CAN-Nachrichten gespeichert werden sollen wurde eine Struktur CAN_messageType erstellt. Die im Datenblatt empfohlenen Einstellungen für die Geschwindigkeiten sind in einem Feld (array) in der at90can.h hinterlegt. Die Applikation besteht nun darin, dass in der main-Funktion zunächst die Initialisierung aufgerufen wird und anschließend eine CAN-Botschaft testweise gesendet wird. Die Empfangenen Nachrichten werden nur in der globalen Variable recMsg abgespeichert, jedoch nicht weiter verarbeitet. Bei jeder Operation mit MObs muss die CANPAGE auf das entsprechende gesetzt werden.

Wichtig ist zunächst die korrekte Initialisierung. Der CAN-Controller muss zum konfigurieren in den config-mode versetzt werden um Geschwindigkeit und Interrupteinstellungen zu ändern. Die globalen Interrupts sollte man erst nach der Konfiguration aktivieren, denn sonst könnte mitten in der Konfiguration beim aktivieren der einzelnen Interrupts ein kommender die Konfiguration verfälschen. Zur Initialisierung des CAN-Controllers gehört das aktivieren des config-mode, die Einstellungen der Interrupts und das Setzen der Busgeschwindigkeit. Die Konfiguration der einzelnen MObs kann auch in gesonderten Funktionen erledigt werden.

Bei einem Empfang einer Nachricht wird in der entsprechenden Interrupt-Service-Routine (ISR) die CAN-Botschaft aus den Registern ausgelesen und in eine globale Variable gespeichert. Variablen die in einer ISR beschrieben werden sollen, müssen als volatile deklariert werden. Nach dem speichern der Daten muss der Interrupt durch readmodwrite resetet werden. Ebenso muss das Bit CONMOBn gesetzt werden, um erneut Empfangsbereitschaft zu signalisieren.

Zum Senden einer Nachricht werden die gewünschten Daten und ID in einer Variable gespeichert und die Funktion can_tx aufgerufen werden. Diese kopiert die Daten in die Register des Controllers und setzt das Bit CONMOBn des als Sender konfigurierten MOb.

Fragen, Anregungen oder Verbesserungsvorschläge können gerne als Kommentare erfolgen!

Tags: , , ,



9 Responses to 'Beispiel CAN Bus Testapplikation für AT90CAN128'

  1. 1Micha
    Mai 8th, 2009 at 11:45

    Hallo, ich muss mich ein wenig mit dem AT90128CAN beschäftigen und bin dabei auf deine äußerst interessante Seite gestoßen.

    Ich habe mir mal das Beispielprogramm angesehen und auf meinen AVR gebracht - nach einigem hin und her, kann ich jetzt auch CAN Nachrichten senden und empfangen.
    Nur verstehe ich im Moment nicht, warum ich bei meinem USB-CAN Adapter die Bitrate auf 50 kBit/s einstellen muss, obwohl doch scheinbar 100 kBit/s initialisiert werden…
    Ich betreibe erst mal den internen Oszillator mit 16MHz, da ich keinen anderen zur Verfügung habe.

    Gruß,
    Micha


  2. 2Micha
    Mai 12th, 2009 at 9:25

    Hab es hinbekommen, lag an der STK600 - da klappt irgendetwas nicht…


  3. 3Kremser Mike
    Februar 11th, 2010 at 11:28

    Hallo ich probiere das Besipielprogramm mittels CodeVisionAVR auf meinen AT90CAN128 zu bringen. leider bekomme ich nur fehelermeldungen. mit was für einem Programm hast du denn dein CANBspProgramm geschrieben? Wäre es möglich, dass du mir mal das ganze Projekt zukommen lassen könntest? Vielen Dank.


  4. 4TJ
    Februar 11th, 2010 at 8:29

    Hi, das ist mit AVRStudio gemacht. Leider habe ich das Projekt nur noch auf der Seite, kann dir also nicht mehr zur Verfügung stellen als du siehst :(

    Grüße
    Thomas


  5. 5Biturbo
    Mai 22nd, 2010 at 6:18

    Hallo

    eine Frage zu dem Empfangen. Habe gesehen, dass die empfange Nachricht in eine globale Variable geschrieben wird, genau wie du es ja auch schon geschrieben hast.
    Nun zur Frage. Wie merkst du in der main Routine dass ne neue Nachricht angekommen ist?


  6. 6TJ
    Mai 23rd, 2010 at 9:39

    Das wird nicht betrachtet. Du kannst dazu den Interrupt nutzen und ein eigenes Flag nochmal setzen oder so. Aber es kommt auf dein Anwenungsfall an. Ich habe die Nachricht im Interrupt weggespeichert und meist in der Hauptroutine einfach den aktuellen Wert dieser Variablen angezeigt, da es sich um Messwerte handelte. Es macht auch Sinn evtl. alle nötigen Aktionen im Interrupt zu machen. Aber vorsicht: nur wenn es schlank ist! Nicht zu viel im Int ausführen.


  7. 7oparz
    September 3rd, 2010 at 11:00

    Dankeschön für den post.
    Es ist eine tolle Einführung in das programmieren mit dem CAN-Bus:-)


  8. 8AJ
    August 24th, 2011 at 12:01

    Zu erst eine Frage : wird diese Seite noch aktiv genutzt?
    zum eigentlichen: Ich habe mir die “Bilbiothek” auf meiner at90can128 gezogen. Das Senden funktioniert und auch das Auswerten innerhalb der Interupt Routine. Wenn ich jedoch in der man auf recMsg zugreifen ist das bei mit immer leer. Woran könnte das liegen ?


  9. 9Roy
    August 17th, 2012 at 11:22

    Hallo Herr Fuchs,
    Wenn ich ihre Beispiel benutze, ich bekomme zwar die CAN botschaft (ich schicke ein 8 byte Nachricht von meinem PC
    Send[0]=1,Send[1]=2 ….Send[7]=8)
    aber die reinfolge der Botschaft is nicht richtig. Interressant dabei ist die INDX0, INDX1 und INDX2 bit von CANPAGE register luft nicht seqeuntial d.h zuerst zeigt der Debugger (Ich benutze die gleiche Umgebung wie Sie)INDX0=1, INDX1=0, INDX2=0 dann lese ich das byte recMsg.data[i] = CANMSG, dann springt der Index INDX=0×03, anstat INDX=0×02, dann mache ich noch mal recMsg.data[i] = CANMSG und dann Zeigt INDX=0×06. Die daten sind richtig in dem Index, d.h wenn das INDX=0×00 CANMSG=0×01, wenn INDX=0×01 CANMSG=0×02 usw.
    mach ich etwas falsch??ich hab den Code fast gar nicht gendert.
    ich wrde mich freuen auf Ihre Antwort.
    lg,
    Roy


Leave a Response

Imhotep theme designed by Chris Lin. Proudly powered by Wordpress.
XHTML | CSS | RSS | Kommentare-RSS