Ausgabe an Port funktioniert nicht; Atmega32

OP #1313636
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
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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.