Forum: Mikrocontroller und Digitale Elektronik Tasterstatus speichern und EEPROM beschreiben/lesen


von Stefan H. (stefan_h68)


Lesenswert?

Hello again :D

ich habe wie schon angekündigt ein neues Probelm und konnte dazu in 
Google nichts finden, zumindest nichts aufschlussreiches. Mein C-Code 
bis jetzt:
1
#include <htc.h>              //include header file
2
#include <pic16f688.h>            //include PIC header
3
4
//#define FOSC_INTOSCIO        0xFFFC      //set internal oscillator I/O function on RA4/OSC2/CLKOUT and RA5/OSC1/CLKIN
5
#define WDTE_OFF             0xFFF7      //disable Watchdog Timer
6
#define MCLRE_OFF            0xFFDF      //MCLR pin function is digital input, MCLR internally tied to VDD
7
#pragma FOSC_INTOSCIO
8
9
10
int main ()
11
{
12
  unsigned char i;
13
  ANSEL = 0b00000000;            //All I/O pins are configured as digital
14
  CMCON0 = 0b00000111;          //Comperators turned OFF              
15
  PORTA = 0x00;
16
  PORTC = 0x00;
17
    TRISC = 0b11111111;            //set PORT C INPUT
18
  TRISA = 0b00000000;            //set Port A OUTPUT
19
  
20
  
21
22
  if ( PORTC == 0b00001000 ) { 
23
    i = 1;
24
  }
25
26
  else {
27
    i = 0;
28
  }
29
  
30
  if ( i == 1 ) {
31
  PORTA = 0b00000001;
32
  }
33
  if ( i == 0 ) {
34
  PORTA = 0b00000010;
35
  }
36
  
37
}

ich kann jetzt mit einem Taster zwischen den beiden LEDs an PORT A 
umschalten, jedoch nur solange ich ihn drücke. Wie kann ich den zustand 
speichern? (RS-Glied oder FlipFlop) oder den zustand ins EEPROM 
schreiben und wieder herauslesen. Den Taster habe ich mit einem 
parallelgeschalteten Kondensator entprellt.
Außerdem ist das Ausgangssignal zu den LEDs Pulsförmig(Rechteckspannung) 
aber ich möchte ein kontinuierliches Hi. Wie bekomme ich das hin?

Vielen Dank im vorraus.

MfG Stefan

von Karl H. (kbuchegg)


Lesenswert?

Stefan H. schrieb:


> Außerdem ist das Ausgangssignal zu den LEDs Pulsförmig(Rechteckspannung)
> aber ich möchte ein kontinuierliches Hi. Wie bekomme ich das hin?

Indem du zu allererst mal zur Kentniss nimmst, dass ein µC Programm 
immer eine Hauptschleife braucht, in der man das Programm 'gefangen' 
hält. Du willst auf keinen Fall haben, dass die Programmausführung aus 
main() jemals wieder heraus kommt.

Ein µC Programm sieht konzeptionell immer so aus
1
int main()
2
{
3
4
   mache alle Initialisierungen
5
   konfiguriere die Hardware
6
7
   while( 1 )  {      die Hauptschleife
8
9
     hier kommt dann die Programmlogik selber rein
10
11
   }
12
}

und innerhalb der Hauptschleife spielt sich dann die eigentliche 
Programmlogik ab. Zum Beispiel könnte man dort den Zustand des Pins mit 
der Taste mit dem Zustand vom unmittelbar vorhergehenden Durchlauf 
vergleichen. Wenn sich die beiden unterscheiden, dann hat offenbar 
jemand auf die Taste gedrückt. Bleibt er dann auf der Taste drauf, dann 
wird in weiterer Folge bei den Durchläufen durch die Schleife 
festgestellt, dass sich der Zustand ab da dann nicht mehr verändert. Bis 
dann eben der Benutzer die Taste wieder loslässt.

Also im Prinzip
1
int main()
2
{
3
4
  ....
5
6
  alt = wie ist der jetzige Tastenzustand
7
8
  while( 1 ) {
9
10
    neu = wie ist der jetzige Tastenzustand
11
12
    if( alt != neu ) {
13
14
      holla, da hat wer an der Taste gefummelt
15
      Entweder gedrückt oder losgelassen.
16
17
      if( neu == gedrückt )
18
         mach was, wenn die Taste niedergedrückt wurde
19
20
      else
21
        die Taste wurde offenbar gerade losgelassen.
22
        Bearbeite diesen Fall
23
24
      alt = neu;
25
    }
26
  }
27
}

von Steel (Gast)


Lesenswert?

Verbaschiede dich von dem Denken wie es zur Programmierung von SPS 
verwendet wird. Du musst hier erstmal lernen, wie man richtig in C 
programmiert.

ersetze
1
  if ( PORTC == 0b00001000 ) { 
2
    i = 1;
3
  }
4
5
  else {
6
    i = 0;
7
  }

durch
1
  if ( PORTC == 0b00001000 ) { 
2
    i = !i;
3
  }

i=!i; führt dauzu, dass i 1 (bzw. nicht Null) wird wenn es vorher 0 war 
und umgekehrt. i ist kein schöner Variablenamen, den nimmt man nur als 
Schleifenzähler bei kurzen, selbsterklärenden Schleifen.

von Uwe B. (derexponent)


Lesenswert?

>ersetze
>
>  if ( PORTC == 0b00001000 ) {
>    i = 1;
>  }
>
>  else {
>    i = 0;
>  }
>
>durch
>  if ( PORTC == 0b00001000 ) {
>    i = !i;
>  }


1. Warum ?
2. Macht das zweite "IF" was anderes als das erste

Gruss Uwe

von spontan (Gast)


Lesenswert?

- Wo ist die Main?
- Werte speichert man in Variablen (RAM).

- Gib doch ein bischen Geld für ein C-Buch aus. Oder lies Dich irgendwo 
ein.

von Steel (Gast)


Lesenswert?

Uwe B. schrieb:
> 2. Macht das zweite "IF" was anderes als das erste

Ja, das wechselt i zwischen 1 und 0 solange die Taste gedrückt ist. Das 
andere setzt ne 1 wenn Taste gedrückt und ne 0 wenn Taste nicht 
gedrückt. Trotzdem ist mein Vorschlag von oben natürlich Blödsinn, Asche 
auf mein Haupt! Da muss vorher noch ne Flankenerkennung für die Taste 
rein. Aber K.H,B. hat ja inzwischen alles erklärt.

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.