MAIN Problem

Gast #2244787
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.
Gast #2244794
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.
Gast #2244795
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"?
Gast #2244807
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)));
}
}
}
Moderator (Firma: Titel) Persönliche Seite #2244808
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...
Gast #2244814
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.
#2244817
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.
Moderator (Firma: Titel) Persönliche Seite #2244824
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
}
#2244865
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?
Gast #2244874
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.
Gast #2244892
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
#2244909
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.
Moderator (Firma: Titel) Persönliche Seite #2244920
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...
Gast #2245195
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren