Probleme mit einfachem C-Code

OP #3284658
Lesenswert?

Hallo,

ich versuche gerade, in Abhängigkeit von verstrichener Zeit etwas 
auszuführen und scheitere gerade an folgendem Code (so weit wie möglich 
reduziert, sodass sich momentan kein Sinn ergibt):

Das Ergebnis: LEDs an PORTB leuchten sehr schwach
Erwartet: Die LEDs sind aus
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include <stdlib.h>
4
#include <stdint.h>
5
#include <avr/interrupt.h>
6

7
uint16_t cnt = 0;
8
volatile int minuten = 0;
9

10
int main(void) {
11
  DDRB = 0xff;
12
  PORTB = 0xff;
13

14

15
  DDRC = 0x00;
16
  PORTC = 0xff;
17
  
18
  PORTB = 0x00;
19
  while(1) {
20
    if(PINC & (1<<PINC4))
21
      minuten = ((minuten / 15)+1)*15;
22
  }
23

24
  return 0;
25
}
26

27
ISR (TIMER0_OVF_vect) {
28
  cnt++;
29
  if(cnt == 931) {
30
    cnt = 0;
31
    //1 Minute verstrichen
32
    minuten++;
33
  }
34
}

Wenn ich die Zeile
1
minuten = ((minuten / 15)+1)*15;
auskommentiere, funktioniert es wie erwartet.

Was mache ich falsch?
#3284669
Lesenswert?

Also Du machst die erst mal die Variale "minuten" kaputt.
Ich schätze mal der Wert wird immer auf 15 gesetzt.
Allerdings ist hier keine Rückwirkung auf die Pins zu sehen.
Ist das die koplette Source?
Meldet der Compiler keinen Fehler, wenn Du die Zeile auskommentierst, 
weil dem IF was fehlt?
OP #3284680
Lesenswert?

Der Code sollte die LEDs durch die Zeile
PORTB = 0x00
ausschalten und dann in der Endlosschleife auf einen Tastendruck an PINC 
4 warten und entsprechend die Variable minuten hochzählen. (Das 
Timer-Zeug hätte ich natürlich auch noch weglassen können)

Und was er wirklich macht, weiß ich nicht ;).
Gast #3284692
Lesenswert?

Abgesehen, daß du deine Variable "minuten" immer wieder nur auf 15 
setzt, hat das mit dem PORTB überhaupt nichts zu tun.

minuten:
im Timer incrementierst du sie (z.B. von 15 auf 16), dann kommt deine 
Zeile
1
minuten = ((minuten / 15)+1)*15;
und setzt sie wieder auf 15. Nach einer Minute kommt wieder der Timer 
dran, setzt sie wieder auf 16 und so weiter...

Aber das ist ja nicht die Frage. Was hat das alles mit den PORTs zu tun?
Nach der Zeile
1
PORTB = 0x00;
wird der PORTB nie wieder angefaßt.

Ich würde jetzt erstmal die gesamte Verdrahtung überprüfen.
Das Auskommentieren der Zeile hat doch keinen Einfluß auf PORTB...
#3284698
Lesenswert?

ich schrieb:
> Das Auskommentieren der Zeile hat doch keinen Einfluß auf PORTB...

Es sei denn, dass das Auskommentieren dazu führt, dass der Controller 
kontinuierlich in einen Reset geht. Dann flackert die halt sehr schnell.

Probier doch mal das aus
1
while(1) {
2
    if(PINC & (1<<PINC4)) {
3
      minuten = ((minuten / 15)+1)*15;
4
    }
5
    minuten = minuten;
6
  }
und dann dies
1
while(1) {
2
    if(PINC & (1<<PINC4)) {
3
//      minuten = ((minuten / 15)+1)*15;
4
    }
5
    minuten = minuten;
6
  }
#3284700
Lesenswert?

Ich setz mal voraus, das Du am PORTC4 einen Widerstand nach Masse hast 
und durch drücken der Taste der Pin auf high gehen soll.
Wenn da kein Massewiderstand ist, dann ist PINC4 immer high, weil Du 
durch PORTC=0xFF den internen Pullup aktiviert hast.
Und wenn PINC4 high ist, dann werden die Minuten mit jeden 
Schleifendurchgang um 15 erhöht.
Das erklärt aber nicht dein LED-Problem. grübel
OP #3284703
Lesenswert?

1
minuten = ((minuten / 15)+1)*15;
Wenn minuten jetzt 16 ist, dann ist doch
minuten = ((16 / 15) +1)*15 = (1+1)*15 = 30;
oder überseh ich schon wieder irgendwas?

Ich habe festgestellt, dass es scheinbar mit dem Schlüsselwort 
"volatile" zusammenhängt, denn wenn ich dieses entferne, so funktioniert 
es wie erwartet. Genauer: Wenn ich in der while-Schleife eine 
volatile-Variable verändere, geht es nicht mehr.

Nur warum nicht??
OP #3284706
Lesenswert?

Werner A. schrieb:
> Probier doch mal das auswhile(1) {
>     if(PINC & (1<<PINC4)) {
>       minuten = ((minuten / 15)+1)*15;
>     }
>     minuten = minuten;
>   }
> und dann dieswhile(1) {
>     if(PINC & (1<<PINC4)) {
> //      minuten = ((minuten / 15)+1)*15;
>     }
>     minuten = minuten;
>   }

Erste Variante: LEDs leuchten schwach.
Zweite Variante: LEDs sind aus.

Erste Variante mit minuten nicht als volatile deklariert: LEDs sind aus.

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