www.mikrocontroller.net

Forum: Codesammlung Beispiel Projekt AT90CAN128 AVRStudio / LCD / Timer

Autor: Johannes (Gast)
Datum: 02.02.2007 10:06
Dateianhang: AT90CAN128_uC_net.zip (27,3 KB, 677 Downloads)

Hallo bei'nand,

ich habe seinerzeit(am Anfang) sowas gesucht, und nicht gefunden. Ein
Programm/Projekt in C, das in der AVR-Simulation (CAN-plugin)
funktioniert hatte ich schon reingestellt:
Beitrag "AT90CAN128  einfaches Beispiel"

Hier ist nun ein AVRStudio komplett-Projekt in C, das in Hardware
getestet ist. Es können (bestimmte) Nachrichten empfangen werden, mit
der Funktion can_tx können Nachrichten gesendet werden. Ein LCDisplay
ist angeschlossen auf dem Informationen ausgegeben werden können. Die
dazugehörige Datei mit LCD-definitionen und LCD-funktionen ist auch
dabei. LCD-Ansteuerung ist im 8bit mode.

Das Programm ist getestet und funktioniert in einer Testumgebung mit der
CANalyzer-software (http://www.canalyzer.de/)

Eine kurze Info-Datei ist auch enthalten. Die meisten Kommentare sind
auf englisch, einige auf deutsch. Registereinstellungen müssen an die
verwendete HW angepasst werden.

Vielen Dank an: mikrocontroller.net (Forum und AVR-GCC-Tutorial) und an
Klaus C. für die vielen telefonischen Auskünfte/Hilfen bei der
Entwicklung des kleinen Projektes. Inspiriert habe ich mich auch aus dem
AVRfreaks.net -Forum.

Es ist sicher nicht der beste ProfiCode, man kann sicher einiges an
diesem Projekt verbessern. Ich denke aber, daß er für Einsteiger am
AT90CAN128 ganz hilfreich sein kann. Anregungen sind willkommen.

viel Spaß damit.
mg,
Johannes
Autor: Florian (Gast)
Datum: 21.02.2007 10:05

Hallo Johannes,

ich wollte mich schon lange mal an den CAN Bus ran wagen.
Deine Bibliothek finde ich auf den ersten Blick sehr gut. Ich werde mir
die Tage gleich mal den ATMEGA128CAN zulegen.

Kannst Du auch gleich mal Deine externe Beschaltung des Bausteins
posten, dann könnte man das als Basis CAN Entwicklerboard verwenden und
müßte für erste Versuche am Code nix ändern (Zitat:
"Registereinstellungen müssen an die verwendete HW angepasst werden.")

Würde mir viel Helfen.

Danke
Florian
Autor: Johannes (Gast)
Datum: 21.02.2007 16:13

Hallo Florian,

danke danke für die Komplimente. Anbei der Schaltplan zu meiner Platine.
Die LEDs an den TXCAN und RXCAN Leitungen sind zwecklos, sowas bringt
nix (wie früher bei der RS232) denn der CAN hört auf RXCAN mit was er
auf TXCAN sendet, deswegen blinkt die LED RXCAN wenn gesendet wird...
bringt also nix. Denkfehler meinerseits.

Als CAN-Treiber verwende ich den AMIS42700, der ist etwas speziell weil
er 2 verschiedene CAN-Busse beschreiben/lesen kann (nicht gleichzeitig,
aber man kann umswitchen. Das mache ich mit den Pins PD7 und PD4 - Alles
was mit PD7 und PD4 zu tun hat kannste im Code also rauswerfen...). Du
wirst vermutlich einen SJAxxxx, MCP2515, ATAxxxx oder sonstwas als
CAN-Treiber verwenden (gleich mitbestellen). Die schliesst man dann an
die RXCAN und TXCAN vom uC an und basta.

Alles andere sollte richtig sein. Profi bin ich aber noch nicht,
Anregungen/Fragen gerne willkommen.

mg,
Johannes
Autor: Johannes (Gast)
Datum: 21.02.2007 16:13
Dateianhang: schaltplan20061211.GIF (58,6 KB, 1030 Downloads)
preview image for schaltplan20061211.GIF

hier der SchaltPlan
Autor: Florian Eckert (iflo)
Datum: 28.02.2007 09:45

Hallo Johannes,

vielen Dank. Ich hab gestern den Atmel und genau eben den Treiber
MCP2515 und und und bestellt.
Dein Layout scheint recht standard und einfach zu sein. Wunderbar :-)
Mal sehen wann die ersten Bytes den Controller wechseln. Spannung
steigt.

