mikrocontroller.net

Forum: Compiler & IDEs AtMega8 C-Array-Problem


Autor: Claus Wallburg (Firma: keine) (klausi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo liebe User-Gemeinde

ich habe mit dem nachfolgenden Code:
#include <avr/io.h>
#include <inttypes.h>
#include <stdlib.h>
#include <string.h>
#include "tastatur.h" // beinhaltet _delay_msXX
#include "lcd.h"
#define delay_us(us) _delay_loop_2(((F_CPU/4000)*us)(1000)
int j;
int main (void) {
int tab[] ={-12,15,-20};
int *ptab;
int i;
int buf[25];
DDRC |= (1<<PC0) | (1<<PC1); {
lcd_init(LCD_DISP_ON);
lcd_gotoxy(0,0);
lcd_puts("EING:-12,15,-20");

 for(;;)
   
 if (j >0){

  for(i=0;i<=2;i++){
  ptab =&tab[i];
   PORTC = PORTC | (1<<PC1);
    for(j=*(ptab);j>=0;j--) {
 {
   PORTC |= (1<<PC1);
    PORTC = PINC ^(1<<PC0);
     _delay_ms(1000);
 }
  itoa(j,buf,10);
  lcd_gotoxy(0,1);
  lcd_puts(buf);
   _delay_ms(1000);
   }
  }
 }
  else

   for(i=0;i<=2;i++){
    ptab =&tab[i];
     PORTC = PORTC & ~ (1<<PC1);
      for(j=*(ptab);j<=0;j++){
   {
     PORTC = PINC ^(1<<PC0);
    _delay_ms(1000);
   }
 itoa(j,buf,10);
 lcd_gotoxy(0,1);
 lcd_puts(buf);
 _delay_ms(1000);
 
        }
       }
   }
  }


es sollen die Zahlen im Array in der richtigen Reihenfolge ausgegeben 
werden. Zudem sollen je nach Vorzeichen eine Led leuchten +/- und eine 
andere Led bei jeder Dekrementierung toggeln.

Frage:
Warum gibt der µC die Zahlen -12;15;-20 nicht in der richtigen 
Reihenfolge aus?
je nach if-Abfrage gint er zuerst die positive Zahl und dann die zwei 
negativen Zahlen hintereinander auf dem Display aus.

Wo liegt der Denkfehler?? Ums gleich vorweg zunehmen ich besitze 2 
C-Bücher und hab den Fehler nicht gefunden!
Ich seh den Wald vor lauter Bäumen nicht mehr, bitte darum um eure 
Hilfe!!!

mfg

klausi

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Warum gibt der µC die Zahlen -12;15;-20 nicht in der richtigen
Reihenfolge aus?"

Jo, was heißt richtig?
Code ist schlecht lesbar. Kommentare? Struktur? Lesbarkeit erhöhen?

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

Bewertung
0 lesenswert
nicht lesenswert
definiere 'richtige Reihenfolge'

Aber ich denke, ich hab rausgelesen, dass die richtige Reihenfolge ganz 
einfach die Abfolge im Array ist. Zuerst dachte ich nämlich do wolltes 
das irgendwie sortiert haben.

Zum Code:
jetzt lehnst du dich erst mal zurück und überarbeitest den Code
Einrückungen richtigstellen, ev. überlegen was in einer eigenen Funktion 
Sinn machen könnte, den Pointer rausschmeissen (den braucht in 
Wirklichkeit nämlich kein Mensch) und dann ...

darüber nachdenken, ob der Unterschied zwischen negativen und positiven 
Zahlen wirklich so gravierend ist, dass man da den kompletten Code mehr 
oder weniger duplizieren muss. Eine simple Beobachtung: Wenn eine Zahl 
negativ ist, dann kann man das mit einem if registrieren, die Zahl ganz 
einfach negieren und hat dann in weiterer Folge auf jeden Fall immer 
eine positive Zahl, die man behandeln kann.


   if( Zahl ist negativ )
     Led für Minus einschalten; Led für Plus aus
     Zahl = -Zahl
   else
     Led für Plus einschalten; Led für Minus aus

   for( k = 0; k < Zahl; ++i )
     generiere einen Puls

Und schon schrumpft dein Programm um mindestens 1/3 seiner Größe. Und 
kleinere Programme bedeuten auch, dass man nicht so leicht den Überblick 
verliert.


Und wenn du das hast, und dein Programm funktioniert, dann überlegst du 
dir mal, was du hier ...
lcd_puts("EING:-12,15,-20");

 for(;;)
   
 if (j >0){

eigentlich getestet hast und welchen Wert j an dieser Stelle überhaupt 
hatte

Autor: Claus Wallburg (Firma: keine) (klausi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnellen Antworten!

Hab das Programm jetzt zum laufen bekommen!!

Hab

for(i=0;i<=2;i++){
  ptab =&tab[i];

zwischen
for(;;)
   
 if (j >0){
eingefügt und bei der if und else Funktion rausgenommen! Hatte auch noch 
eine geschweifte Klamme bei else vergessen! nachdem ich das geändert 
hatte lief das Programm wie gewollt!
Die "richtige Reihenfolge" ist die Reihenfolge im Array!

klausi

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.