Hallo Zusammen,
ich versuche mich gerade an den Intelligenten LED's mit Busansteuerung.
Um schnell genug zu seien, Habe ich einen ATTiny2313 mit einem 20MHz
Quarz ausgestattet. Ich habe zum probieren mal einen einfachen Code
geschrieben.
Hierbei habe ich eine Variable (pos as Byte) welche die Position in der
Datentabelle angibt. Ich komme hier an die Grenze der Definition Byte.
Wenn ich allerdings die Variable als Word deklariere, dann spinnt mein
Programm. Ich komme hier nicht dahinter, was ich falsch gemacht habe!
soweit mal mein Code:
Die pos variable wird natürlich dann für die nächsten Bilder immer um 27
größer. Doch schon jetzt kann ich Sie nicht als Word deklarieren.
Hoffentlich kann mir jemand auf die Sprünge helfen...
Herzlichen Dank
Hi
ich arbeite zwaar nicht mit BASCOM, aber Pos könnte auch ein
Schlüsselworrt von BASCOM sein. Schreib Pos mal mit Position aus und
prüfe das Ergebnis.
Gruß oldmax
Hallo, erstmal Danke der schnellen Antwort.
@Oldmax: Habe schon mehrere Variablen vergeben, pos, Position, A,...
Alles leider ohne Erfolg.
@Michael: Ich habe vor geraumer Zeit einen LED Würfel programmiert. Habe
das gleiche Prinzip verwendet. Beim Würfel machts zumindest keine
Probleme!!!
Bascom beschwert sich ja auch nicht, nur rechnet es inrgendwie anders.
Allerdings sind doch ganze Zahlen ganze Zahlen, nur halt statt 255 nun
65535 oder?
Die Daten sollen später auf einer SD-Karte liegen, da brauch ich ja auch
eine Variable größer 255!!!
Gruß Sven
Sven Kegel schrieb:> Wenn ich allerdings die Variable als Word deklariere, dann spinnt mein> Programm. Ich komme hier nicht dahinter, was ich falsch gemacht habe!
Das gezeigte Programm dürfte in keiner Version funktionieren, da die
äußere Loop auskommentiert ist, das läuft genau einmal die For/Next
durch und dann ist Ende.
Sollte das nur versehentlich so gepostet sein, so wäre als Nächstes die
Bascom-Version interessant, um zu sehen, ob's 'ne aktuelle Version ist.
Alternativ: stell' das erzeugte Hex rein, dann kann ich Dir sagen, ob
bei der Adressierung über Lookup etwas falsch läuft.
Auch die muster.txt ist in diesem Zusammenhang interessant.
Hi
Michael N. schrieb:> Akzeptiert die Funktion Lookup überhaupt Word als Parameter?
Wär dann mein nächster Anlauf. Wenn Pos ein Zeiger ist und "nur" das
Programm spinnt, könnt es daran liegen, das du pos als Integer
deklarierren musst. Ob BASCOM mit Word-Formaten mathematisch umgehen
kann, weiß ich nicht. Eins ist aber sicher, wenn die Funktion, die du
aufrufst, einen Integer-Parameter erwartet, wird das höchstwertige Bit
als Vorzeichen gewertet und da geht eventuell die Adressierung auch ins
negative.
Gruß oldmax
Oliver S. schrieb:> 2 Sekunden googlen bringt bei mir als 2. Treffer das hier:> ...dabei ist auf die richtige Definition von "Wert" zu achten, und die> muß zu der Tabelle passen, z.B.:> DIM Wert as Byte> Wert = LOOKUP (12, Byte_tabelle)>> DIM Wert as Integer> Wert = LOOKUP (12, Integer_tabelle)>> Wenn das das Problem ist, dann gilt der alte Spruch: RTFM...
Das ist zumindest nach Aussage des TE nicht das Problem:
Sven Kegel schrieb:> Hierbei habe ich eine Variable (pos as Byte) welche die Position in der> Datentabelle angibt. Ich komme hier an die Grenze der Definition Byte.> Wenn ich allerdings die Variable als Word deklariere, dann spinnt mein> Programm.
Hier geht's um den Index von Lookup und nicht um den Rückgabewert.
oldmax schrieb:> Wär dann mein nächster Anlauf. Wenn Pos ein Zeiger ist und "nur" das> Programm spinnt, könnt es daran liegen, das du pos als Integer> deklarierren musst.
Pos ist kein Zeiger, sondern der Index für Lookup(), welches Du außer
mit Floats mit allen numerischen Variablen füttern kannst, die Bascom so
hergibt.
Sven Kegel schrieb:> $hwstack = 32> $swstack = 10> $framesize = 40> $crystal = 10000000
Ein Klassiker auf solchen winzigen Tinys ist ein Stackoverflow. Immerhin
hat der nur 128 Byte SRam, da ist das Ende schnell erreicht.
Und bei nur 32 Byt Stack wird's halt ganz schnell ganz eng.
Abgesehen davon sind 10000000 keine 20MHz,aber das ist ein anderes
Problem...
Oliver
Oliver S. schrieb:> Und bei nur 32 Byt Stack wird's halt ganz schnell ganz eng.
Das gezeigte Programm benötigt so gut wie keinen Stack, es sind keine
ISRs, keine Subs, usw. drin.
> Abgesehen davon sind 10000000 keine 20MHz,aber das ist ein anderes> Problem...
Da hast Du wohl recht, die Waits wären damit nur halb so lang - sofern
die Fuses richtig gesetzt sind.
Hi,
Soweit alles einleuchtend.
POS ist die Stelle in der Textdatei an der relativ einfach &B00000011
steht.
Textile sieht so aus:
Data 1% '1Bild Ende für Loopschleife
Data &B00000011, &B00000000, &B00000000, &B00000000, &B00000011,
&B00000000, &B00000000, &B00000000, &B00000011 'Bild 1
Dies wäre jetzt gedimmtes grün, rot und blau.
Die außere Loopschleife ist zum Ausbrobieren ausgeklammert.
8mal innere Schleife überträgt einmal die Acht bit, dann die nächste
Schleife 3mal, somit grün rot und blau. Dann noch ne Schleife, da 3 LEDs
am Bus hintereinander. Somit sollte laut Textfile grün, rot und blau
leuchten. Geht aber nur mit POS AS Byte. Mit POS als Word kommt Käse
raus :)
Sorry die 10000000, 8Mhz war zu langsam (also 20MHz) Mit 20000000 waren
mir die waitus zu schnell. Bei 10000000 passen die Waits genau zur Led.
Sende 1 ist 900-1000ns an und 300-450ns aus. Sende 0 300-450ns an und
900-1000ns aus. Reset durch 50us Pause. Led speichert letzte Farbe. Gibt
Bitüberlauf an nächste Led weiter.
Bascom sagt mir mit einem Bild im Textfile ca 20% Speicherauslastung.
Später kommt das ja auf MiniSd.
Sobald ich Mittwoch Abend zuhause bin nehme ich gern das Angebot an und
schick das Hexfile. Guter Hinweis. Hier müssten ja das Textfile in der
richtigen Reihenfolge stehen. Ich schick also einmal mit POS AS Byte und
einmal POS AS Word.
Gruß
Im oberen Bascom File habe ich zum Ausprobieren mal alle 9 Bytes
weggeschrieben. Und 3 Led Reihen mit jeweils 3 LEDs an drei Ports
gehängt.
Im Textile sind erst alle (27(pro Bild)) auf Blau und Wechsels dann
Schritt für Schritt in Rot. Bis neun Bilder geht's ab dem 10 brauch ich
mein POS as word.
Beide Programme spinnen wenn ich POS as Word deklariere. Mit POS AS byte
sieht es schon recht cool aus.
Sven Kegel schrieb:> Data &B00000011, &B00000000, &B00000000, &B00000000, &B00000011,> &B00000000, &B00000000, &B00000000, &B00000011 'Bild 1
Hab das mal mit Pos als Word simuliert und Lookup() funktioniert damit
einwandfrei, Version 2.0.7.8
Aus diesem hier:
Sven Kegel schrieb:> Sorry die 10000000, 8Mhz war zu langsam (also 20MHz) Mit 20000000 waren> mir die waitus zu schnell. Bei 10000000 passen die Waits genau zur Led.
ist zu vermuten, dass Du Timingprobleme hast, denn es verhält sich genau
umgekehrt.
Wenn dem Compiler 10MHz mitgeteilt wird, so erzeugt dieser eine
Warteschleife, in der die gewünschte Wartezeit bei 10 Millionen Takten
pro Sekunde verbraten wird, bei 1µS also 10 Takte.
Werden tatsächlich aber 20 Millionen Takte pro Sekunde vom µC
ausgeführt, so sind diese 10 Takte in der Hälfte der Zeit abgearbeitet.
Overhead jetzt mal nicht beachtet.
Zu versuchen das richtige Timing mit Standard-Befehlen zu erreichen, ist
nicht zielführend, hier ist ASM das Richtige.
Falls Du dennoch rumprobieren willst, ersetze das Waitus durch ein oder
mehrere !NOP.
Tach,
Gebe Dir Recht mit dem Timing. Hatte das mit dem Oszi rausgemessen.
Irgendwo sitzt ein ganz banaler Denk-, oder Einstellfehler.
Ich schick Dir die Hex
Hab's gefunden ;)
Meine Schleifen haben mir mein Timing verändert.
Wahrscheinlich hat pos as word einen Tick länger gedauert und somit mein
Programm gesponnen.
Habe nun mein Programm auf 20000000 gesetzt und meine Pausen mit
mehrfach NOP gemacht.
Es funktioniert ;)
Kann sei, dass ich mich zum thema SD Karte dann nochmal melden muss...
Werde euch noch was zum fertigen 8x16 RGB Netzt schicken.
Herzlichen Dank für eure Unterstützung vorallem MWS
Das ist leicht simulierbarer Code, $SIM reinschreiben, compilieren und
Simulator aufrufen. Per F8 durch den Code, in der Statuszeile unten
links sind die Cycles zu finden, ein Rechtsklick darauf setzt die Cycles
auf 0. Da kannst Du Dir ohne Oszi Dein Timing ausrechnen. Aufpassen: das
$SIM für den richtigen uC-Code wieder raus nehmen & neu compilieren,
denn sonst fehlen Dir alle Delays.
Vilen Dank für die Tips.
Ich bin noch am Üben. Denn manchmal verändere ich durch das Programm
mein Timing. Ich muss mir eine Lösung programmieren, welche immer gleich
sendet unabhängig vom Programm Code. Weitergehend brauche ich für mein
Größeres Netz viel mehr Speicher.
Ich schau mich mal nach nem Atmega-Board mit SD-Karte um.
Am einfachsten gleich einen mit Bootloader, damit ich FAT32 kann. Denn
sonst tu ich mir schwer mit dem beschreiben der Karte.
Nen Tip, welcher Atmega hier am besten zu verwenden ist?
Gruß Sven
Sven Kegel schrieb:> Denn manchmal verändere ich durch das Programm> mein Timing.
Ich geh' davon aus, dass Du kein ASM kannst, sonst hättest Du den
Hinweis bereits aufgegriffen. Für solche Bitbang-Geschichten ist's das
Mittel der Wahl.
> Nen Tip, welcher Atmega hier am besten zu verwenden ist?
Da verwende ich gern Arduinos, die sind bequem mit Bascom per Bootlader
zu programmieren, der BL ist bereits drauf, wobei einen BL draufzuladen
auch kein Ding ist. Für die Arduinos gibt's auch viel Dransteckzeugs aka
Erweiterungsboards.
Nachteil ist, dass Du Schaltpläne wälzen musst, denn da ist alles für
Arduino-Code und Arduino-Nummerierung abgestimmt, also musst Du selbst
rausbekommen, welcher Pin wohin geht.
Mit den verbauten USB/Serial Konvertern von FTDI auf den Arduinos musst
Du ein wenig aufpassen, da gab's kürzlich 'ne häßliche Sache, wo der
Treiber Clones geplättet hat. Ist mir selbst bei 2 Arduino Nano V3
passiert.
Oder Du suchst Dir 'nen XMega, da gehen dann so nette Sachen, wie die
Erzeugung des Signals über UART-SPI, das über DMA aus einem Doppelpuffer
versorgt wird. Da bleibt dann genügend Leistung für den Rest des
Programms über, während die Signale für die LEDs im Hintergrund
rausgeschoben werden.
Servus,
habe mal geforscht. Der Cortex ist mir noch n bissl zu viel drum Versuch
ichs mal damit. Hat Bootloader, SD Leser und Touchscreen.
Zum lernen isr das glaub ne gute Wahl:
http://m.ebay.de/itm/221082189384?nav=SEARCH
Kannst mir ja mal deine Meinung Posten :)
Gruz
Sven Kegel schrieb:> Der Cortex ist mir noch n bissl zu viel
Da verwechselst Du was, der XMega ist kein Cortex, Atmel bietet aber
auch ARM Cortex an. Der XMega ist immer noch ein 8Bit AVR, zwar
anspruchsvoller als die normalen ATMega, aber man erkennt viel Bekanntes
wieder und findet sich gut rein, auch die Unterstützung der XMega
seitens Bascom ist ganz ordentlich.
Sven Kegel schrieb:> Kannst mir ja mal deine Meinung Posten :)
Sieht nicht schlecht aus, für das LCD war Bascom-Code zu finden, beim
Touch fand ich nichts genaues. Da musst Du selbst mal suchen. Beides ist
wichtig für Dich, wenn Du die Funktionalität nutzen willst, denn es wird
Dir über den Kopf wachsen, wenn Du zu viele Baustellen hast, also z.B.
um den Touch-Controller selbst ansprechen.
Von der Beschreibung des Auktionsgegenstandes her - ein ziemlicher
Kauderwelsch, ich habe nicht versucht, alles zu erraten, das sieht zwar
aus wie Englisch, jedoch wie aus dem Chinesischen durch den
Übersetzerwolf gedreht. Andererseits kostet das Ganze nicht die Welt, da
wäre nicht viel kaputt.
Sehr ich auch so, mit 40€ ist nicht viel kaputt. Ich hoff der Touch ist
im Bootloader, ansonsten kann ich auch mit vier Knöpfen als Joystik
leben.
Zumindest hab ich statt 2KB mal immerhin 256KB und nenn Kartenleser.
Für den Bildschirm gibt bestimmt nenn fertigen Code als Webradio ;)
Gruß und Danke
Halt dich auf dem laufenden.
Wo kommst Du überhaupt her und wie alt bist du?
:)
Perfekt, wer lesen kann ist klar im Vorteil.
Dennoch will ich jetzt meinen Touchscreen, um das RGB Netz zu bedienen.
Danke, das spart mir einen Haufen Arbeit ;)
Gruś
Bascom-Helper schrieb:> Nur mal so als Info. Wenn deine Leds WS2812 sind, also RGB-Leds mit> einem Daten-Pin, dann schau mal hier:> http://www.bascom-forum.de/showthread.php?6457-Rainbow-Lib-f%FCr-WS2812b
Zu früh gefreut:
- Erstens musste das Programm umgeschrieben werden, da die Bezeichnung
Const Rainbo0_Len gar nicht existiert, heißt Rainbow0_Size. Die Übergabe
von SetColor geht auch nur mit einer Farbe und zu guter Letzt stimmt das
Timing nicht. Ich benutze OSTW5050C1A.
Dennoch Danke für den Tip, muss eh noch Shift-Befehle entwerfen.
Nun ja, am besten lernt man, wenn man keine Fertigen Bausteine benutzt
sondern diese einmal selber entwirft ;)
Gruß