Forum: Mikrocontroller und Digitale Elektronik AVR C array Programmierung wo liegt der Fehler?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Johannes M. (jojo20)


Bewertung
-2 lesenswert
nicht lesenswert
Hallo,

ich experimentiere gerade mit einem HUB75 Panel 32x64 LEDS an einem 
ATMEGA644p

Dazu habe ich folgende Funktion zum schreiben des Display geschrieben:

volatile uint64_t 
R_displayline[32]={0b111111111111111111111111111111111111111111111111111 
1111111111111};  //Array für displaydaten R
volatile uint64_t G_displayline[32]; //Array für displaydaten G
volatile uint64_t B_displayline[32]; //Array für displaydaten B


void write_display()
{



  uint64_t R1_temp;
  uint64_t G1_temp;
  uint64_t B1_temp;

  B_displayline[1]=0b11111111111111111111111111111111111111111111111111111 
11111111111;

  for(uint8_t i=0;i<16;i++)  //16 Zeilen x 2 schreiben
    {
      //LINE=i;
      //LINE<< 2; //Passend für PORTA 2 nach links schieben
      //PORTA |= LINE; //Line schreiben
      switch(i)
      {
        case 0:
        PORTA=0b00000000;
        break;
        case 1:
        PORTA=0b00000100;
        break;
        case 2:
        PORTA=0b00001000;
        break;
        case 3:
        PORTA=0b00001100;
        break;
        case 4:
        PORTA=0b00010000;
        break;
        case 5:
        PORTA=0b00010100;
        break;
        case 6:
        PORTA=0b00011000;
        break;
        case 7:
        PORTA=0b00011100;
        break;
        case 8:
        PORTA=0b00100000;
        break;
        case 9:
        PORTA=0b00100100;
        break;
        case 10:
        PORTA=0b00101000;
        break;
        case 11:
        PORTA=0b00101100;
        break;
        case 12:
        PORTA=0b00110000;
        break;
        case 13:
        PORTA=0b00110100;
        break;
        case 14:
        PORTA=0b00111000;
        break;
        case 15:
        PORTA=0b00111100;
        break;
      }

      R1_temp=0b10000010000000000000000000000000000000000000000000000000000000 
01 
G1_temp=0b01000010000000000000000000000000000000000000000000000000000000 
01;
      B1_temp=B_displayline[i];

      for(uint8_t row=0;row<64;row++)
        {
          if (R1_temp & 0x1){
            PORTD |= (1<<R1);}
            else{
            PORTD &= ~ (1<<R1);
            }
            R1_temp = R1_temp >> 1;

          if (G1_temp & 0x1){
            PORTC |=(1<<G1);}
            else{
            PORTC &= ~ (1<<G1);
            }
            G1_temp = G1_temp >> 1;

          if (B1_temp & 0x1){
            PORTC |= (1<<B1);}
            else{
            PORTC &= ~(1<<B1);
            }
          B1_temp = B1_temp >> 1;

          PORTA &= ~(1<<R2); //obere Hälfte
          PORTD &= ~(1<<G2);
          PORTD |=(1<<B2);

          //Clock Signal erzeugen
          PORTC |= (1<<CLK);
          _delay_us(0.1);
          PORTC &= ~(1<<CLK);
        }
        //Ein"latchen" der Reihe
        PORTC |= (1<<PC5);
        _delay_us(0.1);
        PORTC &= ~(1<<PC5);
    }
    PORTC |=(1<<PC3);
    _delay_us(0.1);
    //Output Enable =1
    PORTC &= ~(1<<OE);
}

Leider habe ich in B_displayline[1] bzw in B_temp am ende nicht die oben 
gesetzte 
B_displayline[1]=0b11111111111111111111111111111111111111111111111111111 
11111111111;  drin.

Wo liegt hier der Fehler? Ich hab mir die C Doku öfters angeschaut und 
es müsste alles passen, über welchen Fallstrick bin ich hier gestolpert?

von M. K. (sylaina)


Bewertung
0 lesenswert
nicht lesenswert
Johannes M. schrieb:
> volatile uint64_t
> R_displayline[32]={0b111111111111111111111111111111111111111111111111111
> 1111111111111};

Hihihi, ich frag mal ins Blaue: Was glaubst du, macht diese Zeile?

von Arduino Fanboy D. (ufuf)


