Forum: Compiler & IDEs Anfängerprobleme beim Programmieren eines Lauflichts mit funktionen


von Florian R. (flow2006)


Lesenswert?

Hallo,
Ich brauchte da mal ein bisschen Hilfe weil ich so langsam nicht weiter 
weiß wie ich das machen soll.
Und zwar habe ich vor ein lauflicht zu bauen was ich dann per Taster 
auch noch schneller machen kann und auch auf Dauer licht schalten 
möchte.
Das lauflicht an sich selbst funktioniert schon so wie ich es haben 
möchte, allerdings bekomme ich das einfach nicht hin das das auf 
tasterdruck auf Dauer licht umschaltet hab da jetzt auch schon paar 
Ansätze versucht allerdings funktionieren die immer nur sporadisch mehr 
durch Zufall als gewollt , d.h. ich drücke den Taster nichts passiert 
dann wackle ich bisschen am Taster und plötzlich schaltet es mal für 
eine msec um aber dann wieder zurück auf das lauflicht, achja hatte hier 
im forum mal geguckt gehabt und jetzt mal das entprell macro eingefügt, 
was mir leider auch nicht viel weiter geholfen hat.
Die Schaltung an sich habe ich hier auf einen Steck Brett aufgebaut 
,habe um auszuschließen das der Taster defekt ist auch den Draht auch 
mal kurz direkt an den pin vom atmega8 dran gehalten, da passierte dann 
aber nichts. bin hier so bisschen am Verzweifeln so langsam.
Vielleicht kann sich ja mal jemand der mehr Ahnung von der Materie hat 
als ich den Code mal angucken, habe zwar schon in C und C++ programmiert 
aber halt noch nie in Verbindung mit einen µC.
danke

und hier nochmal der Code:
1
/*
2
 * GccApplication1.c
3
 *
4
 * Created: 13.07.2012 02:12:07
5
 *  Author: Flow
6
 */ 
7
8
9
#include <avr/io.h>
10
#include <util/delay.h>
11
#define F_CPU 1000000
12
13
14
#define debounce( port, pin )            \
15
({                  \
16
static uint8_t flag = 0;  /* new variable on every macro usage */  \
17
uint8_t i = 0;              \
18
\
19
if( flag ){      /* check for key release: */    \
20
for(;;){      /* loop ... */        \
21
if( !(port & 1<<pin) ){  /* ... until key pressed or ... */  \
22
i = 0;      /* 0 = bounce */      \
23
break;                \
24
      }                  \
25
      _delay_us( 98 );    /* * 256 = 25ms */      \
26
      if( --i == 0 ){    /* ... until key >25ms released */  \
27
  flag = 0;    /* clear press flag */      \
28
  i = 0;      /* 0 = key release debounced */    \
29
  break;                \
30
      }                  \
31
    }                  \
32
  }else{      /* else check for key press: */    \
33
    for(;;){      /* loop ... */        \
34
      if( (port & 1<<pin) ){  /* ... until key released or ... */  \
35
  i = 0;      /* 0 = bounce */      \
36
  break;                \
37
      }                  \
38
      _delay_us( 98 );    /* * 256 = 25ms */      \
39
      if( --i == 0 ){    /* ... until key >25ms pressed */  \
40
  flag = 1;    /* set press flag */      \
41
  i = 1;      /* 1 = key press debounced */    \
42
  break;                \
43
      }                  \
44
    }                  \
45
  }                  \
46
  i;        /* return value of Macro */    \
47
})
48
49
50
51
52
53
void port0(int i){
54
  if(i==1){
55
  PORTC |= (1<<PC0);
56
  }  
57
  else if(i==2){
58
  PORTC &= ~(1<<PC0);
59
  }
60
}
61
void port1(int i){
62
  if(i==1){
63
  PORTC |= (1<<PC1);
64
  }  
65
  else if(i==2){
66
  PORTC &= ~(1<<PC1);
67
  }  
68
}
69
void port2(int i){
70
  if(i==1){
71
  PORTC |= (1<<PC2);
72
  }
73
  else if(i==2){
74
  PORTC &= ~(1<<PC2);
75
  }
76
}
77
void port3(int i){
78
  if(i==1){
79
  PORTC |= (1<<PC3);
80
  }
81
  else if(i==2){
82
  PORTC &= ~(1<<PC3);
83
  }
84
}
85
void dauerlicht(){
86
  PORTC |= (1<<PC0);
87
  PORTC |= (1<<PC1);
88
  PORTC |= (1<<PC2);
89
  PORTC |= (1<<PC3);
90
  return;
91
}
92
93
void blinklicht(){
94
    int a=1;
95
    int b=2;
96
  port2(a);
97
  port0(b);
98
  _delay_ms(300);
99
  port3(a);
100
  port1(b);
101
  _delay_ms(300);
102
  port0(a);
103
  port2(b);
104
  _delay_ms(300);
105
  port1(a);
106
  port3(b);
107
  _delay_ms(300);
108
}
109
110
int main(void)
111
{
112
  
113
  int i=1;
114
  DDRC = 0xFF;
115
  DDRD &= ~(1<<PD0);
116
  //PORTC |= (1<<PC4);
117
  
118
   while(1)
119
    {
120
    if(debounce(PIND,PIND4)){
121
      i++;
122
    }      
123
      
124
    
125
    if(i%2)
126
    blinklicht();
127
    else if(1)
128
    dauerlicht();
129
    
130
    }
131
}