Grüße und Danke
Autor: Johannes (Gast)
Datum: 01.03.2007 08:13

Freut mich, dass das kleine Projektchen so viel Anklang findet.
Weiterhin viel Spaß beim entwickeln.

mg,
Johnnes
Autor: Martin Thomas (Gast)
Datum: 02.03.2007 19:01

Wahrscheinlich überflüssiger Hinweis und nur ein Zahlendreher: der
MCP2515 ist kein CAN-"Treiber" sondern ein SPI<->CAN-Interface. Falls
keine zwei CAN-Busse (ohne Umschaltung) angesteuert werden sollen,
reicht der AT90CAN128 aus, denn das CAN-Interface ist schon "drin".
Benötigt wird wohl eher ein CAN-Transceiver wie z.B. PCA82C250 u.v.a.m.
oder (daher Zahlendreher) MCP2551.

Zum Code: display-Routinen sollten in eine header-Datei und ein C-Datei
getrennt werden. Das funktioniert so zwar, aber spätestens wenn eine
weitere Quellcodedatei die Header-Datei "includiert" gibt's Stress. Die
Kontrollmeldung zum LCD im CAN-ISR sollte zumindest mit einem #ifdef
DEBUG/#endif ausschaltbar sein, sonst werden jedes Mal viele Register
gesichert und die delays in der Ausgaben bremsen erheblich). Solle man
deutlich merken, wenn man mit vielen Nachrichten schnell an den
Controller sendet. Besser: globale Flags setzen und Display-Ausgabe in
der Hauptschleife wenn Flags gesetzt und dann Flags löschen.
Autor: Johannes Philippi (ohanica)
Datum: 05.03.2007 08:20

Hallo Martin,

danke für die Tipps. An die Geschichte mit den LCD-Ausgaben in der ISR
hab ich auch schon gedacht gehabt... sowas macht sich in der ISR
tatsächlich nicht gut. Beim nächstenmal mach ichs dann besser :)

Johannes
Autor: Nachbauer (Gast)
Datum: 26.03.2007 13:03

Hallo

Mir ist nicht klar, was die Zeile

CAN_messageType recMsg;

bewirkt.
CAN_messageType ist eine Variable vom Typ Struct. Aber was ist recMsg?

Danke
Autor: Nachbauer (Gast)
Datum: 26.03.2007 15:28

Um die Sache nochmal deutlicher zu machen, im Quelltext steht:

typedef struct
     {
          uint32_t id;
          uint32_t msk
          ...
     }CAN_messageType;

CAN_messageType recMsg;

Mir ist nicht ganz klar, was das bewirkt.
Ist das evtl identisch mit:

struct CAN_messageType
     {
          uint32_t id;
          uint32_t msk
          ...
     }recMsg;

Danke!
Autor: Karl heinz Buchegger (kbuchegg) (Moderator)
Datum: 26.03.2007 16:09

Nachbauer wrote:
> Hallo
>
> Mir ist nicht klar, was die Zeile
>
> CAN_messageType recMsg;
>
> bewirkt.
> CAN_messageType ist eine Variable vom Typ Struct. Aber was ist recMsg?
>

Falsch:

CAN_messageType ist der Datentyp
rcMsg ist der Name der Variable.

Genauso wie bei

  int var;

int ist der Datentyp
var ist der Name der Variablen.
Autor: Karl heinz Buchegger (kbuchegg) (Moderator)
Datum: 26.03.2007 16:14

Nachbauer wrote:
> Um die Sache nochmal deutlicher zu machen, im Quelltext steht:
>
> typedef struct
>      {
>           uint32_t id;
>           uint32_t msk
>           ...
>      }CAN_messageType;
>
> CAN_messageType recMsg;
>
> Mir ist nicht ganz klar, was das bewirkt.
> Ist das evtl identisch mit:
>
> struct CAN_messageType
>      {
>           uint32_t id;
>           uint32_t msk
>           ...
>      }recMsg;
>

