Hallo, komme vom Assembler und will es mal in C probieren. Ich benutze Programmers Notepad zum Schreiben des Codes. Wo aber kann ich das jetzt mal simulieren. Auf dem AVR Studio geht das ja nicht - oder gibt es da etwas neues? Danke ...
Warum nicht mit AVRStudio? Wie ich gehört habe, kannst Du damit simulieren. Du kannst zwar AVRStudio nicht als IDE benutzen aber extern erstellte Builds sollten simulierbar sein. Ich persönlich nutze jedoch AVRStudio nicht, ich finde VMLAB in der Simulation besser. Volkmar
Du kannst mit dem WinAVR Paket coff und extcoff Dateien erzeugen. Erstere Version für Studio 3.x, letzteres für 4.07 oder größer. Geht eigentlich ganz gut. Wenn du ein aktuelles WinAVR hast, ist das Makefile schon vorbereitet zur Erzeugung von coff/extcoff, die damit erzeugten Dateien in Studio öffnen und los gehts! Gruß Matthias
Hallo Das Ganze ist in der "AtmanAVR-IDE 4.x" integriert. Man sollte damit debuggen/simulieren können (auf Basis von WinAVR und AVR Studio gelöst). Link: http://www.atmanecl.com/EnglishSite/SoftwareEnglish.htm Gruss Toni
Sieht ja nicht schlecht aus, nur kostet das Ding 100$. Arbeitest du damit? Taugt es was? Gruß Matthias
Hallo, VMLAB ist gut -- wie kann man aber die Funktionen (Unterroutinen) simulieren? Ich habe alle Funktionen in eine *.h Datei geschrieben. ich komme aber mit dem Simulator dort nicht hinein.
Funktionen werden nicht in die Header-Dateien geschrieben. Header-Dateien sind für die Definitionen zuständig. Packe die Funktionen in separate .c-Files! Die neueste VMLAB-Version entimmt wohl die Quelldateien aus dem cof-File. Wenn Du die Funktionen jedoch in eine Header-Datei schreibst, dann fehlt der Bezug weil (meines Wissens nach) nur die C-Files in dem COF referenziert werden. In den alten VMLAB-Versionen müssen die Quelldateien explizit im Projekt-File angegeben werden, ändert aber nichts am Verhalten. Volkmar
Exakt so ist es: die Unfähigkeit, Include-Dateien in den Debuginformationen zu hinterlegen, ist einer der (vielen) Schwachpunkte von COFF. Damit sind die Debug-Informationen für jegliches Stückchen Code, das aus einer Headerdatei stammt, verloren. Normalerweise schreibt man zwar in Headerdateien nichts rein, was wirklich Code generieren sollte, aber spätestens bei inline deklarierten/definierten Funktionen ist es natürlich mit dieser Regel hinüber...
Hallo! Ich arbeite seit kurzem mit Anjuta, das ist die erste IDE die mir besser gefällt als Emacs. Ich würde gern von Anjuta aus debuggen, find aber nirgends, wie man ihm sagen kann dass er avr-gdb statt den ia32-gdb nehmen soll. Hat das schon jemand geschafft? umbenennen von avr-gdb in gdb will ich nicht, weil ich den gdb auch für IA32 öfter brauch.
Hallo, Diese COFF Datei(en) - sind das die *.elf Dateien die der WinAVR -Compiler macht? Coff finde ich nicht.
Hallo, noch mal VMLAB ist wunderbar, habe jetzt auch externe *.c Dateien geschrieben. ABER - beim Simulieren komme ich trotzdem nicht in Funtionen hinein, die in einer anderen als der Hauptdatei stehen. Schreibe ich die Funktionen über die Main-Anweisungen in die selbe Datei klappt es mit dem Simulieren. Wie also kriege ich das Programm zum Springen in andere Dateien hinein? Danke!
Indem Du Deine Funktionen nicht in Headerdateien fallen läßt, sondern in separaten C-Dateien, die auch separat übersetzt und gelinkt werden. Diese machst Du dann dem VMLAB bekannt.
Ja, o.k. ich habe bereits alle meine Dateien als separate c-Dateien geschrieben und das Programm läuft auch im Controller (Testprogramm). Trotzdem komme ich beim Simulieren nicht in diese Dateien hinein. Bitte, wie sage ich dem Programm, dass es da hinein springen soll? Danke
Welche Version von VMLAB verwendest Du? Hast Du im Projekt-File von VMLAB jede Source-Datei eingetragen? Ohne Detailinformationen kommen wir da wohl nicht weiter. Wenn möglich, kannst Du mir auch die Projektdateien zukommen lassen, dann schaue ich mir das kurz mal an. Volkmar
Wie, gesagt, habe jahrelang mit Assembler zu tun gehabt, bin also auf jede Hilfe angewiesen -- vielen Dank. Ich habe mir glaube ich schon die neuste Version geholt. Wenn ich dort in die Sourceliste meine ganzen C-Dateien einschreibe, gibt es Fehlermeldungen von VMLab. Ich compiliere die Dateien zu erst über WINAVR (np - notepad mit make all) und dann versuche ich über ein Projekt die Sachen in VMLAB zu simulieren. Vielleicht sollte ich alles im VMLAB machen? Anbei mein Testversuch, so würde ich gern meine Dateien anordnen vielen, vielen Dank jetzt kann man hier nur eine Datei anhängen. Habe alle Dateien in ein Edit.text geschrieben oder hier unten. ________ Datei: Main.c:___________________ #include <io.h> #include <RegKonst.c> #include <Init.c> #include <MainUnt.c> int main (void) { DDRLed = 0xFF; Dauer1 = ResetDelay(Delay1); // laden Timer0Prescaler (5); // Vorteiler for (;;) { if (Control.M1==1) //wenn ich nicht sofort wieder eine neue //Zeit starten lassen will (Monoflop) { // if (ReadDelay(Dauer1)) { Counter++; PortLed = Counter; Dauer1 = ResetDelay(Delay1); //neu laden } } } } __________ Datei: RegKonst.c: _____________ #include <io.h> typedef unsigned char BYTE; typedef unsigned int WORD; #define PortLed PORTC #define DDRLed DDRC BYTE Counter = 0; BYTE Delay1 = 5, Dauer1; struct { BYTE M1: 1; }Control; __________ Datei Init.c:_______________________ #include <io.h> void Timer0Prescaler (BYTE a) { BYTE b = TCCR0; b = b & 0xF8; //11111000 Vorteiler löschen TCCR0 = b | a; } ______ Datei MainUnt.c:__________________________ include <io.h> BYTE ResetDelay (BYTE Delay) { BYTE a = TCNT0; //Timer1 lesen BYTE b = a + Delay; Control.M1 = 1; return b; } BYTE ReadDelay (BYTE Dauer) { BYTE a = TCNT0; if ( Dauer == a) { return 1; } else { return 0; } }
Entschuldigung - hier noch mal die Main -- war Schreibfehler drin ________ Datei: Main.c:___________________ #include <io.h> #include <RegKonst.c> #include <Init.c> #include <MainUnt.c> int main (void) { DDRLed = 0xFF; Dauer1 = ResetDelay(Delay1); // laden Timer0Prescaler (5); // Vorteiler for (;;) { if (Control.M1==1) //wenn ich nicht sofort wieder eine neue //Zeit starten lassen will (Monoflop) { if (ReadDelay(Dauer1)) { Counter++; PortLed = Counter; Dauer1 = ResetDelay(Delay1); //neu laden } } } }
OK, habe es schon gesehen. Es hängt immer noch an dem Problem daß auch Jörg angedeutet hat. Du hast zwar die Dateien von .h nach .c umbenannt, doch Du verwendest weiterhin #include um sie einzubinden. Es ist jedoch notwendig diese separat in Objekt-Dateien zu übersetzen und dann alle Objekt-Dateien zu einem ausführbaren Programm zu verlinken. Hört sich kompliziert an, ist es im ersten Moment vielleicht auch. Aber mit den makefile-Beispielen und dem makefile-Generator von Jörg (in WinAVR) ist es eigentlich ganz einfach. Im makefile (siehe Beispiel in WinAVR) gibt es eine Zeile die da heißt SRC = ($TARGET).c Entweder hängst Du Deine separaten Source-Files dort hinten an: SRC = ($TARGET).c RegKonst.c Init.c MainUnt.c oder dahinter in eigener Zeile (beachte das +=): SRC += RegKonst.c Init.c MainUnt.c Damit die Funktionen in main bekannt sind, benötigst Du header-Files, die die einzelnen Funktionen deklarieren: Beispiel: Init.h void Timer0Prescaler (BYTE a); Ist in dem Fall nur eine einzige Zeile. Damit solltest Du eigentlich hinkommen, sonst mußt Du noch mal fragen. PS: Packe die Dateien in ein ZIP dann geht es besser mit dem Anhang. PPS: Verwende statt <io.h> die Datei <avr\io.h>, die andere ist abgekündigt (müßte auch eine entsprechende Warnung kommen). Volkmar
> #include <RegKonst.c> > #include <Init.c> > #include <MainUnt.c> Das ist Dein Fehler. Es nützt nichts, die Dateien von .h in .c umbenennen, wenn Du sie trotzdem noch nur als Include-Dateien benutzt. Bitte gib Init.c und MainUnt.c als separate Quellen in Deinem Makefile an. Schreib eine Headerdatei z. B. projekt.h, in der BYTE ResetDelay (BYTE Delay); BYTE ReadDelay (BYTE Dauer); void Timer0Prescaler (BYTE a); drinsteht und die Du überall mit #include "projekt.h" reinziehst. RegKonst.c sollte wirklich besser RegKonst.h sein und #include'd werden. Das ist eine reine Headerdatei. Du kannst natürlich auch statt projekt.h gleich alles in RegKonst.h schreiben. Nicht-System-Includedateien sollten übrigens in double quotes gesetzt werden, nicht in Spitzklammern, also #include "RegKonst.h". Btw., <io.h> ist deprecated, bitte benutze <avr/io.h>. BYTE und WORD heißen auf Standard-C (nach #include <inttype.h>) uint8_t und uint16_t. Das ist ohnehin eindeutiger, jemand, der von einer 32-bit Architektur kommt, könnte WORD auch für einen 32-bit-Typ halten. ;-)
Hallo, bitte noch mal um Hilfe ich habe alles nach Ihren wertvollen Hinweisen gemacht und es klappt auch ---- fast! Jetzt wird "nur" in der MainUnt.c das Control.M1 "struckt" nicht erkannt. //MainUnt.c:10: error: `Control' undeclared (first use in this function) //MainUnt.c:10: error: (Each undeclared identifier is reported only once //MainUnt.c:10: error: for each function it appears in.) Wenn ich die RegKonst.h angebe, dann ist alles doppelt declared was soll ich machen? -- es dürfte doch nur ein kleiner Fehler sein Wenn ich die Zeile -- Control.M1 = 1; --- ausblende, dann klappt alles wunderbar -- mit Simulieren und Sprung in die Unterroutinen -- wie aber mache ich MainUnt.c klar, dass es Control.M1 gibt?????? Bitte noch mal helfen, ... "sonst muss ich für immer und ewig zurück zum Assembler" -- (werde die meisten Projekte auch da machen nur wollte ich der Übersichthalber ab und an mit C arbeiten) Vielen Dank -- habe alles in eine Zip getan
Du mußt in der Datei MainUnt.c oben noch ein #include "RegKonst.h" einfügen, sonst ist in dieser Source-Datei die Struktur Control nicht bekannt. Dann bekommst Du aber erst noch zwei Fehler die sich auf andere Variablen beziehen: Counter, Delay1. Diese hast Du als globale Variablen definiert. Da sie aber nun in verschiedenen Objektdateien initialisiert werden, beschwert sich der Compiler. Du darfst die Initialisierung nur an einer Stelle machen. Dies kannst Du zB in einer separaten Init-Funktion machen. Volkmar
Vielen, vielen Dank, ich habe es begriffen ... Es geht - ich nehme eine Funktion Init und setze dort alle globalen Variablen, dann kann ich meine Dateien als c Dateien anlegen mit dem Verweis auf die eigenen h-Dateien. Das Simulieren klappt prima --- jetzt komme ich wieder ein Stück weiter -- großes Lob an Euch
p.s.: Initialisierung einer globalen (oder statischen) Variable mit 0 (Counter in diesem Falle) ist überflüssig. Der C-Standard garantiert diesen Wert bereits. (Seit GCC 3 ist sie zwar auch harmlos, da der Compiler das erkennt und die Initialisierung ignoriert, früher hat man auf diese Weise mehr ROM sinnlos verbraucht. Da das andere Compiler aber u. U. nicht so optimieren, sollte man es sich eigentlich gar nicht erst angewöhnen.)
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.