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?
Johannes M. schrieb: > volatile uint64_t > R_displayline[32]={0b111111111111111111111111111111111111111111111111111 > 1111111111111}; Hihihi, ich frag mal ins Blaue: Was glaubst du, macht diese Zeile?
Diese Zeile sollte alle uint64_t Werte des Array mit 0b111... initalisieren
Johannes M. schrieb: > Diese Zeile sollte alle uint64_t Werte des Array mit 0b111... > initalisieren Vermute ich auch. Tut es aber nicht.
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
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.
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.
Und was hat das mit dem Wert für R jetzt mit meinem Problem bei B_displayline zu tun?
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.
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?
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.
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.
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.
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.
Johannes M. schrieb: > B1_temp=B_displayline[i]; Welchen Wert meinst du hat die Variable i zu diesem Zeitpunkt?
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.
au weia schrieb: > Welchen Wert meinst du hat die Variable i zu diesem Zeitpunkt? Das passt schon, liegt mal wieder am verhunzten Quältext.
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.
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}; |
Mist, und Makulatur - habe mich aufs falsche Array konzentriert.
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" ...
Arduino Fanboy D. schrieb: > wegen zugeben eines Irrtums. Mich ärgert das ja selber: sofort nach dem Abschicken sieht man den Mist, vorher nicht :-(
HildeK schrieb: > Mich ärgert das ja selber: sofort nach dem Abschicken sieht man den > Mist, vorher nicht :-( Du bist nicht alleine!
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....
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?
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?
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!
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
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?
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
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
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.
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.
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 |
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
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.....
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.
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
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.