PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kontrolle durch Kenner erbeten... C-Code



oderlachs
24.04.2013, 22:06
Hallo Freunde von Gcc !

Duch langes Verwenden von ArduinoCode bin ich ein wenig vom C++ Weg abgekommen, ich meine muss mich langsam wieder umstellen. Nun habe ich
einen Sorcecode erstellt für einen Alarmsender mit ATTiny2313 als µC.
Ich habe zwar keine Fehlermeldungen beim Compilieren, aber bestimmt habe ich mich bei der Erstellung etwas hinten angestellt. Während es ja beim Arduino die Loopschleife als Hauptprogramm(-Funktion) gibt habe ich mir hier einen "abgebrochen" es mit 'ner while-Schleife und einigen Flags hinzubekommen.
Die Kenner werden sich bestimmt über den Programmierstil die Bäuche kugellig lachen, ich nehms mit Humor ;) , aber ich möchte gern lernen aus den kritischen Kennerblicken und -worten.

Hier ist der Sourcecode (http://robot.oderlachs.de/alarm/alarm_433.html)zu finden.

Ich danke schon mal für Eure Kritik und Anregung.
Leider kann ich momentan auch nicht praktisch testen, das STK500 ist zZt woanders..

Gerhard

-schumi-
25.04.2013, 00:09
So ganz bin ich noch nicht dahintergekommen was du mit den Flags bezweckst, aber ein paar Dinge die mir aufgefallen sind:

in der main:
while (erg<1) // Dauerschleife bis Alarmmeldung Und dann? Der Mikrocontroller darf sein Programm nie verlassen, denn du weist ja nicht was danach noch so im Flash an Programmcode folgt, der µC kann also alles mögliche machen. Du musst immer eine Hauptschleife haben die unter keinen Umständen verlassen werden kann: while(1)
Beide Unterprogramme können zwar int-Werte zurückgeben, aber die einzigen Rücksprungbefehle sind: "return 0;". Wozu muss man dann Int-Werte zurückgeben können, wenn sowiso in jedem Fall nur ein 0er zurückgegeben wird?



Was soll denn das Programm genau machen?



Warten bis PB2 low ist
für 3 Minuten Alarm geben
Alarm abschalten
warten bis PB2 wieder high ist (kein Alarmsignal mehr)
wieder warten bis PB2 low ist (sprich ab Schriit 1 abwärts)

Stimmt das so?

<EDIT:>
Falls die Liste so stimmt, sollte folgendes Programm funktionieren (nicht getestet, aber so falsch kanns nicht sein :)):
https://dl.dropboxusercontent.com/u/19005544/cprogramm2.c.html

oderlachs
25.04.2013, 09:38
Hallo Schumi !
habe recht herzlichen Dank für Deine Mühen und auch den Code !!! ich werde am Wochenende mein STK500 wieder haben und kann dann probieren...
Ja was soll das Programm machen Du hast es fast richtig erfasst, den konkreten Ablauf wird die Praxis erst zeigen.
Folgendes soll erst mal passieren:
1. INPort.1 wartet auf LOW
2. OUTPort.1 gibt 3Min. LOW (Kann event.auch HIGH werden je nach Anschluss, erst mal unwichtig)
3. OUTPort.2 gibt dauerhaft LOW (Kann event.auch HIGH werden je nach Anschluss, erst mal unwichtig)
4. INPort.2 wartet auf LOW oder auch Reset möglich... dann weiter bei 1.

Dazu noch die Frage, wie verhält es sich mit boolschen Variablen, habe gelesen das das in C nicht vorhanden ist, im Boch über C,C++ finde ich aber den Datentyp
bool bzw. _bool ???
Na ja ich muss mich wieder Einarbeiten, möchte aber nicht nach ASM oder BASCOM wechseln C/C++ soll es schon sein was ich auf meine "alten Tage " noch mals auffrischen möchte und auch anwenden.

Danke und Gruss

Gerhard

oberallgeier
25.04.2013, 10:42
... Dazu noch die Frage, wie verhält es sich mit boolschen Variablen ...Das ist ja ne häufig diskutierte Frage. Gibts im Prinzip nicht, macht ja nix:

#define bool blafasel
Denn per #define kann man alles so anlegen, wie man will

markusj
25.04.2013, 11:45
Seit C99 gibt es einen entsprechenden Datentypen: http://stackoverflow.com/questions/1608318/is-bool-a-native-c-type

mfG
Markus

oderlachs
25.04.2013, 13:01
Ja Markus, so stehts auch in meinen neueren C/C++ Handbüchern, aber ob Gcc da so mit macht weiss ich eben nicht, der Versuch wirds zeigen.
Danke
Gerhard

