AVR C array Programmierung wo liegt der Fehler?

OP #6516636
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?
Gast #6516661
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.
Gast #6516718
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.
Gast #6516726
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};
Gast #6516812
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....
OP #6517931
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?
Gast #6517994
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!
#6518004
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?
Beitrag #6518076 wurde von einem Moderator gelöscht.
Beitrag #6518079 wurde von einem Moderator gelöscht.
Beitrag #6518086 wurde von einem Moderator gelöscht.
Gast #6518101
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
#6518133
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.....
Gast #6518176
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.
#6518183
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!
Gast #6518199
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren