Forum: Mikrocontroller und Digitale Elektronik Finde meinen Fehler einfach nicht


von Klaus (klaus_z)


Angehängte Dateien:

Lesenswert?

Hallo,

mein Programm soll einfach nur die LEDs von innen nach außen mit einem 
Schieberegister zum Leuchten bringen. In Visual Studio hat es auch ohne 
Probleme mit cout << "0"; und cout << "1" funktioniert (siehe Anhang). 
Also mein Programm in der IDE ist so gut wie identisch, unterschied ist 
halt nur das setzen der einzelnen Bits an PORTD. Ich versuche halt die 
Werte mit dem Umrechnen von Dezimal in Binär arbeiten zu lassen. Also 
irgendwo habe ich dort einen Fehler, den ich nicht sehe, bin für jede 
Hilfe dankbar.
1
#define F_CPU 8000000UL
2
#include <avr/io.h>
3
#include <util/delay.h>
4
5
//74HC595
6
#define sendValue PIND2  //Output zum Übergeben von High und Low ans Schieberegister, geht an Pin 14 Schieberegister
7
#define saveValue PIND0  // SHCP PIN11 am 74HC595. Zum schieben und eingeben 1 Bits im Shiftregister
8
#define saveData PIND1  // STCP PIN12 am 74HC595. Zum Ausgeben 1 Bytes.
9
const uint8_t delay = 200;
10
11
int main(void)
12
{
13
  uint8_t ausgabe[4] = {24, 36, 66, 129};//{00011000, 00100100, 01000010, 10000001}
14
  uint8_t zahl, rest;
15
  DDRD |= 0x07; //initialiseren des PORTDs als Ausgang an PD0 bis PD2
16
  PORTD |= (1<<sendValue);//PIN auf high
17
18
    while (1); 
19
    {
20
    for(uint8_t i = 0; i < 4; i++)//Erstmal möchte ich nur 4 Werte ausgeben ans SR
21
    {
22
      zahl = ausgabe[i]; //hier speicher ich den iten Wert in zahl
23
      for (uint8_t j = 0; j < 8; j++)
24
      {
25
        rest = zahl%2; //zahl durch 2 geteilt sollte entweder 1 oder 0 als Rest ergeben
26
        if(rest==1) //wenn 1 dann 1 ins Schieberegister schreiben
27
        {
28
          PORTD |= (1<<saveValue);
29
          PORTD &= ~(1<<saveValue);
30
        }
31
        else //ansonsten 0
32
        {
33
          PORTD &= ~(1<<sendValue);
34
          PORTD |= (1<<saveValue); 
35
          PORTD &= ~(1<<saveValue);
36
          PORTD |= (1<<sendValue); 
37
        }      
38
        zahl /= 2;  //Die Zahl wird durch zwei geteilt, bis die For-Schleife 8mal gelaufen ist
39
      }
40
      PORTD |= (1<<saveData); //Daten werden am Schieberegister ausgegeben
41
      _delay_ms(delay);      //mit Delay kann ich es sehen
42
      PORTD &= ~(1<<saveData);
43
    }
44
    }
45
}

: Bearbeitet durch User
von Foobar (asdfasd)


Lesenswert?

Es wäre nicht schlecht, wenn du sagen würdest, was nicht geht.

Das Programm ist zwar ziemlich verkorkst, sollte aber funktionieren. 
Ein Problem ist der initiale Zustand der 3 Signale - du setzt nur das 
Datenbit auf 1, die beiden Clk sind undefiniert.

Ich vermute aber eher, dass die restlichen Signale (/OE=low und 
/SRCLR=high) nicht richtig gesetzt sind.

: Bearbeitet durch User
von Walter T. (nicolas)


Lesenswert?

Es wird vermutlich gar nichts gehen, weil die "while(1);-Schleife" nur 
einmal ausgeführt wird.

: Bearbeitet durch User
von Thomas W. (Gast)


Lesenswert?

kleines Semikolon, ganz gross...

Gruesse

Th.

von Dieter D. (Firma: Hobbytheoretiker) (dieter_1234)


Lesenswert?

Lasst das mal besser ChatGPT machen und lösen. ;o)

von Rainer W. (rawi)


Lesenswert?

Klaus schrieb:
> Also irgendwo habe ich dort einen Fehler, den ich nicht sehe, bin für jede
> Hilfe dankbar.

Wenn du in deiner IDE den Debugger benutzt und das Programm Schritt für 
Schritt ablaufen lässt, sollte sofort klar werden, wo der Programmablauf 
nicht deiner Erwartung entspricht.

von Falk B. (falk)


Lesenswert?

Klaus schrieb:
> while (1);
>     {

So wird das nix.

von Falk B. (falk)


Lesenswert?

Walter T. schrieb:
> Es wird vermutlich gar nichts gehen, weil die "while(1);-Schleife" nur
> einmal ausgeführt wird.

Nö. Die wird DAUERND ausgeführt!

von Alexander (alecxs)


Lesenswert?

psst... er wollte doch keine Hilfe und von selbst draufkommen

von Klaus H. (hildek)


Lesenswert?

Falk B. schrieb:
> Nö. Die wird DAUERND ausgeführt!

Richtig, uns sonst nichts mehr.
@Klaus: falls der Groschen noch nicht gefallen ist: das Semikolon muss 
weg!

von Klaus (klaus_z)


Lesenswert?

Oh man. Habe echt lange gucken müssen, bis ich den Fehler gesehen habe. 
Es sind immer so blöde kleine Fehler.

Auf jedenfall danke für die Hilfe, ich hätte jetzt noch Stundenlang 
draufschauen können und es vielleicht nicht gefunden, aber nächstes mal 
mache ich es, wie es rawi geschrieben hat. Also:

Rainer W. schrieb:
> Wenn du in deiner IDE den Debugger benutzt und das Programm Schritt für
> Schritt ablaufen lässt, sollte sofort klar werden, wo der Programmablauf
> nicht deiner Erwartung entspricht.

von Stefan F. (Gast)


Angehängte Dateien:

Lesenswert?

Versuche mal eine andere IDE. Qt Creator warnt mich z.B. vor solchen 
Dummheiten.

http://stefanfrings.de/avr_ide/index.html#qtcreator

von Rolf M. (rmagnus)


Lesenswert?

˙ɟ uɐɟǝʇs schrieb:
> Versuche mal eine andere IDE. Qt Creator warnt mich z.B. vor solchen
> Dummheiten.

Generell ist etwas LSP-fähiges im Zusamnenspiel mit z.B. clangd sinnvoll 
Qt Creator kann das inzwischen wohl optional tun.

Beitrag #7476298 wurde von einem Moderator gelöscht.
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.