Lieber Besucher, herzlich willkommen bei: RCLine Modellbau Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.
- RCLine Forum
- » Zubehör,...
- » Elektronik-spezia...
- » Atmel-Programmier...
- » Beispielprogramme...
- » Programm 2: Eingaenge abfragen
Programm 2: Eingaenge abfragen
EDIT: Achtung, bitte Zip File neu runterladen. Hab einen Fehler beim kopieren gemacht und im makefile meinen Programmer eingestellt.
Edit 2: Es tut mir furchtbar leid. Aber ich habe gestern Mist hier hingestellt. Habe auf meiner Platte ein Chaos angerichtet. Finde nun den zu meinem Test Hexfile passenden Code nicht mehr. Ich mach das morgen neu. Dann findet ihr hier was lauffaehiges.
Edit 2: Es tut mir furchtbar leid. Aber ich habe gestern Mist hier hingestellt. Habe auf meiner Platte ein Chaos angerichtet. Finde nun den zu meinem Test Hexfile passenden Code nicht mehr. Ich mach das morgen neu. Dann findet ihr hier was lauffaehiges.
Gruss
Thomas
Meine Homepage. SBL und mehr.

*** There is a difference between knowing the path and walking the path. *** Morpheus .
Thomas
Meine Homepage. SBL und mehr.

*** There is a difference between knowing the path and walking the path. *** Morpheus .
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Thomas_R.« (31. Januar 2006, 23:48)
So, hab nun alles wiedergefunden, werde es aber erst nach erneutem Test hier reinstellen.
Deshalb mal kurz etwas Theorie.
Warum hat mein Code den ich hier reingestellt habe nicht funktioniert?
Das hat mit meiner Arbeitsweise zu tun. Einen ersten Programmentwurf baue ich der Uebersichtlichkeit halber immer mit Funktionen auf. Hat den Vorteil, das der Editor mich mit Syntaxhighlighting dabei unterstuetzt die Struktur zu erkennen.
In diesem Fall hier war das aber eine Falle und Pech das ich genau diesen Entwurf hergestellt und bei der Beschreibung nicht mehr nachgedacht habe.
Ihr erinnert euch vielleicht. Ich habe Funktionen verwendet an die ich z.B. PORTD uebergeben habe. Das aber genau funktioniert nicht.
Denn Angaben wie PORTD, PIND, DDRD und aenhliche sind keine echten Konstante. Diese Angaben sind in den Include Dateien z.B. als Makros definiert.
(mach euch mal die Muehe und sucht in den Include Dateien des WinAVR nach define PORTD).
Demzufolge koennen diese "Werte" nicht als Variablen an Funktionen uebergeben werden.
Um ein Programm trotzdem definiert zu schreiben und sich nicht mit den Bitoperationen rumzuschlagen, verwendet man nun wiederum Makros.
Statt z.B.
void schalteLichtAus(int port, int pin)
{
port &=~ _BV(pin);
}
schreiben wir das Makro
#define schalteLichtAus(port, pin) (port &=~ _BV(pin))
welches auf den ersten Blick das gleiche macht. Nur wird ein Makro beim compilieren direkt in den Code eingefuegt und nicht als Funktion aufgerufen.
Das macht den Unterschied bei PORTD und Co.
Der Aufruf von beiden ist der gleiche:
schalteLichtAus(PORTD, PD7);
Die Wirkung eine voellig andere.
Tja, und statt der Makro Version hab ich die Funktionsversion beim zusammenpacken erwischt.
Morgen (nachher) mehr.
Deshalb mal kurz etwas Theorie.
Warum hat mein Code den ich hier reingestellt habe nicht funktioniert?
Das hat mit meiner Arbeitsweise zu tun. Einen ersten Programmentwurf baue ich der Uebersichtlichkeit halber immer mit Funktionen auf. Hat den Vorteil, das der Editor mich mit Syntaxhighlighting dabei unterstuetzt die Struktur zu erkennen.
In diesem Fall hier war das aber eine Falle und Pech das ich genau diesen Entwurf hergestellt und bei der Beschreibung nicht mehr nachgedacht habe.
Ihr erinnert euch vielleicht. Ich habe Funktionen verwendet an die ich z.B. PORTD uebergeben habe. Das aber genau funktioniert nicht.
Denn Angaben wie PORTD, PIND, DDRD und aenhliche sind keine echten Konstante. Diese Angaben sind in den Include Dateien z.B. als Makros definiert.
(mach euch mal die Muehe und sucht in den Include Dateien des WinAVR nach define PORTD).
Demzufolge koennen diese "Werte" nicht als Variablen an Funktionen uebergeben werden.
Um ein Programm trotzdem definiert zu schreiben und sich nicht mit den Bitoperationen rumzuschlagen, verwendet man nun wiederum Makros.
Statt z.B.
void schalteLichtAus(int port, int pin)
{
port &=~ _BV(pin);
}
schreiben wir das Makro
#define schalteLichtAus(port, pin) (port &=~ _BV(pin))
welches auf den ersten Blick das gleiche macht. Nur wird ein Makro beim compilieren direkt in den Code eingefuegt und nicht als Funktion aufgerufen.
Das macht den Unterschied bei PORTD und Co.
Der Aufruf von beiden ist der gleiche:
schalteLichtAus(PORTD, PD7);
Die Wirkung eine voellig andere.
Tja, und statt der Makro Version hab ich die Funktionsversion beim zusammenpacken erwischt.
Morgen (nachher) mehr.
Gruss
Thomas
Meine Homepage. SBL und mehr.

