PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : merken von Tatserzuständen



Pinie
10.12.2010, 11:18
Hallo Forum,
ich bin neu Hier und habe gleich eine frage
Ich habe vor mir den Zustand zu von einem Taster zu merken also wie oft er gedrückt wurde und dementsprechend oft ein Programm durchzulaufen wenn das Programm durchläuft soll er sich weiterhin merken wenn der Taster gedrückt wird.
Hat da vielleicht jemand einen Code den er mir geben könnte?
Zu mir
Ich bin kein gelernter Programmierer oder Elektroniker ich mache das nur Hobby mäßig
Programmiersprache C
Mikrocontroller ist ein ATmega 16

ijjiij
10.12.2010, 11:57
code hab ich keinen aber rein von der logik:

lass dir einfach beim taster überprüfen eine variable hochzählen


zählvariable = 0;
if(taster gedrückt)
zählvariable++;

und anschließend lasst du die methode die das programm ausführen soll per schleife (for oder while, was dir besser liegt) durchlaufen, zb so:


for(int i=0; i<zählvariable; i++)
{
//do something
}

oder mit while:

while(zählvariable > 0)
{
//do something
zählvariable--;
}

im while fall ist zu beachten, das in diesem fall die zählvariable danach wieder auf 0 gesetzt wird
kann jetzt gut gewünscht oder unerwünscht sein, je nach anwendungsfall

der code is jetz zwar in c++, glaube aber kaum das er in c wirklich anders aussehen wird

lg

Pinie
12.12.2010, 15:51
Hallo,
danke für deine Antwort ijjiij
habe mir jetzt was programmiert allerdings kommt folgende Fehlermeldung:
../test.c:62: error: expected declaration or statement at end of input

leider weis ich nicht was jetzt falsch daran ist kann sich das mal jemand anschauen?


// Einbinden der Headerdateien
#include <avr/io.h> // Für Kommunikation über Ports benötigt
#include <util/delay.h> // Für Wartezeiten benötigt
#include <stdlib.h>
#include <math.h>


// LEDs sind high-active geschaltet
#define LED_AN(LED) (PORTD |= (1<<(LED)))
#define LED_AUS(LED) (PORTD &= ~(1<<(LED)))
#define LED_TOGGLE(LED) (PORTD ^= (1<<(LED)))
#define LED1 PD0
#define LED2 PD1
#define LED3 PD2
#define LED4 PD3
#define LED5 PD4
#define LED6 PD5
#define LED7 PD6
#define LED8 PD7

// TASTER ist high-active geschaltet
#define TASTER1 PC0 //hoch
#define TASTER2 PC1
#define TASTER_GEDRUECKT(TASTER) (PINC & (1<<TASTER))
#define TASTE_AUF 0
#define TASTE_ZU 1


int main(void)
{

uint8_t zaehlvariable = 0;

if(TASTER_GEDRUECKT(TASTER1))
zaehlvariable++;


// Taster initialisieren
DDRC &= ~(1<<TASTER1) | (1<<TASTER2); // Port C: Eingang für Taster

// Anfangseinstellung
DDRD |= (1<<LED1) | (1<<LED2) | (1<<LED3) | (1<<LED4); // Port D: Ausgang für LED1 und LED2

for(int i=0; i<zaehlvariable; i++)
{
LED_AN(LED4);
_delay_ms(100); // Wert 0,1sec
LED_AUS(LED4);
_delay_ms(10); // Wert 0,01sec
LED_AN(LED3);
_delay_ms(100); // Wert 0,1sec
LED_AUS(LED3);
_delay_ms(10); // Wert 0,01sec
LED_AN(LED2);
_delay_ms(100); // Wert 0,1sec
LED_AUS(LED2);
_delay_ms(10); // Wert 0,01sec
LED_AN(LED1);
_delay_ms(100); // Wert 0,1sec
LED_AUS(LED1);
_delay_ms(10); // Wert 0,01sec
}

Ich habe mit dem AVR-Studio4 programmiert fals das weiter hilft

danke schonmal für die Hilfe

ijjiij
12.12.2010, 20:04
also ein problem was ich jetz prinzipiell mal seh is, das du ihm nicht sagst wie lange er auf die input eingabe warten soll

in deinem fall wird also zu beginn des programms abgefragt ob der taster gedrückt ist oder nicht, zaehlvariable ist also 0 (initialisierungswert) oder 1 (taster gedrückt)
da müsstest du dir noch überlegen nach welchem schema er erkennen soll, wie oft du den knopf noch weiter drücken willst...
könntest du zb über einen timer machen (wenn länger als 5 sek kein knopf gedrückt wurde, mach weiter), oder über einen 2. taster (taster 1 wird n mal gedrückt und taster 2 bestätigt die eingabe)

das ganze dann in eine while schleife:
while weitere eingabe möglich -> warte auf eingabe
abbruchbedingung durch if (zb if taster 2 gedrückt -> setze den bool für die while schleife auf false und verlasse diese dadurch)



vielleicht liegts ja daran, das die zählvariable durch deinen programmablauf einfach immer 0 war und desshalb nie was passiert ist...

lg

Pinie
14.12.2010, 21:38
Hallo,
habe das Problem gelöst mir fehlte nur }.
jetzt läuft aber keine LED ich habe noch einwenig dran geändertsiehe anhang

