Hallo Spezialisten,
ich bin gerade dabei meinen funktionierenden C-Code in mehrere .c
Dateien zu zerstückeln um das Projekt übersichtlicher zu machen. Aber es
klappt einfach nicht, egal wie ich es mache. Ich nutze das aktuellste
AVR-Studio mit gcc(WINAVR).
Ich habe etliche Forumsbeiträge dazu gelesen und auch den Artikel in der
Sammlung, aber irgendwie scheine ich auf dem Schlauch zu stehen. Klappt
bei mir alles nicht. Auch habe ich im AVR-Studio den Pfad angegeben für
die include-Dateien.
Hier mein Code als Beispiel wie ich es versuche:
main.c:
In dem Beispiel soll in einer Schleife die delay_funktion mehrfach
aufgerufen werden um das delay zu verlängern. Die LED sollte dann
sichtbar blinken. Das klappt prima wenn alles in der main.c Datei steht,
aber sobald ich es auslagere geht nix mehr.
Was habe ich übersehen?
Vielen Dank für Tips!!
Grüße Florian
in der Datei timing.c eingetragen, es geht aber immer noch nichts. Es
kommen wie gesagt keine Fehlermedungen, es lässt sich alles compilieren.
Grüße Florian
Ja, hab ich auch dort eingetragen. Ich habe jetzt auch noch eine main.h
eingefügt und die CPU-Frequenz dort definiert damit sie auch in der
timing.c gilt. Die main.h habe ich dort natürlich eingebunden.
Alles in allem sieht mein Code jetzt so aus:
main.c
Hat noch jemand eine Idee woran es liegen kann? Ich bin absolut
ratlos...
Oder kann es daran liegen dass das AVR-Studio sowas gar nicht korrekt
unterstützt? So langsam kommen mir da die Zweifel ob das generell
klappt... kann das ein Mega-Buck sein?? Das müssten doch dann aber schon
etliche andere festgestellt haben... ?!??!
Du schriebst daß es schonmal funktioniert habe. Ich kann allerdings
nirgends sehen daß du den Pin als Ausgang konfigurierst. Ist das
verschütt gegangen?
liebe Grüße
frank
>Oder kann es daran liegen dass das AVR-Studio sowas gar nicht korrekt>unterstützt?
Nö. Das Studio kann das.
>...es geht aber immer noch nichts. Es>kommen wie gesagt keine Fehlermedungen, es lässt sich alles compilieren.
Hast du mal in allen Fenstern des Studios nachgesehen? Denn, wenn es
keine Fehlermeldungen gibt und alles durchläuft, woran merkst dann
überhaupt, daß es nicht funktioniert?
Oliver
// Communication Parameters: 8 Data, 1 Stop, No Parity
84
// USART Receiver: On
85
// USART Transmitter: On
86
// USART Mode: Asynchronous
87
// USART Baud rate: 9600
88
UCSRA=0x00;
89
UCSRB=0x18;
90
UCSRC=0x86;
91
UBRRH=0x00;
92
UBRRL=0x47;
93
94
// Analog Comparator initialization
95
// Analog Comparator: Off
96
// Analog Comparator Input Capture by Timer/Counter 1: Off
97
ACSR=0x80;
98
SFIOR=0x00;
99
100
// ADC initialization
101
// ADC Clock frequency: 86,400 kHz
102
// ADC Voltage Reference: AVCC pin
103
// Only the 8 most significant bits of
104
// the AD conversion result are used
105
ADMUX=0xff;
106
ADCSRA=0x87;
Daran liegt es nicht. Sobald ich die Funktion delay_x10ms() in der
main.c schreibe und deklariere und den ganzen header-Kram weglasse
klappt es und die LED blinkt langsam.
Ich bekomme es nur einfach nicht hin den Code auf mehrere c Dateien zu
verteilen. Irgendwo gibt es sicher noch einen versteckten Haken. Nur wo?
sorry, ist jetzt nicht unbedingt zu deinem problem, aber sowas "void
delay_x10ms(uint16_t count);" brauchst nicht mehr. In der neuen Version
von GCC wird das automatisch gemacht, sobald die übergebene Zahl zu groß
ist.
Du gibst in dem Teil den du uns verheimlicht hast den Timer-Interrupt
frei. Sollte sich in einem nicht veröffentlichten Code auch noch ein
sei() tummeln solltest du bedenken daß der Zugriff auf uint16 nicht
atomar ist. Dann wäre es durchaus möglich daß dein Code nur "zufällig"
funktioniert.
liebe grüße
frank
Erstmal vielen Dank für die ganzen Hinweise!
Ja, ich habe in meinem ursprünglichen Code mit Interrupts gearbeitet. Da
nach der Aufsplittung des Codes in einzelne c Dateien nichts mehr
funktionierte, habe ich von ganz "unten" angefangen und ein ganz neues
Projekt angelegt und schreibe Stück für Stück dazu. Das mit der
Blink-LED war der erste Versuch um es prinzipiell richtig zu machen.
Geht aber leider nicht.
Es gibt keinen versteckten Code mehr. Habe alles gepostet was compiliert
wird. Die Interrupts sind global nicht aktiviert.
Die LED brennt dauerhaft, das wars. Dem Controller ist kein Blinken zu
entlocken sobald der Code wie gepostet in mehrere c Dateien geteilt
wird.
Witzig: Ich habe jetzt Stunden verbracht mit Lesen im Forum, dabei habe
ich des öfteren auch gelesen dass das AVR-Studio wohl nicht immer so
toll ist und recht benutzerfeindlich. Ich habe mehrfach den Hinweis
gefunden dass andere IDEs und Compiler "besser" sein sollen. Habe eine
Demo von diesem Code-Vision runtergeladen und dort funktioniert es auf
Anhieb perfekt! Spricht für diesen Code-Vision. Den will ich aber
eigentlich nicht kaufen...
Liegt es wohl doch mal wieder an der Kombination AVR-Studio und WINAVR
??? Hat jemand ähnliche Probleme?
>Liegt es wohl doch mal wieder an der Kombination AVR-Studio und WINAVR>??? Hat jemand ähnliche Probleme?
Nö.
Ganz hilfreich wäre es, wenn du mal das ganze Studio-Projekt hier
reinstellst, mit allen Dateien. Am besten den ganzen Projektordner
zusammenzippen.
Oliver
Mehrere Dinge die mir einfallen:
Du solltest F_CPU nie im Code definieren sondern im Makefile oder bei
AVRStudio in den Projekteinstellungen, dann ist es automatisch in allen
Dateien bekannt. Damit _delay_ms() funktioniert muss die Optimierung
eingeschaltet sein. Ich hatte mit allem außer -O2 teilweise schon
Probleme.
Du kennst den Unterschied zwischen:
1
#include"datei.h"
und
1
#include<datei.h>
oder solls dir mal jemand erklären?
Scheinbar bist du dir auch noch unsicher wann du überhaupt ein #include
brauchst.
In der main.c und in der timing.h musst du z.B. util/delay.h nicht
einbinden, da du dort nicht darauf zurückgreifst.
Hallo zusammen,
erstmal vielen Dank für die Infos!!
Ja, ich bin kein C-Crack, manches muss ich mir noch irgendwo abschauen.
Ich fange natürlich auch mal an zu probieren, oft kommt man ja weiter
damit.
Ich habe irgendwann die header einfach überall eingebunden um auch
sicher nichts zu vergessen. Eigentlich ist es somit doppelt.
Das mit dem F_CPU war auch nur ein Versuch, ich hatte es vorher nicht
drin. Im AVR-Studio habe ich es eingestellt.
Optimierung ist an und steht auf -0s. Die delay-Funktion geht auch, ich
kann z.B. 30 mal hintereinander _delay_ms(10.0); aufrufen im main.c und
die LED blinkt schön langsam. Es sollte also nicht an der delay-Funktion
liegen. Es klappt aber nicht mehr, sobald ich es in eine andere C Datei
auslagere...
Controller ist übrigens ein ATmega32.
Im Anhang mal das Projekt als zip so wie es bei mir nicht läuft. Es
lässt sich wie gesagt compilieren und auch ein "build all" klappt
reibungslos. Nach dem Flashen brennt die LED aber konstant und blinkt
nicht so wie sie es sollte...
Vielen Dank an alle die sich das ansehen!!
Grüße Florian.
Hast du AVR Studio überhaupt mitgeteilt, dass noch weitere Dateien zu
beachten sind? (Unter "Source" und "Header" Dateien eintragen) Nur in
das Verzeichnis speichern reicht nicht!
Ja, das habe ich schon eingetragen. AVR Studio scheint die Dateien ja
auch zu finden, sonst würde das Compilieren ja auch nicht funktionieren.
So langsam bin ich echt am Ende, seit 2 Tagen versuche ich ein absolutes
Mini-Programm in 2 C- Dateien aufzuteilen und es will einfach nicht
funktionieren. Ich kann inzwischen kaum noch glauben dass es nicht am
AVR-Studio liegt...
>Ich kann inzwischen kaum noch glauben dass es nicht am>AVR-Studio liegt...
Das liegt nicht am Studio. Dein Projekt sieht im Studio gut aus,
kompiliert einwandfrei, und dein Original-hex-file läuft bei mir im
VMLAB-Simulator so, wie es soll.
main.h kannst du dir sparen, F_CPU wird schon beim Aufruf des Compilers
definiert, ausserdem müsste es vor delay.h stehen. Das hat aber jetzt
nichts mit deinem Problem zu tun. Das steckt irgend wo anders )-:
Oliver
Vielen Dank Oliver für den Test der Dateien!
Ich habe das AVR-Studio nochmals neu runtergeladen und installiert und
WINAVR auch. Dann ganz neu nochmal ein Projekt aufgesetzt, und wieder
das gleiche Problem. Steht alles in einer Datei, so läuft es
einwandfrei. Sobald ich den Code in eine zweite Datei auslagere geht
nichts mehr.
Vielleicht ist mein Rechner zu alt (P3 1,2GHz 256MB RAM mit Win2000).
Oder das AVR-Studio läuft nicht (mehr) unter Win2000 oder sonstwas. Ich
hab es inzwischen jedenfalls aufgegeben und jetzt in den sehr sauren
Apfel gebissen und mir den CodeVision Compiler gekauft für 150 Euro. Tut
weh, ist aber offensichtlich die einzigste Lösung da das AVR-Studio
definitiv nicht ordentlich läuft. (Bitte nicht aufregen über diese
Aussage, aber es ist nun mal einfach Tatsache).
Ich programmiere seit heute morgen im CodeVision. Klappt seit Stunden
bestens ohne jegliche Probleme. Naja, vielleicht wird in Zukunft ja mal
was aus dem AVR-Studio. Bisher scheint es mir eher
Bastler-Hobby-Charakter zu haben. Würde mich interessieren ob es eine
Firma gibt die sowas nutzt...
Danke jedenfalls nochmal an alle die sich das hier angesehen haben!!
Florian
Nun ja, wenn Geld keine Rolle spielt...
Das Studio hat mit deinem Problem mit 99,9999% Sicheheit nichts zu tun.
Das ist ja nicht viel mehr als ein Editor mit Projektverwaltung und
Simulator, und kann nachgewiesenermassen mit Dutzenden von source- und
headerfiles umgehen. Kompilieren und linken tut es gar nicht, dazu nutzt
es WinAVR, und der ist open-source. Insofern wäre es schon nicht
schlecht, rauszufinden, was bei dir schief geht.
Falls du das Studio noch auf der Platte hast, kannst du auch noch das
Projektverzeichnis mit der funtionierenden Version hier einstellen?
Vielleicht findet sich da ja doch noch was.
Oliver