markusj
25.04.2013, 13:09
Tut er. Einfach nur stdbool.h einbinden und schon hast du "bool". Für die gescheiten Integer-Datentypen (uintXX_t und intXX_t) gibt es analog stdint.h.

mfG
Markus

oberallgeier
25.04.2013, 14:37
... nur stdbool.h einbinden und schon hast du "bool ...Manchmal brauche ich Anstöße - dann fällt mir wieder ein, dass ich schon mal fündig geworden war. Bei mir liegt das z.B. im directory
...\WinAVR-20100110\lib\gcc\avr\4.3.3\include

In dieser stdbool.h steht dann noch:


...
/* As a special exception, if you include this header file into source
files compiled by GCC, this header file does not by itself cause
the resulting executable to be covered by the GNU General Public
License. This exception does not however invalidate any other
reasons why the executable file might be covered by the GNU General
Public License. *//*
* ISO C Standard: 7.16 Boolean type and values <stdbool.h>
*/
...

oderlachs
25.04.2013, 20:52
So ich habe es jetzt getestet auf dem STK500, leider brachte der Source von Schumi Fehlermeldungen bei _delay_ms mit sich.(??)

So habe ich meinen Code nochmals umgearbeitet ein wenig und es klappt bestens (ich sehe das so..). Wegen der Einfachheit der Aufgaben, will ich da auch keine weiteren Klimmzüge mehr machen.
Ich werde bald zu grösseren Aufgaben in Sachen AVR und C++ stossen, wo ich bestimmt wieder ein paar "Nüsse zu knacken habe" ;)

Hier mein aktueller Source (http://robot.oderlachs.de/alarm/alarm_433.html)

Ich danke allen Helfen recht herzlich, ich habe auch wieder dabei gelernt und das ist gut so.

Danke und Gruss

Gerhard

Ritchie
27.04.2013, 19:52
Hallo Gerhard,

der von Dir gezeigt Code hat aber nichts mit C++ zu tun. Hier werden nur die Standard C von K&R (http://de.wikipedia.org/wiki/The_C_Programming_Language) verwendet.

wurde oben zwar schon angesprochen, aber folgende Zeile löst Deine Bool Frage:




#include <stdbool.h>

Ein Buch für C++ wäre da meiner Meinung nach falsch, es sei den, Du willst Objektorientiert Deinen Kontroller programmieren.

Gruss R.

oderlachs
28.04.2013, 11:39
Hallo Ritchie !

Ich weiss zwar nicht was Du damit meinst mit dem falschem Buch, ich habe eben C Code geschrieben und der ist in C++ genauso wie in NUR C, gewiss habe ich noch keine class hier geschrieben, weil ich einfach das noch nicht brauche zZt. Mit OOP wären mir solche einfachen Anwendungen , wie mit Kanonen auf Spatzen schiessen...
Noch mal zum falschen Buch, ich habe das mit bool, _bool num mal im C++ Buch gelsen weil ich das gerade in der Hand hatte , trotzdem kann ich Deine Bedenken nicht recht folgen...Ich denke mal das ist Ansichtssache und mir eigendlich auch "Schnurtzpiepe" :), solange ich mit dem Programm erreiche was ich möchte und der/die Compiler nicht rummeckern...

Gruss
Gerhard

Ritchie
28.04.2013, 12:19
Hallo Gerhard,

wenn sich dieses Buch ausschliesslich mit C statt mit C++ befasst, stimme ich Dir zu. C++ ist nämlich nicht C mit ein bisschen mehr funktionen, sondern auch die herangehensweise an Programme ist ganz anderes.
Das Wechseln von C auf C++ ist schwieriger, als wenn man von C keine Ahnung hat und dann mit C++ anfängt.

Auch muss ich Dir recht geben, das die Verwendung von C++ für kleine Controller-Programm ziemlich übertrieben ist.

Die Anmerkung war als Hinweis und nicht als Kritik gedacht, wenn Du mit diesem Buch klar kommst, sollte das vollkommen ausreichen.

Gruss R.

oderlachs
28.04.2013, 13:28
Hallo Ritchie !
Ich hatte es auch nicht so als negative Kritik aufgefasst, nur nicht so richtig den Sinn der Sache erfasst. Mir ging es nur mal darum das Wer, der lfd. damit umgeht, sich den Code anschaut. Bei Verwendung der ATTiny als µC, ist man ja auf die minimale Grösse des Programms bedacht, mann kann schon je nach Befehl und Verfahrensweise ein paar Byte einsparen( Kleinvieh macht auch Mist... ;) ). Darum sollte die Begutachtung sein. Ich hätte das Prog auch in ASSR oder per Bascom schreiben können, aber ich will mich mal auf C/C++ Ebene weiterbewegen und nicht mal so und mal so.

Gruss Gerhard