mikrocontroller.net

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


Autor: Andreas Berger (Firma: keine) (andy123)
Datum:
Angehängte Dateien:

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

Autor: Falk Brunner (falk)
Datum:

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

Autor: irgendjemand (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Andreas,

so sieht der Quelltext auch im Forum gut aus:
#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;
      }
    }
  }

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.
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

Autor: Andreas Berger (Firma: keine) (andy123)
Datum:
Angehängte Dateien:

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

Autor: Magnetus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
....ich glaube mir wird gerade übel....

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lies auch mal was über Bitmanipulation und eine LED-Matrix.

Autor: irgendjemand (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
PORTD=0b00011000;
PORTC=0b01000000;
_sleep_ms(1);
PORTD=0b00000000;
PORTC=0b00000000;

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

Grüße
Thomas

Autor: irgendjemand (Gast)
Datum:

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

Autor: Andreas Berger (Firma: keine) (andy123)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Andreas Berger (Firma: keine) (andy123)

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

ist das eine Drohung? 8-0

Autor: Peter Dannegger (peda)
Datum:

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

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.