Bewertung
-2 lesenswert
nicht lesenswert
Ich weiß es!

von Johannes M. (jojo20)


Bewertung
0 lesenswert
nicht lesenswert
Diese Zeile sollte alle uint64_t Werte des Array mit 0b111... 
initalisieren

von Arduino Fanboy D. (ufuf)


Bewertung
-1 lesenswert
nicht lesenswert
Johannes M. schrieb:
> Diese Zeile sollte alle uint64_t Werte des Array mit 0b111...
> initalisieren
Vermute ich auch.
Tut es aber nicht.

von Nick M. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Johannes M. schrieb:
> Diese Zeile sollte alle uint64_t Werte des Array mit 0b111...
> initalisieren

Damals gab es aber noch kein memset und auch kein sizeof

von Helmut L. (helmi1)


Bewertung
3 lesenswert
nicht lesenswert
Arduino Fanboy D. schrieb:
> Vermute ich auch.

Der Anfang jeder Katastrophe ist eine beschissene Vermutung.

Und was macht dann die Zeile? Sie besetzt nur das erste Element.

von au weia (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Nick M. schrieb:
> Damals gab es aber noch kein memset und auch kein sizeof

Also wir haben damals auch mit der Hand die Bits einzeln in
die Lochkarten gestanzt.

von Johannes M. (jojo20)


Bewertung
0 lesenswert
nicht lesenswert
Und was hat das mit dem Wert für R jetzt mit meinem Problem bei 
B_displayline zu tun?

von au weia (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Johannes M. schrieb:
> _delay_us(0.1);

Ist das Ernst oder kann das weg?

ROFL!

von Nick M. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
au weia schrieb:
> Also wir haben damals auch mit der Hand die Bits einzeln in
> die Lochkarten gestanzt.

Wir konnten das schon mit Bleistift machen für die HP. Wurden aber 
gewarnt nur Bleistifte der Härte HB herzunehmen und aufzupassen die 
Karten nicht aneinander zu reiben, weil sonst die Markierung verwischt.

von Arduino Fanboy D. (ufuf)


Bewertung
-2 lesenswert
nicht lesenswert
Johannes M. schrieb:
> Und was hat das mit dem Wert für R jetzt mit meinem Problem bei
> B_displayline zu tun?
Was hast du denn für ein Problem?

Was tut es?
Was soll es tun?

von Johannes M. (jojo20)


Bewertung
-2 lesenswert
nicht lesenswert
au weia schrieb:
> Johannes M. schrieb:
>> _delay_us(0.1);
>
> Ist das Ernst oder kann das weg?
>
> ROFL!

Ich habe mich langsam an das Mögliche Timing herangeastet und am Ende 
einfach per Suchen und Ersetzen 0.1 eingetragen. Ich weiß das es 
eigentlich auch weg kann. Aber auch das tut ja hier nichts zur Sache und 
war auch nicht meine Frage.

von Nick M. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Johannes M. schrieb:
> Ich habe mich langsam an das Mögliche Timing herangeastet und am Ende
> einfach per Suchen und Ersetzen 0.1 eingetragen.

Ich würde lieber in die Compilersettings warn+ eintragen und das dann 
auch lesen.

von Johannes M. (jojo20)


Bewertung
0 lesenswert
nicht lesenswert
Arduino Fanboy D. schrieb:
> Johannes M. schrieb:
>> Und was hat das mit dem Wert für R jetzt mit meinem Problem bei
>> B_displayline zu tun?
> Was hast du denn für ein Problem?
>
> Was tut es?
> Was soll es tun?

Habe ich doch geschrieben. Es sollte bei Zeile 1 also i=1 in 
B_displayline 0b111111111111111111111111111111 stehen. tut es aber 
nicht.

von Arduino Fanboy D. (ufuf)


Bewertung
-2 lesenswert
nicht lesenswert
Helmut L. schrieb:
> Der Anfang jeder Katastrophe ist eine beschissene Vermutung.
Sage ich doch auch immer...

> Der Weg in die Hölle ist mit falschen Annahmen gepflastert.

Helmut L. schrieb:
> Und was macht dann die Zeile? Sie besetzt nur das erste Element.
Das ist doch offensichtlich.

von au weia (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Johannes M. schrieb:
> B1_temp=B_displayline[i];

Welchen Wert meinst du hat die Variable i zu diesem Zeitpunkt?

von Johannes M. (jojo20)


Bewertung
-1 lesenswert
nicht lesenswert
au weia schrieb:
> Johannes M. schrieb:
>> B1_temp=B_displayline[i];
>
> Welchen Wert meinst du hat die Variable i zu diesem Zeitpunkt?

i zählt von 0 bis 15 durch. Und wenn Zeile 1 geschrieben werden soll hat 
i den Wert 1.

von Nick M. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
au weia schrieb:
> Welchen Wert meinst du hat die Variable i zu diesem Zeitpunkt?

Das passt schon, liegt mal wieder am verhunzten Quältext.

von Arduino Fanboy D. (ufuf)


Bewertung
-2 lesenswert
nicht lesenswert
Johannes M. schrieb:
> Habe ich doch geschrieben. Es sollte bei Zeile 1 also i=1 in
> B_displayline 0b111111111111111111111111111111 stehen. tut es aber
> nicht.

Nein!

Du hast geschrieben:
Johannes M. schrieb:
> Leider habe ich in B_displayline[1] bzw in B_temp am ende nicht die oben
> gesetzte
> B_displayline[1]=0b11111111111111111111111111111111111111111111111111111
> 11111111111;  drin.

Ein  B_temp gibt es in dem Code nicht.
Und dein B1_temp wird leer geschoben.
> B1_temp = B1_temp >> 1;
Also ist es hinterher auch leer.
Warum erwartest du was anderes?

Zudem wird B_displayline[1] nirgendwo anders geändert.
Also muss da auch noch das drin stehen, was du rein geschrieben hast.

Es sei denn, du hast irgendwo einen Zeiger, welcher aus dem Ruder läuft, 
und die Daten dort werden versehentlich überschrieben.

: Bearbeitet durch User
von HildeK (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Johannes M. schrieb:
> Habe ich doch geschrieben. Es sollte bei Zeile 1 also i=1 in
> B_displayline 0b111111111111111111111111111111 stehen. tut es aber
> nicht.

Du hast aber Element [0] mit Daten gefüllt, Element [1] und alle 
weiteren 30 sind 0.
Außerdem ist in deinem Programm nicht erkennbar, wo du R_displayline 
irgendwohin ausgibst. Wie stellst du fest, dass es nicht funktioniert?

Wenn du das als Init von Element 1 benötigst, dann wäre es vielleicht 
geeigneter zu schreiben:
1
  volatile uint64_t R_displayline[32]={0, 0xFFFFFFFFFFFFFFFF};

von HildeK (Gast)


Bewertung
3 lesenswert
nicht lesenswert
Mist, und Makulatur - habe mich aufs falsche Array konzentriert.

von Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht lesenswert
HildeK schrieb:
> Mist, und Makulatur - habe mich aufs falsche Array konzentriert.

Eine positive Bewertung von mir, wegen zugeben eines Irrtums.
Wäre eigentlich nicht erwähnenswert.
.. aber in diesem Forum ist einiges "anders" ...

von HildeK (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Arduino Fanboy D. schrieb:
> wegen zugeben eines Irrtums.

Mich ärgert das ja selber: sofort nach dem Abschicken sieht man den 
Mist, vorher nicht :-(

von Nick M. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
HildeK schrieb:
> Mich ärgert das ja selber: sofort nach dem Abschicken sieht man den
> Mist, vorher nicht :-(

Du bist nicht alleine!

von Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht lesenswert
HildeK schrieb:
> Mich ärgert das ja selber:
Muss es nicht!
Jeder Fehler/Irrtum ist eine Gelegenheit was zu lernen.
Und sei es auch nur das Schärfen der Aufmerksamkeit.


Einer meiner Leitmotive:
> Irren ist menschlich.
> Im Irrtum verharren, Dummheit.

Einen eigenen Irrtum eingesehen zu haben, verbuche ich als einen Erfolg. 
Es ist also eher ein Grund zur Freude, als zum ärgern.

Leider ist das zugeben von Irrtümern, hier im Forum, eher selten.
Darum habe ich mir vorgenommen das "positiv zu besetzen".
Denn ich halte es für eine Art mentaler Stärke/Festigkeit, zu einem 
Irrtum oder einem "nicht genau wissen" zu stehen.

Andererseits, könnte es auch sein, dass hier Unmengen an Unfehlbaren 
Genies unterwegs sind.
Dann werde ich mit der Methode nicht weit kommen....

von Johannes M. (jojo20)


Bewertung
-1 lesenswert
nicht lesenswert
Die b1_temp soll ja später seriell rausgeschrieben werden, deswegen 
möchte ich ja die aktuelle Zeile vom array in die Temp Variable 
schreiben. Aber das klappt ja leider nicht.

Also ich schreibe:

volatile uint64_t B_Displayline[32];
volatile uint64_t B1_temp;
B_Displayline[0]=0xFF;
B1_temp=B_Displayline[0];

Dann sollte doch in B1_temp 0xFF stehen. tut es aber nicht! Was mache 
ich falsch?

von jo mei (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Johannes M. schrieb:
> Dann sollte doch in B1_temp 0xFF stehen. tut es aber nicht!

Welcher Compiler, welche Version, welche IDE?
Mit welcher Methode stellst du das falsche Egebnis fest?

von Nick M. (Gast)


Bewertung
-2 lesenswert
nicht lesenswert
Wo kommt denn das R1 da her:
            PORTD |= (1<<R1);}

Der Code ist nicht komplett, es ist die alte Leier.
Poste den completten code im Anhang, dann get es weiter.

Hier fehlt ein Strichpunkt:
      R1_temp=0b10000010000000000000000000000000000000000000000000000000000000 
01

Willst du uns verarschen? Das läuft nicht mal durch den Compiler!

von Egonwalter M. (heiner1234)


Bewertung
0 lesenswert
nicht lesenswert
So auf die schnelle:

#include <stdio.h>
#include <inttypes.h>

int main() {
uint64_t B_Displayline[32];
uint64_t B1_temp;
B1_temp = 1234;

printf("\nB1_temp = %d", B1_temp);
B_Displayline[0]=0xFF;
B1_temp=B_Displayline[0];
printf("\nB1_temp = %d", B1_temp);
printf("\nB1_temp = %04x", B1_temp);

return 0;
}

compiliert - fkt; Ausgabe
B1_temp = 1234
B1_temp = 255
B1_temp = 00ff

Wo ist das Problem?

: Bearbeitet durch User
von jo mei (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Egonwalter M. schrieb:
> Wo ist das Problem?

Mach mal printf auf einem ATMEGA644p ohne Netz und doppeltem Boden.

jo mei schrieb:
> Mit welcher Methode stellst du das falsche Ergebnis fest?

von Nick M. (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
jo mei schrieb:
> Mach mal printf auf einem ATMEGA644p ohne Netz und doppeltem Boden.

Laut Microchip sollteman das doch hinbekommen:

Digital Communication Peripherals: 2-UART, 3-SPI, 1-I2C

von Egonwalter M. (heiner1234)


Bewertung
0 lesenswert
nicht lesenswert
jo mei schrieb:
> Egonwalter M. schrieb:
>> Wo ist das Problem?
>
> Mach mal printf auf einem ATMEGA644p ohne Netz und doppeltem Boden.
>

DAS sollte ja kein Problem sein - gib's auf dem PC per UART aus

von Nick M. (Gast)


Bewertung
-2 lesenswert
nicht lesenswert
Egonwalter M. schrieb:
> DAS sollte ja kein Problem sein - gib's auf dem PC per UART aus

DAS ist eine Technik, die nur in Insiderkreisen bekannt ist.

von jo mei (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Nick M. schrieb:
> Laut Microchip sollteman das doch hinbekommen:

Egonwalter M. schrieb:
> DAS sollte ja kein Problem sein

Für euch (vielleicht) und für mich nicht, aber für den TO ....?
Daher meine Frage:

jo mei schrieb:
> Mit welcher Methode stellst du das falsche Egebnis fest?

Beitrag #6518076 wurde von einem Moderator gelöscht.
Beitrag #6518079 wurde von einem Moderator gelöscht.
Beitrag #6518086 wurde von einem Moderator gelöscht.
von Arduino Fanboy D. (ufuf)


Bewertung
-1 lesenswert
nicht lesenswert
Johannes M. schrieb:
> Also ich schreibe:
>
> volatile uint64_t B_Displayline[32];
> volatile uint64_t B1_temp;
> B_Displayline[0]=0xFF;
> B1_temp=B_Displayline[0];
>
> Dann sollte doch in B1_temp 0xFF stehen. tut es aber nicht! Was mache
> ich falsch?

Weiß ich nicht!


Bei mir tuts das:
1
#include <Streaming.h>
2
#include <CombieBigInt.h>
3
4
void setup() 
5
{
6
  Serial.begin(9600);
7
  Serial << "Start: "<< __FILE__ << endl;
8
9
  char buffer[100];
10
  volatile uint64_t B_Displayline[32];
11
  volatile uint64_t B1_temp;
12
  B_Displayline[0]=0xFF;
13
  B1_temp=B_Displayline[0];
14
15
  Serial << "Result: 0x" << bigToStr(buffer,B1_temp,16) << endl;
16
17
}
18
19
void loop() 
20
{
21
22
}

Sagt:
1
Start: c:\temp\arduino_modified_sketch_696171\CombieBigInt.ino
2
Result: 0xFF

: Bearbeitet durch User
von Nick M. (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Teo D. schrieb im Beitrag #6518086:
> "Insiderkreisen" == Kindergarten Gewäsch

Freut mich, dass du zumindest das erkannt hast.

Jetzt wird es für dich etwas komplizierter!

Das nennt sich Sarkasmus. Hier kannst du es nachlesen, sind auch Bilder 
dabei. Bilder scheinen ja dein Spezialgebiet zu sein, neben 
Kompressoren.
https://de.wikipedia.org/wiki/Sarkasmus

von Teo D. (teoderix)


Bewertung
0 lesenswert
nicht lesenswert
Nick M. schrieb:
> Das nennt sich Sarkasmus.

Hmmm, schwer zu erkennen, aber nicht unwahrscheinlich. Allerdings in 
Anbetracht dessen, dass du das mit dem Link setzen, an satt Urzeit und 
Datum zu einem Beitrag anzugeben, bis zuletzt nicht verstanden hastest, 
lies mir einfach keine Wahl! ... Vorhausgesetz, du erinnerst dich noch 
an GESTERN! ;P

Ach Sche.., da gibts leider noch dutzende Beiträge von dir.....

von Nick M. (Gast)


Bewertung
-2 lesenswert
nicht lesenswert
Teo D. schrieb:
> Ach Sche.., da gibts leider noch dutzende Beiträge von dir.....

Hast du auch brav überall Minus geklickt? Ja?
Dann darfst du jetzt ins Bett. Aber zieh vorher deine Unterhose aus und 
mach dich gründlich sauber.

Es freut mich wirklich aufrichtig, dass du jetzt eine Aufgabe für dich 
gefunden hast. Ich denk, es ist auch recht fordernd für dich überall zu 
suchen wo ich was schreib. Mach dir nicht die Arbeit meine Texte zu 
lesen, die überfordern dich offensichtlich, klicken ist in deiner 
Situation schon ein beachtlicher Fortschritt.

Alles gute weiterhin und wenn es dir schlechter geht, klingle nach der 
Nachtschwester.

von Teo D. (teoderix)


Bewertung
0 lesenswert
nicht lesenswert
Nick M. schrieb:
> Hast du auch brav überall Minus geklickt? Ja?

Ja, hier und jetzt. Damit du nicht glaubst, ich sei der Einzige....



PS;: Ohh, Sorry, ich vergaß, dies wird dich wieder geistig überfordern.

PPS: Oje, und das nach meinem Epic-Fail von Gestern..... :PPP

PPPSL: Ich bin raus! Is ja nich zum aushalten, so ein offtopic 
Kindergarten gegenlenke. JA, natürlich meine ich uns BEIDE. Also las 
noch einen ab und gut is dat!

: Bearbeitet durch User
von Nick M. (Gast)


Bewertung
-2 lesenswert
nicht lesenswert
Teo D. schrieb:
> Ja, hier und jetzt. Damit du nicht glaubst, ich sei der Einzige....

Na, immerhin hast du damit schon mal zugegeben einer der zwei zu sein. 
Der Andere ist vermutlich seniler als du.

> PPS: Oje, und das nach meinem Epic-Fail von Gestern..... :PPP

Du hast dir heute in die Hose gemacht. Gestern war das mit dem nackt 
im Park rumlaufen. Aber die Polizistinnen kennen dich und haben dich 
unter Würgreiz zurück ins Heim gebracht. Bedank dich aber bitte nicht 
mehr bei denen, denn das letzte Mal war mehr als appetitlos.

Das solls jetzt gewesen sein, Danke!

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]
  • [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.

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