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.
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)))
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?
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.
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.
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"?
#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))); } } }
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...
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.
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.
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 | }
|
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.
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
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?
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
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?
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... :-/
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.
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"? ;-)
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
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.
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...
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
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... ;-)
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.