Forum: Compiler & IDEs Ausgabe an Port funktioniert nicht; Atmega32


von Stefan F. (feissy)


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

von Karl H. (kbuchegg)


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.

von Stefan F. (feissy)


Lesenswert?

;-) ok danke ich werd mir das dick hinter die Ohren schreiben sowas 
hatte ich nämlich schon öfters mit den Klammern
gruß

von Michael U. (amiga)


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

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.