Forum: Mikrocontroller und Digitale Elektronik MAIN Problem


von Anfänger (Gast)


Lesenswert?

if(!(PINA & (zaehler1)))
{
PORTC |=(LED1);          ein
_delay_ms(1);

}
else
{
PORTC &=~(LED1);
wert1++;
wert1min++;
while(!(PINA & (zaehler1)));
}

Controller zählt ins Unendliche bzw bis schleife beendet, normal sollte 
er aber warten bis Signal wieder 0V.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Anfänger schrieb:
> normal sollte er aber warten bis Signal wieder 0V.
Mach dich mal zum Thema Bitmanipulation schlau.

Das ist keine Abfrage eines Portpins:
> if(!(PINA & (zaehler1)))

von XXX (Gast)


Lesenswert?

Und was willst du uns mit deinem Programmschnipsel jetzt sagen?

Gruß
Joachim

von Michael S. (rbs_phoenix)


Lesenswert?

Abgesehen, dass in dem EINEM Satz der Erklärung einige Wörter fehlen, 
fehlt auch ein bisschen mehr Code drumrum. PINA klingt nach einem Pin, 
also einem Bit. Wie will man ein Bit und ein byte und-verknüfen?

von Anfänger (Gast)


Lesenswert?

int main(void)
{
DDRA &=~ (zaehler1);
DDRC |= LED1;

while(1)
{
if(!(PINA & (zaehler1)))
{
PORTC |=(LED1);
_delay_ms(1);

}
else
{
PORTC &=~(LED1);
wert1++;
wert1min++;
while(!(PINA & (zaehler1)));
}
}
}

eigentlich sollte es so gehen, das wenn der zähler auf low geht ist der 
wert +1 gerechnet wird und dann solange wartet bis zähler wieder auf 
high geht.

wert1 und wert1min sind global deklariert.

von Anfänger (Gast)


Lesenswert?

Anfänger schrieb:
> eigentlich sollte es so gehen, das wenn der zähler auf low geht ist der
> wert +1 gerechnet wird und dann solange wartet bis zähler wieder auf
> high geht.
>
> wert1 und wert1min sind global deklariert.


sobald eine 0 kommt an den controller soll die LED1 an sein, wird das 
signal high soll LED1 aus gehen wert1 und wert1min +1 gerechnet werden 
jeweils und danach soll gewartet werden bis bis wieder das signal 0 ist.

von ich (Gast)


Lesenswert?

Junge, formatier dein Quellcode richtig und versuche mal einen 
zusammenhängenden, grammatisch verständlichen, Satz zu bilden.
Ich bin kein Rechtschreibfetischist, aber man sollte wenigstens erkennen 
können was du überhaupt willst.

Was meinst du mit
>wenn der zähler auf low geht

für was steht "LED1"?

von Anfänger (Gast)


Lesenswert?

ich schrieb:
> für was steht "LED1"?

#define LED1        0x04    //PC2

von Anfänger (Gast)


Lesenswert?

#include <avr/io.h>

#define zaehler1    0x01
#define LED1        0x04

unsigned int wert1 = 0;
unsigned int wert1min = 0;

int main(void)
{
DDRA &=~ (zaehler1);
DDRC |= LED1;

while(1)
{
if(!(PINA & (zaehler1)))
{
PORTC |=(LED1);
_delay_ms(1);

}
else
{
PORTC &=~(LED1);
wert1++;
wert1min++;
while(!(PINA & (zaehler1)));
}
}
}

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Michael Skropski schrieb:
> PINA klingt nach einem Pin
Das ist ein 8 Bit breites Eingangsregister eines AVR-Controllers. Aber 
das hätte unser TO ruhig hinschreiben können...


Anfänger schrieb: ...
Ich mal da mal ein paar Satzzeichen mit rein:
> sobald eine 0 kommt an den controller, soll die LED1 an sein.
Die soll da schon an SEIN? Die muß also quasi VORHER angeschaltet 
werden?

> wird das signal high, soll LED1 aus gehen,
> sowie wert1 und wert1min +1 gerechnet werden.
Nur einmal oder andauernd?
Wenns nur 1 mal passieren soll, wäre eine Flankenerkennung nicht ohne...
> und danach soll gewartet werden bis bis wieder das signal 0 ist.
Warum WARTEN? Es soll doch einfach wieder von vorn losgehen. Oder nicht?

Kurz und Knackig sehe ich das so:
Mit einem Eingangssignal soll eine LED ein+ Ausgeschaltet werden.
Zudem soll gezählt werden, wie oft der Eingang aktiv war.

BTW: wenn dein Eingang an einen Taster angeschlossen ist, solltest du 
dich zum Thema "Entprellung" schlau machen...

von Anfänger (Gast)


Lesenswert?

Lothar Miller schrieb:
> Kurz und Knackig sehe ich das so:
> Mit einem Eingangssignal soll eine LED ein+ Ausgeschaltet werden.
> Zudem soll gezählt werden, wie oft der Eingang aktiv war.