von Karl H. (kbuchegg)


Lesenswert?

Dein Hauptfehler ist die Verwendung von _delay_ms.
Damit wird das alles nichts.

Wenn es um Zeitsteuerungen geht, führt kein Weg an einem Timer vorbei, 
wenn es vernünftig sein soll. Der Timer stellt dir einen 'Basistakt' zur 
Verfügung. Zum Beispiel ein paar Millisekunden (zb 10ms). Und davon wird 
dann alles weitere abgeleitet, zum Beispiel, dass nach dem 100-ten 
Basistakt (100*10ms ergibt 1 Sekunde) die nächste LED aus dem aktuellen 
Muster aufleuchten soll.

Schneller bzw. langsamer ist dann einfach nur eine Veränderung dieses 
'Abzählwertes' an Basistakten. Musterwechsel ist dann einfach nur eine 
Veränderung des aktuellen Musters, aus dem dann beim nächsten Zeittakt 
die nächste aufzuleuchtende LED ausgewählt wird.


Ohne Timer ist das alles nicht vernünftig machbar. Daher solltest du 
dich zunächst mit Timern beschäftigen. Das ist sowieso eine 
Basistechnik. Es gibt kaum ernsthafte Programme, die ohne Timer 
auskommen. In irgendeiner Form ist meistens mindestens einer involviert.

*** FAQ: Timer ***

von Florian R. (flow2006)


Lesenswert?

okay danke dann werde ich mich da erst mal ein bisschen durcharbeiten

von Florian R. (flow2006)


Lesenswert?

hmm ok also wenn ich jetzt den timer verwende und mein mega8 mit 1mhz 
läuft,
dann kann ich jetzt laut datenblatt den vorteiler ja auch auf 1024 
setzen somit sollte der timer dann ja in einer sek. 3 mal durchlaufen 
und dann noch bis 207 zählen seh ich das richtig?
aber wie nutze ich das jetzt um damit die leds blinken zu lassen?

von Karl H. (kbuchegg)


Lesenswert?

Sieh dir an, wie man in C mit Arrays arbeitet.
Das Luflicht wird NICHT dadurch realisiert, dass man im Programm die 
Einschaltsequenz direkt hinschreibt. Statt dessen kommt die Information 
darber, welche Lampe als nächstes einzuschalten ist in Form von 
Codezahlen aus einem Array.
Bei jedem Zeittakt kommt der nächste Arrayeintrag drann.

von Peter D. (peda)


Lesenswert?


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
Noch kein Account? Hier anmelden.