Forum: Mikrocontroller und Digitale Elektronik LED Aneige 7x7 mit GCC


von Andreas B. (Firma: keine) (andy123)


Angehängte Dateien:

Lesenswert?

Hallo, ich bin ziemlicher neuling hier auf dem Gebiet und möchte mit 
einer 7x7 Led-Anzeige das ABC anzeigen. Das ganze hatte ich vor mit 
Bitmasken zu machen und auch schon den code geschrieben der 
wahscheinlich mit fehlern über häuft ist. Fakt ist beim Builden sagt er 
das es so nich klappt, ich weiß aber nicht was ich ändern muss dann es 
funktioniert.
Ich habe den code nochmal als screeshot hochgeladen weil er hier total 
durcheinander ist.

#include <avr/io.h>

int main (void) {
   int z=10000;
   int derBuchstabe=0;
   DDRC  = 0xff;
   DDRD = 0xff;
   PORTC = (0<<PC0) & (0<<PC1) & (0<<PC2) & (0<<PC3) & (0<<PC4) & 
(0<<PC5) & (0<<PC6) & (0<<PC7);
   PORTD = (0<<PD0) & (0<<PD1) & (0<<PD2) & (0<<PD3) & (0<<PD4) & 
(0<<PC5) & (0<<PD6) & (0<<PD7);
   uint8_t r16;
   uint8_t r17;

   if(derBuchstabe==0){
     while(z<0){
       PORTC=0b00011000 & PORTD=0b01000000; PORTC =0b00000000 & PORTD 
=0b00000000;
       PORTC=0b00100010 & PORTD=0b00100000; PORTC =0b00000000 & PORTD 
=0b00000000;
       PORTC=0b01000001 & PORTD=0b00010000; PORTC =0b00000000 & PORTD 
=0b00000000;
       PORTC=0b01111111 & PORTD=0b00001000; PORTC =0b00000000 & PORTD 
=0b00000000;
       PORTC=0b01000001 & PORTD=0b00000100; PORTC =0b00000000 & PORTD 
=0b00000000;
       PORTC=0b01000001 & PORTD=0b00000010; PORTC =0b00000000 & PORTD 
=0b00000000;
       PORTC=0b01000001 & PORTD=0b00000001; PORTC =0b00000000 & PORTD 
=0b00000000;

       z=z-1;
       if(z==1){
        derBuchstabe=derBuchstabe+1;
         }
       }
  }


   if(derBuchstabe==1){
       z=10000;
    while(z<0){

        PORTC =0b01111000 & PORTD =0b01000000; PORTC =0b00000000 & PORTD 
=0b00000000;
      PORTC =0b01000010 & PORTD =0b00100000; PORTC =0b00000000 & PORTD 
=0b00000000;
      PORTC =0b01000001 & PORTD =0b00010000; PORTC =0b00000000 & PORTD 
=0b00000000;
      PORTC =0b01111111 & PORTD =0b00001000; PORTC =0b00000000 & PORTD 
=0b00000000;
      PORTC =0b01000001 & PORTD =0b00000100; PORTC =0b00000000 & PORTD 
=0b00000000;
      PORTC =0b01000010 & PORTD =0b00000010; PORTC =0b00000000 & PORTD 
=0b00000000;
      PORTC =0b01111100 & PORTD =0b00000001; PORTC =0b00000000 & PORTD 
=0b00000000;
      z=z+1;
      if(z==1){
        derBuchstabe=derBuchstabe+1;
      }
    }
  }


Danke schonma im vorraus

von Falk B. (falk)


Lesenswert?

@  Andreas Berger (Firma: keine) (andy123)

>      code.png
>      85,4 KB, 8 Downloads

Wie kommt man auf die Idee, Quelltext als Screenshot zu posten?

Wichtige Regeln - erst lesen, dann posten!

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

Lies mal was über Netiquette.

>Hallo, ich bin ziemlicher neuling hier auf dem Gebiet und möchte mit
>einer 7x7 Led-Anzeige das ABC anzeigen. Das ganze hatte ich vor mit
>Bitmasken zu machen und auch schon den code geschrieben

Der nicht viel taugt. Lies ein Grundlagenbuch über C, und vor allem was 
über Arrays.

>Ich habe den code nochmal als screeshot hochgeladen weil er hier total
>durcheinander ist.

Optimale Vorraussetzungen zum programmieren. Wenn du so programmierst 
wie du hier Beträge schreibst, solltest du dir ein anderes Hobby suchen.

MFG
Falk

von irgendjemand (Gast)


Lesenswert?

Hallo Andreas,

so sieht der Quelltext auch im Forum gut aus:
1
#include <avr/io.h>
2
3
int main (void)
4
{
5
  int z=10000;
6
  int derBuchstabe=0;
7
  DDRC  = 0xff;
8
  DDRD = 0xff;
9
  PORTC = (0<<PC0) & (0<<PC1) & (0<<PC2) & (0<<PC3) & (0<<PC4) & (0<<PC5) & (0<<PC6) & (0<<PC7);
10
  PORTD = (0<<PD0) & (0<<PD1) & (0<<PD2) & (0<<PD3) & (0<<PD4) & (0<<PC5) & (0<<PD6) & (0<<PD7);
11
  uint8_t r16;
12
  uint8_t r17;
13
14
  if(derBuchstabe==0)
15
  {
16
    while(z<0)
17
    {
18
      PORTC=0b00011000 & PORTD=0b01000000; PORTC =0b00000000 & PORTD=0b00000000;
19
      PORTC=0b00100010 & PORTD=0b00100000; PORTC =0b00000000 & PORTD=0b00000000;
20
      PORTC=0b01000001 & PORTD=0b00010000; PORTC =0b00000000 & PORTD=0b00000000;
21
      PORTC=0b01111111 & PORTD=0b00001000; PORTC =0b00000000 & PORTD=0b00000000;
22
      PORTC=0b01000001 & PORTD=0b00000100; PORTC =0b00000000 & PORTD=0b00000000;
23
      PORTC=0b01000001 & PORTD=0b00000010; PORTC =0b00000000 & PORTD=0b00000000;
24
      PORTC=0b01000001 & PORTD=0b00000001; PORTC =0b00000000 & PORTD=0b00000000;
25
26
      z=z-1;
27
      if(z==1)
28
      {
29
        derBuchstabe=derBuchstabe+1;
30
      }
31
    }
32
  }
33
34
  if(derBuchstabe==1)
35
  {
36
    z=10000;
37
    while(z<0)
38
    {
39
      PORTC =0b01111000 & PORTD =0b01000000; PORTC =0b00000000 & PORTD=0b00000000;
40
      PORTC =0b01000010 & PORTD =0b00100000; PORTC =0b00000000 & PORTD=0b00000000;
41
      PORTC =0b01000001 & PORTD =0b00010000; PORTC =0b00000000 & PORTD=0b00000000;
42
      PORTC =0b01111111 & PORTD =0b00001000; PORTC =0b00000000 & PORTD=0b00000000;
43
      PORTC =0b01000001 & PORTD =0b00000100; PORTC =0b00000000 & PORTD=0b00000000;
44
      PORTC =0b01000010 & PORTD =0b00000010; PORTC =0b00000000 & PORTD=0b00000000;
45
      PORTC =0b01111100 & PORTD =0b00000001; PORTC =0b00000000 & PORTD=0b00000000;
46
      z=z+1;
47
      if(z==1)
48
      {
49
        derBuchstabe=derBuchstabe+1;
50
      }
51
    }
52
  }

Es wäre sehr hilfreich, wenn du uns mal sagen würdest, welcher Fehler 
denn ausgegeben wird. Welche Zeile usw. Glaskugeln haben wir hier leider 
keine!

Dir fehlt eine schließende Klammer!

Mal davon abgesehen, dass deine Anweisungen wie z.B.
1
PORTC=0b00011000 & PORTD=0b01000000; PORTC =0b00000000 & PORTD=0b00000000;
 nicht viel Sinn machen. Was willst du damit bezwecken?

Ein Schaltplan wäre auch sehr hilfreich!

Grüße
Thomas

von Andreas B. (Firma: keine) (andy123)


Angehängte Dateien:

Lesenswert?

../LED.c:15: error: lvalue required as left operand of assignment
Das ist der Fehler der die ganze Zeit aufkommt.

PORTD=0b00011000 & PORTC=0b01000000; PORTD =0b00000000 
&PORTC=0b00000000;
Ups habe eben grade bemerkt das ich x und y vertauscht habe also PortC = 
Y-Achse und D = X-Achse


PORTD=0b00011000 & PORTC=0b01000000; PORTD =0b00000000 
&PORTC=0b00000000;
Hiermit will ich das PortD Pin 3 und 4 anschaltet und Port C pin 7 
anschaltet und somit die Leds leuchten, am Ende werden sie wieder 
ausgeschaltet und die nächste Reihe ist dran. Das ganze soll dann ganz 
schnell wiederholt werden damit es so ausieht als würden die Leds 
leuchten

von Magnetus (Gast)


Lesenswert?

....ich glaube mir wird gerade übel....

von Falk B. (falk)


Lesenswert?

Lies auch mal was über Bitmanipulation und eine LED-Matrix.

von irgendjemand (Gast)


Lesenswert?

wie Falk schon sagt. Ließ dir mal das Thema Bitmanipulation durch. Auch 
hilfreich: In welcher Reihenfolge werden Operanten aufgelöst!
Was du hier machst ist gemilde ausgedrückt Schrott.
Wenn du um deine Zuweisung jeweils eine Klammer setzt, dann sollte es 
klappen. Ist aber immer noch Schrott.
Du weist dem PortC und D einen neuen Wert zu. Das Ergebnis der 
Zuweisung, also der Wert selbst, wird jeweils und-verknüpft und das 
Ergebnis verworfen. Der Optimizer wirds zum glück schon richten.

Was aber immer noch nicht dein Problem löst, dass du nur einen Impuls 
von ein paar µs erzeugst. Denn du schaltetst ein paar Takte weiter deine 
LED wieder aus. Da sollte zumindest mal ein sleep zwischenrein. Oder du 
pulst deine LED mit so viel Strom, dass die bei der kurzen Zeit schon 
leuchten(was bei deiner Schaltung sicher nicht der Fall ist).

Probiers mal so:
1
PORTD=0b00011000;
2
PORTC=0b01000000;
3
_sleep_ms(1);
4
PORTD=0b00000000;
5
PORTC=0b00000000;

Das sollte zumindest schon mal ein kleines Ergebnis bringen.
Vorher natürlich die delay.h includieren!

Grüße
Thomas

von irgendjemand (Gast)


Lesenswert?

bzw. du brauchst die LED garnicht auszuschalten, da du sie ja eh mit den 
nächsten Befehlen neu setzt!

von Andreas B. (Firma: keine) (andy123)


Lesenswert?

Ok vielen dank für deine Hilfe jetzt klappt das ganze schon besser sind 
keine Fehler laut build mehr drin Oo. Ich werde mich nochmal melden 
falls ich nochmal deine Hilfe brauch.... tausend Dank.

von Falk B. (falk)


Lesenswert?

@  Andreas Berger (Firma: keine) (andy123)

>Ich werde mich nochmal melden falls ich nochmal deine Hilfe brauch....

ist das eine Drohung? 8-0

von Peter D. (peda)


Lesenswert?

Ich würde erstmal mit den Grundlagen anfangen.
Wenn Du multiplexen willst, sind erstmal Timerinterrupt und Arrays zu 
beherrschen.

Der Timerinterrupt gibt Dir auf einfachste Weise konstante 
Leuchtintervalle der Spalten. Das schaffst Du nie in der Mainloop bzw. 
es ist extrem umständlich.

Und Arrays (im Flash) brauchst Du, um die einzelnen Bitmuster zu 
erzeugen.
Sich mit einzelnen Ladebefehlen abzugeben ist dagegen die reinste 
Quälerei und extrem fehlerträchtig (Monster-Spaghetticode).

Programmierleistung wird nicht nach Codegröße bezahlt, sondern nach 
Funktion und Wartbarkeit.
Es wäre also schade, wenn Du erstmal mit Zeilenschinden anfängst und 
dann später richtig programmieren lernst.


Peter

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.