mikrocontroller.net

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


Autor: Stefan F. (feissy)
Datum:

Bewertung
0 lesenswert
nicht 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:
int main( void )
{
  DDRB = 0b00000110;
  PORTB=0;

  char buffer[20];

  int32_t val = 0;
 
  LEDS_DDR = 0xFF;
  encode_init();
  sei();
 
  lcd_init();
    lcd_clear();

  for(;;)
  {
    val += encode_read2();      // read a single step encoder
    LEDS = val;

  set_cursor(0,1);
    itoa (val, buffer, 10);
  strcat(buffer,"       ");
    lcd_string (buffer);

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

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

    
    else
    set_cursor(0,2);
      lcd_string("                ");
    PORTB=0b00000000;               //PB2 aus

  }
}


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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan F. (feissy)
Datum:

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

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.