So kann man es auch sagen.
Danke für die kurz und knackige erklärung. frage mich gerade wie ich nur 
das mit dem zählen hinbekomme.

von Michael S. (rbs_phoenix)


Lesenswert?

Anfänger schrieb:
> sobald eine 0 kommt an den controller soll die LED1 an sein, wird das
> signal high soll LED1 aus gehen wert1 und wert1min +1 gerechnet werden
> jeweils und danach soll gewartet werden bis bis wieder das signal 0 ist.

so in der art?
1
char zaehler=0;
2
while(1){
3
  if(PINA==0 && zaehler==0){          // Taster gedrückt, zaehler noch auf 0 -> Der erste durchlauf, wo der Taster gedrückt wurde
4
    LED1=1;
5
    zaehler=1;
6
  }
7
  if(PINA==1 && zaehler==1){    // Taster losgelassen, zaehler noch auf 1 -> Der erste durchlauf, wo der Taster losgelassen wurde
8
    LED1=0;
9
    zaehler=0;
10
    wert1++;
11
    wert1min++;
12
  }
13
}


Lothar Miller schrieb:
> Michael Skropski schrieb:
>> PINA klingt nach einem Pin
> Das ist ein 8 Bit breites Eingangsregister eines AVR-Controllers. Aber
> das hätte unser TO ruhig hinschreiben können...

Dann ist mein Beispiel also für den Eingang A0? ;) Wenn es ein 8bit 
Register ist, ist doch bestimmt der ganze Port drin und nicht nur ein 
Pin oder? Wenn ja, dann müsste man wissen, welcher Pin der Taster ist.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Anfänger schrieb:
> frage mich gerade wie ich nur das mit dem zählen hinbekomme.
Stichwort: Flankenerkennung

Du merkst dir in jedem Zyklus den vorherigen Pinzustand und vergleichst 
den mit dem aktuellen Pinzustand. Wenn die ungleich sind, dann mußt du 
was tun: entweder die LED anmachen (wenn alt=1 und aktuell=0) oder die 
LED ausmachen und zählen (wenn alt=0 und aktuell=1).

Als Tipp:
mit den Tokens [ c] und [ /c] (ohne Leerzeichen) kommt hier im Forum 
sowas schönes Buntes raus:
1
#include <avr/io.h>
2
3
#define zaehler1    0x01   // WARUM HEISST DIESE BITMASKE "zaehler"?
4
#define LED1        0x04
5
6
unsigned int wert1 = 0;
7
unsigned int wert1min = 0;
8
9
int main(void)
10
{
11
DDRA &=~ (zaehler1);
12
DDRC |= LED1;
13
14
while(1)
15
{
16
   if(!(PINA & (zaehler1)))
17
   {
18
       PORTC |=(LED1);
19
       _delay_ms(1);
20
   }
21
   else
22
   {
23
      PORTC &=~(LED1);
24
      wert1++;
25
      wert1min++;
26
      while(!(PINA & (zaehler1)));
27
   }
28
}

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Michael Skropski schrieb:
> Wenn es ein 8bit Register ist, ist doch bestimmt der ganze Port drin
Deshalb Bitmanipulation

Denn im Code steht:
   if(!(PINA & (zaehler1)))
Das entspricht:
   if(!(PINA & 0x01))
und das frägt das Bit 0 im Pinregister ab.

von Anfänger (Gast)


Lesenswert?

Michael Skropski schrieb:
> Dann ist mein Beispiel also für den Eingang A0? ;) Wenn es ein 8bit
> Register ist, ist doch bestimmt der ganze Port drin und nicht nur ein
> Pin oder? Wenn ja, dann müsste man wissen, welcher Pin der Taster ist.

taster soll der zaehler1 sein

von Michael S. (rbs_phoenix)


Lesenswert?

aahhhh... achsoo.. dachte zaehler wär ein Zähler^^ hab den einen Beitrag 
garnicht gesehen..
also statt:
if(PINA==0 && zaehler==0){

muss es

char temp;
temp = PINA & 0x01;
if(temp==0 && zaehler==0){

sein, oder?

von Anfänger (Gast)


Lesenswert?

Michael Skropski schrieb:
> muss es
>
> char temp = PINA & 0x01;
> if(temp==0 && zaehler==0){
>
> sein, oder?

macht er nix bekomme den fehler bei den variablen zaehler1 und

../test.c:427: error: lvalue required as left operand of assignment

von Michael S. (rbs_phoenix)


Lesenswert?

Anfänger schrieb:
> macht er nix bekomme den fehler bei den variablen zaehler1 und

"Da macht er nix. Ich bekomme da den Fehler bei der Variablen zaehler1"
Ich habs mal editiert, weil die Dekleration und Zuweisung glaube 
getrennt sein muss..


Anfänger schrieb:
> ../test.c:427: error: lvalue required as left operand of assignment

a) woher soll hier jemand wissen, was Zeile 427 ist
b) Warum ist der Code so groß, wenn du eine LED man und ausmachen willst 
und dazu ein Zähler zählen willst?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Anfänger schrieb:
> bei den variablen zaehler1
Das ist keine Variable sondern ein per #define festgelegte Konstante mit 
dem Wert 1. Und damit ist das immer falsch: (zaehler==0)

Ich würde mal empfehlen, ein Grundlagenbuch zu C aufzuschlagen... :-/

von Anfänger (Gast)


Lesenswert?

wert1 muss alle 24h lang dann in einem EEPROM gespeichert werden
wert1min muss alle 24h als livestream ausgegeben werden.

die ganzen funktionen gehen einwandfrei doch nur das mit dem zählen 
klappt nicht.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Anfänger schrieb:
> die ganzen funktionen gehen einwandfrei doch nur das mit dem zählen
> klappt nicht.
Stichwort: Flankenerkennung

Wer sagt da: "du wiederholst dich"?   ;-)

