Ausgabe an Port funktioniert nicht; Atmega32

OP #1313636
Lesenswert?

hallo, ich habe einen Drehencoder am Atmega 32 angeschlossen und gebe 
diese auf dem Lcd auch aus. Am lcd kann man dann schön das Hoch bzw. 
Runterzählen sehen. jetzt habe ich an PB1 ne led, bei der man die 
Blinkgeschwindigkeit mit dem Drehencoder einstellen kann ( schnell - 
langsam ). Funktioniert auch alles prima, nur jetzt möchte ich, wenn ich 
einen bestimmten Bereich habe ( von 60 bis 30 ) einen Ausgang schalten 
PB2. Das will aber nich Klappen, die Led leuchtet durchgehend. Woran 
könnte das liegen???
Hier die Passage:
1
int main( void )
2
{
3
  DDRB = 0b00000110;
4
  PORTB=0;
5

6
  char buffer[20];
7

8
  int32_t val = 0;
9
 
10
  LEDS_DDR = 0xFF;
11
  encode_init();
12
  sei();
13
 
14
  lcd_init();
15
    lcd_clear();
16

17
  for(;;)
18
  {
19
    val += encode_read2();      // read a single step encoder
20
    LEDS = val;
21

22
  set_cursor(0,1);
23
    itoa (val, buffer, 10);
24
  strcat(buffer,"       ");
25
    lcd_string (buffer);
26

27
       PORTB ^=  0b00000010  ;  // Toggle PB1
28
        _delay_ms( val*50 );    // mit dem Drehgeber einstellbar Zahl x50  
29
                             
30

31
if (!(val <= 30) && !(val>= 60))    // im Breich 60 bis 30
32
    {
33
    PORTB=0b00000100;               //PB2 ein
34
    set_cursor(0,2);
35
      lcd_string( "On" );
36
    }
37

38
    
39
    else
40
    set_cursor(0,2);
41
      lcd_string("                ");
42
    PORTB=0b00000000;               //PB2 aus
43

44
  }
45
}

Also auch die Lcd ausgabe mit On in dem Breich und sonst nichts läuft.
gruß stefan
#1313641
Lesenswert?

Stefan Feismann schrieb:

> if (!(val <= 30) && !(val>= 60))    // im Breich 60 bis 30

Formulier das doch bitte kanonisch

  if ( (val > 30) && (val < 60))    // im Breich 60 bis 30

Dann braucht man nicht mit all den ! nachdenken, ob das so stimmen kann. 
Je mehr ! in einem Ausdruck enthalten sind, umso schwieriger wird es zu 
überprüfen, ob der Ausdruck auch wirklich das macht, was du willst. Nur 
allzuoft fällt man da ganz schön auf die Schnauze


>     {
>     PORTB=0b00000100;               //PB2 ein
>     set_cursor(0,2);
>       lcd_string( "On" );
>     }
>
>
>     else
>     set_cursor(0,2);
>       lcd_string("                ");
>     PORTB=0b00000000;               //PB2 aus
>

Wo sind denn hier die Klammern rund um den else-Block?

Mit einer vernünftigen, konsistenten Einrückstategie im Source Code wäre 
dir das nicht passiert! Code der sich optisch an gewisse Regeln hält, 
ist nicht nur Selbstzweck sondern auch eine Hilfe bei der Fehlersuche.
#1316075
Lesenswert?

Hallo,

einfache Problemlösung: wenn man einen Block beginnt, egal, ob if, else, 
while oder so:
sofort das Klammernpaar setzen und dann den Inhalt dazwischen schreiben.
Wenn man sich daran gewöhnt hat, geht das vollautomatisch und erspart 
viel suchen.

Gruß aus Berlin
Michael

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