fast.
Wenn du es wie letzteres machst, dann must du jedesmal das
Schluesselwort 'struct' wiederholen, wenn du irgendwas
mit der struct machst.

Also zb. 5 Variablen vom Typ struct CAN_messageType
definieren:

  struct CAN_messageType Var1;
  struct CAN_messageType Var2;
  struct CAN_messageType Var3, Var 4, Var5;

oder eine derartige struct an eine Funktion übergeben:

void foo( struct CAN_messageType Param1 )
{
   ...
}

und jetzt kommt der typedef ins Spiel:
mittels typedef definiert man sich einen neuen Namen
für einen bereits bestehenden Datentyp.

typedef
   struct MyStruct {
     ....
   } CAN_messageType;

definiert für die struct MyStruct einen neuen Namen, nämlich
CAN_messageType.

Damit kann man dann die Schreibweise abkürzen, da der Datentyp
CAN_messageType ja jetzt als solcher bekannt ist:

  CAN_messageType Var1;
  CAN_messageType Var2;
  CAN_messageType Var3, Var4, Var5;

oder auch

  void foo( CAN_messageType Param1 )
  {
     ...
  }

Damit braucht aber niemand mehr den originalen Namen
der struct (der da war 'MyStruct'). Damit kann man
die struct dann aber auch als anonyme struct ausführen
und landet bei

typedef struct  {
     ....
   } CAN_messageType;

und hat damit eine struct, die anonym ist und gleichzeitig
definiert man sich für diesen Datentyp einen Namen, nämlich
CAN_messageType, der wie jeder andere Datentyp verwendet
werden kann.

Schlag einfach mal in deinem Lieblingsbuch über C das
Kapitel auf, indem der typedef besprochen wird. Du hast
doch (mindestens) ein Buch über C? Wenn nicht, solltest
du dir eines besorgen.
Autor: Nachabuer (Gast)
Datum: 27.03.2007 08:47

Danke für die ausführliche Hilfe.
Habe natürlich ein C-Buch (Helmut Erlenkötter), war aber gestern nicht
zuhause.
Autor: Johannes Philippi (ohanica)
Datum: 05.04.2007 13:37

Hallo,

vielen Dank kbuchegg für die infos zu meinem Code (stimmt alles :) ).
Hab selbst seit längerem nicht mehr reingesehen...

mg,
Johannes
Autor: Nachbauer (Gast)
Datum: 12.04.2007 15:15

Tag Johannes!

Ich habe noch Fragen zu deiner Hardware.
Du hast als Abschluß zwischen CANL und CANH jeweils 60 Ohm. Sollten das
nicht beim Highspeed CAN jeweils 120 Ohm sein?
Zudem hast du auf den 3er Steckern CAN1 und CAN2 jeweils noch die Masse
geführt. Die wird aber nicht mit dem Bus verbunden, oder? Also auch
nicht über einen Kondensator oder ähnliches?
Autor: Johannes Philippi (ohanica)
Datum: 12.04.2007 18:16

Hallo,

das mit den 120 Ohm stimmt. man kann oft auch 60 Ohm verwenden,
funktioniert in unkritischen Fällen auch (zB bei mir :) ). Hatte das
irgendwo gelesen... und dann mal probiert.

Auf unseren CAN-Kabeln sind immer drei Leitungen, CANL,CANH und GND.
deswegen hab ich meine GND dort auch verbunden. Theoretisch braucht man
aber tatsächlich nur zwei Leitungen. Die Masse sollte aber an allen
Terminals die Gleiche sein... sonst pasiert vielleicht was Ungutes...
ich denke, das ist schon richtig so.

Mg,
Johannes
Autor: Steffen B. (Gast)
Datum: 27.02.2008 09:54

Wow, super Erklärung für Anfänger und anschaulich dargestellt!

Vielen Dank für Deinen Beitrag und Eure Anmerkungen!
Vielleicht findet sich ja jemand der daraus ein Tutorial basteln kann.
Denn davon gibts z.Zt. noch keins...
Autor: Vajk .v.i. (vajk)
Datum: 04.05.2008 21:59

Danke für eure Infos, das merke ich mir,
Vajk

Antwort schreiben

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

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos verwenden, Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel





Hinweis: der Originalbeitrag ist mehr als 6 Monate alt.

webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net