Forum: Mikrocontroller und Digitale Elektronik Benötige Unterstüzung bei Variablen


von Sven K. (Firma: KegElectrics) (chakaaa)


Lesenswert?

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:
1
$regfile = "2313def.dat"
2
$hwstack = 32
3
$swstack = 10
4
$framesize = 40
5
$crystal = 10000000
6
'---------------------------------------------------------------------
7
' Ports auf Ausgang setzen
8
'---------------------------------------------------------------------
9
Config Pind.5 = Input
10
Config Portb = Output
11
'---------------------------------------------------------------------
12
' Variablen deklarieren
13
'---------------------------------------------------------------------
14
Dim Maxbild As Integer
15
Dim Bild As Word
16
Dim Pos As Byte            '<-- diese Variable brauche ich als Word
17
Dim Daten As Byte
18
Dim Led As Byte
19
Dim X As Byte
20
Dim Y As Byte
21
'---------------------------------------------------------------------
22
' Hauptprogramm
23
'---------------------------------------------------------------------
24
25
Linie1 Alias Portb.0
26
Linie2 Alias Portb.1
27
Linie3 Alias Portb.2
28
29
Taster Alias Pind.5
30
31
Wait 1
32
'Do
33
Maxbild = Lookup(0 , Muster)
34
Maxbild = Maxbild - 1
35
36
Pos = 2               'Wird später mit der Anzahl Bilder (27) multipliziert
37
38
For Led = 1 To 9
39
   Daten = Lookup(pos , Muster)
40
   For X = 0 To 7
41
      Y = Daten.x
42
      If Y = 0 Then
43
         Linie1 = 1
44
         Linie1 = 0
45
         Waitus 1
46
      End If
47
      If Y = 1 Then
48
         Linie1 = 1
49
         Waitus 1
50
         Linie1 = 0
51
      End If
52
   Next X
53
   Pos = Pos + 1
54
Next Led
55
For Led = 1 To 9
56
   Daten = Lookup(pos , Muster)
57
   For X = 0 To 7
58
      Y = Daten.x
59
      If Y = 0 Then
60
         Linie2 = 1
61
         Linie2 = 0
62
         Waitus 1
63
      End If
64
      If Y = 1 Then
65
         Linie2 = 1
66
         Waitus 1
67
         Linie2 = 0
68
      End If
69
   Next X
70
   Pos = Pos + 1
71
Next Led
72
For Led = 1 To 9
73
   Daten = Lookup(pos , Muster)
74
   For X = 0 To 7
75
      Y = Daten.x
76
      If Y = 0 Then
77
         Linie3 = 1
78
         Linie3 = 0
79
         Waitus 1
80
      End If
81
      If Y = 1 Then
82
         Linie3 = 1
83
         Waitus 1
84
         Linie3 = 0
85
      End If
86
   Next X
87
   Pos = Pos + 1
88
Next Led
89
90
'Loop
91
92
End
93
94
'---------------------------------------------------------------------
95
Muster:
96
'---------------------------------------------------------------------
97
$include "muster.txt"
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

: Bearbeitet durch User
von oldmax (Gast)


Lesenswert?

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

von Michael N. (betonmicha)


Lesenswert?

Akzeptiert die Funktion Lookup überhaupt Word als Parameter?

von Sven K. (Firma: KegElectrics) (chakaaa)


Lesenswert?

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

von MWS (Gast)


Lesenswert?

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.

von oldmax (Gast)


Lesenswert?

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

von MaWin (Gast)


Lesenswert?

Sven Kegel schrieb:
> include "muster.txt"

Warum fehlt gerade das, bei dem beim Zugriff drauf das Problem auftritt 
?

von Oliver S. (oliverso)


Lesenswert?

2 Sekunden googlen bringt bei mir als 2. Treffer das hier:
1
...dabei ist auf die richtige Definition von "Wert" zu achten, und die muß zu der Tabelle passen, z.B.: 
2
DIM Wert as Byte 
3
Wert = LOOKUP (12, Byte_tabelle)
4
5
DIM Wert as Integer  
6
Wert = LOOKUP (12, Integer_tabelle)


Wenn das das Problem ist, dann gilt der alte Spruch: RTFM...

Oliver

von MWS (Gast)


Lesenswert?

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.

von MWS (Gast)


Lesenswert?

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.

von Oliver S. (oliverso)


Lesenswert?

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

: Bearbeitet durch User
von MWS (Gast)


Lesenswert?

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.

von Sven K. (Firma: KegElectrics) (chakaaa)


Lesenswert?

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ß

von Sven K. (Firma: KegElectrics) (chakaaa)


Lesenswert?

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.

von Sven K. (Firma: KegElectrics) (chakaaa)


Lesenswert?

Ohne Loop Schleife werden also alle LEDs blau und fertig.
Mit POS as Word wird aber recht bunt :)

von Sven K. (Firma: KegElectrics) (chakaaa)


Lesenswert?

PS:
@Oldmax:
pos as Integer geht auch nicht

@Oliver S.:
Daten as Byte greift auf eine Byte-Tabelle zu.
RTF-Frage :)

von MWS (Gast)


Lesenswert?

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.

von Sven K. (Firma: KegElectrics) (chakaaa)


Lesenswert?

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

von Sven K. (Firma: KegElectrics) (chakaaa)


Lesenswert?

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

von MWS (Gast)


Lesenswert?

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.

von Sven K. (Firma: KegElectrics) (chakaaa)


Lesenswert?

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

von MWS (Gast)


Lesenswert?

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.

von Sven K. (Firma: KegElectrics) (chakaaa)


Lesenswert?

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

von MWS (Gast)


Lesenswert?

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.

von Chakaaa (Gast)


Lesenswert?

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?

von Bascom-Helper (Gast)


Lesenswert?

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

von MWS (Gast)


Lesenswert?

Chakaaa schrieb:
> Wo kommst Du überhaupt her und wie alt bist du?

Bayern & Üfü ;D

von Chakaaa (Gast)


Lesenswert?

:)
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ś

von Chakaaa (Gast)


Lesenswert?

Freut mich mit dem Ufü, dann hab ich ja noch bissl Zeit zum lernen ;)

von Sven K. (Firma: KegElectrics) (chakaaa)


Lesenswert?

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ß

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
Noch kein Account? Hier anmelden.