*** There is a difference between knowing the path and walking the path. *** Morpheus .
Thomas
Meine Homepage. SBL und mehr.

*** There is a difference between knowing the path and walking the path. *** Morpheus .
Und hier ist es endlich. Wie oben beschrieben sind nun die entspr. Kommandos als Makros implementiert. Mit den Makros werden wir uns in den weiteren Teilen des Kurses noch naeher beschaeftigen.
|
|
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
#include <stdlib.h>
#include <avr/io.h>
// Schalter an Port D.0
// LED an Port D.7
//===========================================
// Eingang abfragen.
//===========================================
#define setzeInput(port, pin) (port &=~ _BV(pin))
#define enablePullup(port, pin) (port |= _BV(pin))
#define setzeOutput(port, pin) (port |= _BV(pin))
#define istTasteGedrueckt(port, pin) (bit_is_clear(port, pin))
#define schalteLichtAn(port, pin) (port |= _BV(pin))
#define schalteLichtAus(port, pin) (port &=~ _BV(pin))
#define schateLichtUm(port, pin) (port ^= _BV(pin))
int main(void)
{
// Schalter an Port D.0, also Input
setzeInput(DDRD, PD0);
enablePullup(PORTD, PD0);
// LED an Port D.7, also Output
setzeOutput(DDRD, PD7);
//===========================================
// Hauptprogramm-Schleife
//===========================================
// Wir bauen uns eine Endlosschleife ;-)
while (1)
{
// Im Gegensatz zu Torstens Beispielprogramm lassen wir das Licht
// nun solange Leuchten wie die Taste gedrueckt ist
if(istTasteGedrueckt(PIND, PIND0))
{
// klar, ohne == 1 geht's auch, da ich aber oben 1 zurueckgebe
// machen wir es sauber.
schalteLichtAn(PORTD, PD7);
}
else
{
schalteLichtAus(PORTD, PD7);
}
};
return(0);
}
|
Gruss
Thomas
Meine Homepage. SBL und mehr.

*** There is a difference between knowing the path and walking the path. *** Morpheus .
Thomas
Meine Homepage. SBL und mehr.

*** There is a difference between knowing the path and walking the path. *** Morpheus .