von Anfänger (Gast)


Lesenswert?

if(!(PINA & (zaehler1)))
{
  PORTC |=(LED1);
  wert1++;
  wer1min++;
  while(!(PINA & (zaehler1)));
}
else
{
  PORTC &=~(LED1);
}

so ging das noch nur jetzt sollte es gerade anders rum gehen.
und ich bin gerade zu nervös dsa ganze jetzt in 2 Std auf die reihe zu 
bekommen

von Michael S. (rbs_phoenix)


Lesenswert?

Also naja.. bei mir gehts so und Compiler macht auch kein Fehler:
1
void main() {
2
     char zaehler=0, wert1=0, wert1min=0, temp;
3
     while(1){
4
           temp = PORTA & 0x01;                // Tastereingang filtern
5
           if(temp==0 && zaehler==0){          // Taster gedrückt, zaehler noch auf 0 -> Der erste durchlauf, wo der Taster gedrückt wurde
6
                      PORTB |= 0x01;           // LED An
7
                      zaehler=1;               // speichern, dass der Taster gedrückt wurde
8
           }
9
           if(temp==1 && zaehler==1){          // Taster losgelassen, zaehler noch auf 1 -> Der erste durchlauf, wo der Taster losgelassen wurde
10
                      PORTB &= 0xFE;           // LED Aus
11
                      zaehler=0;               // speichern, dass der Taster losgelassen wurde
12
                      wert1++;                 // beide Zähler hochzählen
13
                      wert1min++;
14
           }
15
      }
16
}

Ist zwar für n PIC aber abgesehen von PORTA (was ja PINA sein müsste), 
ist es ja dank C das gleiche.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Anfänger schrieb:
> dsa ganze jetzt in 2 Std auf die reihe zu bekommen
Ok also dann eben in 2 Minuten:
1
unsigned char alterpegel = 0, aktuellerpegel = 0;
2
3
while (1) {
4
  aktuellerpegel = PINA & 0x01;
5
  if (aktuellerpegel!=alterpegel) { // hat sich was geändert?
6
     if(!aktuellerpegel) {          // Low-Pegel am PINA.0 --> 
7
        PORTC |=(LED1);             // LED aus und zählen
8
        wert1++;
9
        wer1min++;
10
     }
11
     else {                         // High-Pegel am PINA.0 -->
12
        PORTC &=~(LED1);            // LED aus
13
     }
14
     alterpegel = aktuellerpegel;
15
  }
16
}


EDIT:
Michael Skropski schrieb:
> bei mir gehts so und Compiler macht auch kein Fehler:
Der Zähler ist kein Zähler!
Sondern eigentlich auch nur ein Merker für den letzten Pegel...

von Michael S. (rbs_phoenix)


Lesenswert?

Lothar Miller schrieb:
> Der Zähler ist kein Zähler!
> Sondern eigentlich auch nur ein Merker für den letzten Pegel...

Ja hast ja reicht^^. Habs einfach irgendwie übernommen. Jedenfalls 
gehts, hätte auch andere namen allgemein genommen. Aber naja, jeder wie 
er will.

edit: Dafür machst du laut den Kommentaren beide mal die LED aus :P

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Michael Skropski schrieb:
> Dafür machst du laut den Kommentaren beide mal die LED aus :P
Zum Glück weiß das der Compiler nicht...  ;-)

Oder:
> Dafür machst du laut den Kommentaren beide mal die LED aus :P
Energiesparen ist in... ;-)

von Anfänger (Gast)


Lesenswert?

so also es geht habe gerade die if und die while schleife abgeändert und 
siehe da mit erfolg und richtiger funktion! habe sie jetzt gerade auf 1 
gesetzt und nicht auf 0!

danke für die viele Hilfe, solangsam werde kapier ich es alles aber ich 
glaube das kostet noch alles viel Zeit bis es aus dem FF geht.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Anfänger schrieb:
> habe gerade die if ... schleife abgeändert
http://www.if-schleife.de

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.