könnte mir jemand weiterheklfen?
besten dank im vorraus

sast
15.12.2010, 08:36
Fangen wir mal mit den zwei offensichtlichsten Dingen an.
1. wenn du in einer if-Abfrage eine auf 0 initialisierte Variable die im main nur hochgezählt wird auf kleiner 0 vergleichst, wird die Anweisung im true Zweig wohl nie ausgeführt.
2. wo rufst du denn deine ausgabe-Funktion auf?

Solche Sachen, wie fehlende Klammern erkennt man am Besten, wenn man den Code ordentlich einrückt. Das wirkt bei dir etwas unsortiert.

Beinahe hätte ich noch was wichtiges vergessen. Anweisungsblöcke müssen auch immer in Klammern gepackt werden, wenn sie aus mehr als einer Anweisung bestehen.

Es ist ein riesen Unterschied ob du


if (i>1) i--;
a=i;

oder


if (i>1)
{
i--;
a=i;
}

schreibst. Im ersten Fall wird a=i; unabhängig von i immer ausgeführt. Im zweiten Fall nur wenn i>1 erfüllt ist.

sast

Pinie
15.12.2010, 10:10
Hallo, ich habe nun in void ausgabe geändert


void ausgabe(uint8_t zaehlvariable)

{
if (zaehlvariable > 0)


LED_AN(LED8);
_delay_ms(1000); // Wert 0,1sec
LED_AUS(LED8);
_delay_ms(100); // Wert 0,01sec
LED_AN(LED3);
_delay_ms(1000); // Wert 0,1sec
LED_AUS(LED3);
_delay_ms(100); // Wert 0,01sec
LED_AN(LED2);
_delay_ms(1000); // Wert 0,1sec
LED_AUS(LED2);
_delay_ms(100); // Wert 0,01sec
LED_AN(LED1);
_delay_ms(1000); // Wert 0,1sec
LED_AUS(LED1);
zaehlvariable--;

}

in der while schleife habe ich nun die Ausgabe hinzugefügt


while(1)
ausgabe(zaehlvariable);
{
if TASTER_GEDRUECKT(TASTER1)
zaehlvariable++;
}

jetzt leuchten die LEDs 1-3 abwechselnt aber der Tasterdruck wird im Programm nicht verarbeitet[/quote]

sast
15.12.2010, 12:48
es wird genau immer das hier ausgeführt

while(1)
ausgabe(zaehlvariable);

die while läuft so lange bis 1 false wird.
Ich persönlich habe das in C noch nie erlebt.

sast

Pinie
16.12.2010, 15:03
Hallo,
wie müsste das aussehen das wenn ich den Taster drücke sich der Wert um 1 erhöht?
ich bin mit dem Hobby noch so ziehmlich am Anfang :cheesy:
besten dank im vorraus

sast
16.12.2010, 15:28
while(1)
{
ausgabe(zaehlvariable);
if TASTER_GEDRUECKT(TASTER1) zaehlvariable++;
}


allerdings wird sich die Variable nie um mehr als eins erhöhen und dann sofort wieder zurückgesetzt.
Du musst dir vor Augen halten, dass die Abarbeitung sequentiell passiert.
Die while rennt zwar immer wieder durch, aber es wird ja auch jedes mal die ausgabe() aufgerufen und wieder rückgesetzt.
Wenn du in der Abarbeitungszeit von ausgabe() mehrere Tastendrücke registrieren willst, dann musst du mit einer Interruptroutine die zaehlvariable hochzählen lassen. Das ist dann nebenläufig zum Hauptprogramm und registriert auch während der "normalen" Verarbeitung deines Programms deine Interaktion.
Da du aber schon Schwierigkeiten beim Code hast (Klammersetzung, Anweisungsblöcke, Schleifen usw), würde ich dir raten, da mal noch etwas in der Theorie zu wühlen bevor du dich damit enttäuschst gleich Interrupts zu verarbeiten. Da kommen dann nämlich noch neue Fallstricke hinzu.

sast