PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmega 8 mit c++ programmieren



rocketman123
02.02.2008, 16:51
ich hab dazu ne gute seite im internet gefunden die das ganze einfach erklärt
jetzt möchte ich den atmega8 mit c++ programmieren. dazu find ich aber keine seite in der sowas von klein an drin steht.
deshalb hab ich da n paar fragen
1. kann ich das make-file vom asuro verwenden.
2. was muss ich am anfang eines programmes schreiben. bei asuro steht ja immer #include "asuro.h"
3. kann ich mein spi-kabel vom bascomprogrammieren verwenden wenn ich mit avr-studio arbeite
4. gibts iregendeine seite im internet die das von klein an beschreibt. vieleicht mit kleinen programmen zum testen
[-o<
danke schon mal
mfg

Besserwessi
02.02.2008, 18:39
C++ ist für Mikrokontroller eher weniger geeignet. Da wird mit den heutigen Compilern noch deutlich mehr an RAM und Flash speicher geraucht als in C. Gerade ein Mega8 sollte dann zu klein sein. Mit einem Mega128 vielleicht.

rocketman123
02.02.2008, 19:17
da hab ich aber im internet eher andere meinungen gehört.
aber ist ja egal.
weiss jemand wo ich so etwas lernen kann.

McJenso
02.02.2008, 19:33
Hallo,

für die avr's wie den Atmega8 möchtest du C lernen.
Schau dir dieses Tutorial (http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial) an.
Wobei es um die Programmierung eines Controllers geht und nicht speziell um C.

Gruß

Jens

p_mork
02.02.2008, 20:41
@rocketman123
Was genau möchtest Du lernen? C++ allgemein, C++ bezogen auf die AVRs oder was ins makefile reinkommt? Letzteres ist einfach, unter CPPSRC alle Sources eintragen und das wars.


C++ ist für Mikrokontroller eher weniger geeignet. Da wird mit den heutigen Compilern noch deutlich mehr an RAM und Flash speicher geraucht als in C. Gerade ein Mega8 sollte dann zu klein sein. Mit einem Mega128 vielleicht.

So allgemein gesagt ist das absoluter Quatsch. C++ __KANN__ langsam und speicherfressend sein, wenn man es falsch anwendet, da sind reines C und vor allem BASCOM aber auch nicht anders. Wenn man jedoch einigermaßen weis was man tut, hat es sehr viele Vorteile.

MfG Mark

m.a.r.v.i.n
02.02.2008, 21:02
Hallo rocketman123,

C++ für den mega8. Dann schau dir mal Arduino (http://www.arduino.cc) an. Es gibt jede Menge Tutorials und Anwendungsbeispiele darüber. Moderne Boards verwenden zwar den mega168, aber der mega8 wird weiterhin voll unterstützt. Ein Arduino Board kann man sich auch recht einfach auf Lochraster oder Steckbrett selbst aufbauen, oder auf eine bestehende Hardware anpassen.

Ich arbeite selbst zur Zeit an der Asurino Lib (http://www.asurowiki.de/pmwiki/pmwiki.php/Main/Asurino), einer Klassenbibliothek für den Asuro, basierend auf Arduino.

Ceos
03.02.2008, 11:21
kann man denn überhaupt hexfiles mit nem c++ fähigen compiler machen ?? dann bitte verratet mir WIE ich hasse es mit bitschiebereien und defines arbeiten zu müssen, am liebsten hätte ich alles schön sauber über punkktnotation ähnlich bascom

fumir
03.02.2008, 18:58
c++ verdient den namen eigentlich erst, wenn es die STL enthält. eine derart umfassende c++ implementierung dürfte den atmega8 doch überfordern.
klassen und vererbung benötigen schon einges an speicherplatz (RAM) damit es sinn macht.

oop ist vom konzept her etwas sehr dynamisches. deshalb werden eben viele informationen im RAM (bei µC eher mangelware) abgelegt. natürlich kann ich nen c++ compiler nehmen und so programmieren, das auch alles ins flash geht. nur wird das dann eher wenig mit c++ und oop zu tun haben.

natürlich enthält c++ auch ne menge vorteile (hier und da verbesserte syntaktische möglichkeiten) gegenüber c die keinen erhöhten speicherbedarf bedingen. aber als richtiges c++ würd ich das dann nicht bezeichnen. eher als ein aufgemotztes c :-) aber das kann ja auch schon ein vorteil gegenüber normalem c sein.

das arduino board wird mit einer sprache programmiert, die auf c/c++ basiert. aber von c++ ist da kaum was drin. eigentlich ists eher reines c.

Ceos
03.02.2008, 22:03
na gut ... formulier ich meinen ansatz anders ... mir ging es dabei echt nur um die datenkapselung also OOP ohne veerbung etc. einfach nur das ich ports als Port.A.Pin1 = AN schreiben kann um mal was ganz triviales zu bringen ... kann sein das ich aufm schlauch steh was diw umsetzung in reinem C angeht, dann helft mir mal mitm schlag aufn hinterkopf aus bitte

MfG

izaseba
03.02.2008, 22:25
Hallo,
ich verstehe nicht so ganz, was Du möchtest.
Du möchtest C programmieren, dann gehe ich davon aus, daß Du auch C kannst.
Wenn das der Fall ist, weißt Du sicher auch, daß Punkt . in C für ganz andere Zwecke gedacht ist, als das was Du möchtest.

In C gibt es halt nur die Möglichkeit mit Bitschiebereien an die einzelnen Bits dranzukommen.

Es gibt da auch die Möglichkeit Makros zu definieren, um sich das ganze "leichter" zu machen.

Schau Dir mal deprecated.h , die Bibliothek ist immer noch bei avrgcc drin.

Da gibt es so Sachen, wie
sbi(port, bit)
cbi(port, bit)
outb(port, val)

vielleicht ist das eine Anregung.

Sonst mußt Du halt zu einer anderen Sprache greifen, wo sowas schon drin ist z.B. Basic

Gruß Sebastian

fumir
04.02.2008, 12:43
die gewünschte kapselung kann man in c mit struct erreichen:



struct meinestruktur
{
unsigned int bit1 : 1;
unsigned int bit2 : 1;
unsigned int bit3 : 1;
unsigned int bit4 : 1;
unsigned int bit5 : 1;
};

int main() {
...
struct meinestruktur daten;

daten.bit1=1;
daten.bit2=0;

}


die sache hat allerdings nen haken: es kommt auf den compiler bzw. dessen einstellungen an, ob die bits dann wirklich als bits in einem datenbyte gespeichert werden.
prinzipiell darf der compiler auch jedes bit in ein eigenes byte, oder int oder sonstwas speichern. daran ändert aber auch c++ nichts.

du kannst dir natürlich so ne struktur definieren und dazu ne passende funktion, um die daten dann wirklich in die richtige position eines byte zu schreiben. wenns um hardware geht, muss man letztlich immer auf etwas umständliche methoden zzurückgreifen, wenn man in ner hochsprache programmiert (zumindest wenn der code portabel bleiben soll)

der gnu compiler avr-gcc unterstützt einige c++ möglichkeiten (siehe doku). damit kann man sicher das ein oder andere eleganter formulieren als in reinem c. aber an der tatsache, dass du dir bei hardwarezugriff genau anschauen musst, welchen maschinencode dein hochsprachencompiler letztlich erzeugt, kommst du nicht drum rum.
(das kann natürlich schon jemand in irgend ner bibliothek für dich erledigt haben, aber genau hinschauen sollte man trotzdem mal, bevor man so ne bibliothek verwendet)

fumir
04.02.2008, 12:51
Wenn das der Fall ist, weißt Du sicher auch, daß Punkt . in C für ganz andere Zwecke gedacht ist, als das was Du möchtest.

wieso?
der punkt ist genau dazu da: auf teile eines größeren datenobjektes zuzugreifen.
in c betrifft das z.b. struct und union.
in c++ wirds dann auch noch für klassen verwendet.

wozu sonst sollte der punkt in c sein?

ogni42
06.02.2008, 14:44
Um mal mit ein paar Mythen aufzuräumen:

* Eine vollständige C++ Implementierung verlangt die Standard Bibliothek (nicht die STL). Der avr-gcc hat aber weder das eine noch das andere.
* Klassen benötigen nicht mehr RAM/Flash als structs und Methoden, die darauf zugreifen. Wenn man mit virtuellen Methoden arbeitet, kommt ein Zeiger pro Methode für die vtable hinzu
* Es wird erst dann (RAM)speicherfressend, wenn exceptions verwendet werden sollen (wg. callstack-Verwaltung). Die gibt es mit dem avr-gcc nicht. Beispiel: http://www.mikrocontroller.net/topic/90380#772976

Fazit: Man kann es durchaus mit den avr's verwenden. Es gibt aber gegenüber einer vollständigen C++ Implementierung Einschränkungen (habe ich an anderer Stelle hier im Forum schon mal geschrieben)

izaseba
06.02.2008, 17:11
Hallo Fumir,

Ja Du hast recht, an Bitfelder hab ich da nicht gedacht, eher an größere Sachen *schäm*
Du hast auch recht, daß der Kompiler die Felder nach Lust und Laune organisieren kann.

ABER mir fällt da noch was ein!

Code Vision !
Ich glaube in CodeVision ist die Möglichkeit gegeben genauso auf die Bits zuzugreifen.

Vielleicht sollte Ceos sich das mal angucken, es gibt auch eine kostenlose Version die auf 4 oder 2 kB beschränkt ist.

Die Vollversion ist auch bezahlbar.



Gruß Sebastian

P.S. was die Sache mit C++ angeht, gibt es hier einen User 'ehenkes' oder so heißt er, der hat was in diese Richtung gemacht...
Einfach nach "nibo" Suchen, da hat der was gepostet, in meinen Augen sehr Speicherfressend mit malloc usw. , vielleicht ist das eine Anregung...

fumir
06.02.2008, 19:05
* Eine vollständige C++ Implementierung verlangt die Standard Bibliothek (nicht die STL). Der avr-gcc hat aber weder das eine noch das andere.

kannst du das mal noch etwas näher erläutern.
ich dachte zu c++ gehören zwingend die üblichen header und damit die STL (die heißt wohl inzwischen anders, oder?) funktionalität.
wo kann man das nachlesen?

ogni42
06.02.2008, 21:35
Die STL enthält z.B. keine iostream Bibliothek, die Standard-Bibliothek aber schon.

Näheres z.B. hier:
http://de.wikipedia.org/wiki/C%2B%2B-Standardbibliothek

fumir
07.02.2008, 10:08
in wikipedia fand ich folgenden schönen satz:

Unter C++-Programmierern ist der Begriff "STL" trotzdem üblicher Jargon für den aus der ursprünglichen STL abgeleiteten und um Elemente wie Zeichenketten erweiterten Template-basierten Teil der Standardbibliothek.

der meine verwendung des begriiffs STL verdeutlicht. insofern meinten wir das gleiche, wobei ich mich nicht so ganz präzise ausgedrückt habe :-)

gehört nicht ganz hierher, aber ich fand neulich ein beispiel bei dem c++ gerade wegen den klassen und templates kürzeren und effizienteren code erzeugt:
sortieren unter c mit qsort erfordert die übergabe einer vergleichsfunktion mittels zeiger.
in c++ kann man stattdessen ein funktionsobjekt übergeben. dieses kann dann vom c++ compiler inline in den template generierten qsort-code eingefügt werden. dadurch spart man sich zum einen den funktionsaufruf bei jedem vergleich und zum anderen kann der compiler den code weiter optimieren, da nun kein sprung mehr im qsort-code steht.

trotzdem glaube ich nicht das man unbedingt c++ braucht um z.b. nen atmege8 zu programmieren. bei den größeren µC würd ich mich allerdings auch über die c++ funktionalität freuen.