PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie kann ich eine Variable mit unterschiedlichen Werten in einer Schleife füllen?



waldi_n
29.12.2013, 20:52
Hallo werte Gemeinde,

ich komme irgendwie nicht weiter..
Ich möchte eine Variable mit unterschiedlichen Werten füllen. Mit for geht es nicht. For kann nur hoch, bzw. runterzählen, zumindest soweit ich das bisher begriffen habe.
Also in der Form for i in 1 to 10 .
In Shellscript würde ich das so programmieren.

for i in PINA.0 PINA.1 PINA.2 PINA.3 PINA.4 PINA.5 PINB.2 PINB.3 PIND.2

do
i = 1
echo $i (oder sonst was)
done

Wie kodiere ich das in Bascom?

For i = PINA.0 PINA.1 PINA.2 PINA.3 PINA.4 PINA.5 PINB.2 PINB.3 PIND.2
i = 1
Next i

geht nicht.

Könnt Ihr mir bitte einen Tip geben?

Viele Grüße

Waldi

Wsk8
29.12.2013, 22:08
Was genau willst du machen? Ein paar Ports auf 1 setzen? Ich kann kein shellscript.

mfg

waldi_n
30.12.2013, 08:39
Hallo Wsk8,

in diesem Fall will ich genau das machen. Im weiteren Verlauf will ich die an den Pins anliegende Spannung messen, bzw. den ADC-Wert ermitteln, und das halt in einem Rutsch.
Um die Ports auf 1 zu setzen könnte ich ja auch

PINA.0 = 1
PINA.1 = 1
.
.
.
PIND.2 = 1

schreiben.

Zum Spannungen abzufragen scheint mir das aber sehr ungeschickt.
Überdies würde durch solch ungeschickte Programmierung das Programm stark an Größe gewinnen, und ebenso an Lesbarkeit und Übersichtlichkeit verlieren.
Auch wenn es in diesem Fall nichht relevant ist, würde es dadurch nicht auch langsamer werden?
OK, wenn Effektivität in Größe und Geschwindigkeit im Vordergrund stünden, müsste ich mich eh in C oder Assembler versuchen, aber da habe ich so viel Nachholbedarf, dass ich das in diesem Leben vergessen kann.

Viele Grüße

Waldi

Michael
30.12.2013, 09:48
OK, wenn Effektivität in Größe und Geschwindigkeit im Vordergrund stünden, müsste ich mich eh in C oder Assembler (http://www.rn-wissen.de/index.php/AVR_Assembler_Einf%C3%BChrung) versuchen,
ich frage mich, warum meinen viele Anfänger, dass Sprachen, die sie nicht beherrschen, effektiver bzw. weniger effektiv seien?
Wie effektiv ist es z.B. für einen Anfänger, einen High-Level-Befehl in Assembler zu schreiben?

Das Problem ist doch eher das Verständnis, wie ein Programm funktioniert? Da ist die Programmiersprache übrigens egal.
Grundkenntnisse über die Hardware werden in allen Sprachen benötigt.


Um die Ports auf 1 zu setzen könnte ich ja auch

PINA.0 = 1
nein, Ports werden mit den Port-Registern gesetzt*
Pin-Register sind zum Lesen des Zustandes (High oder Low)


Im weiteren Verlauf will ich die an den Pins anliegende Spannung messen, bzw. den ADC-Wert ermitteln, und das halt in einem Rutsch.
entscheide dich. Entweder du benutzt einen Pin als digitalen I/O oder du liest dort die Spannung ein.

Es gibt für jede der genannten Sprachen Tutorials, durch die muss eigentlich jeder durch, der programmieren will. Hier im Roboternetz gibt es gute Beispiele im Wiki. Gerade die Pin-Port Geschichte mit DDR wird in Tutorials meist als erstes erklärt.

Gruß, Michael

*an alle, die es wirklich wissen: andere Varianten sind für das Verständnis erstmal nicht hilfreich ;)

Picojetflyer
30.12.2013, 09:48
OK, wenn Effektivität in Größe und Geschwindigkeit im Vordergrund stünden, müsste ich mich eh in C oder Assembler versuchen

Wo hab ihr eigentlich solche Vorurteile her?

Was du mit deinen Programm bezwecken möchtest hab ich zwar nicht verstanden aber ich erkläre es mal so.



config Porta = output 'kompletten Port A als Ausgang definieren

Porta =&B11111111 'alle Pins auf High setzen
Porta = 255 ' macht das Gleiche, nur in dezimaler Schreibweise

Porta.0 = 1 ' nur PortA.0 einschalten
Porta.0 = 0 ' Nur PortA.0 ausschalten

config Porta = input ' kompletten Port A als Eingang setzen
Porta = &B11111111 ' Alle Pullups von Port A aktivieren
Dim A as Byte

A = Pina ' komplette Zustandstabelle von Porta in die Variable A geschrieben.
A = Pina.0 'nur Zustand von Pina.0 in die Variable A geschrieben


'################################################# ####
'ADC
'################################################# ####

Config ADC = Single, Prescaler = Auto ' ADC einstellen, Single ist nötig für den GetADC Befehl, mit Prescaler Auto stellt sich Bascom die Abtastgeschwindigkeit selbst ein.

Dim Anlg as Word ' Variable definieren (die meisten Controller haben 10Bit ADCs. Deswegen die Variable als Word, Integer würde auch gehen

Start ADC ' alle ADCs werden gestartet.

Anlg = GetADC(0) 'Frage den ersten ADC (AIN0) ab und schreibe den Wert in die Variable Anlg







Hoffe es hilft/ da war Michael schneller :)

waldi_n
30.12.2013, 12:14
ich frage mich, warum meinen viele Anfänger, dass Sprachen, die sie nicht beherrschen, effektiver bzw. weniger effektiv seien?
Wie effektiv ist es z.B. für einen Anfänger, einen High-Level-Befehl in Assembler zu schreiben?

Das Problem ist doch eher das Verständnis, wie ein Programm funktioniert? Da ist die Programmiersprache übrigens egal.
Grundkenntnisse über die Hardware werden in allen Sprachen benötigt.

Ja Michael, das ist absolut richtig. Und bis ich effektiven Code schreibe, ist jedes andere schlecht geschriebene Programm schneller, als meins.
Ich möchte diese Diskussion darüber auch nicht ewig fortführen. Ich hatte die Bemerkung nur gemacht, um einer Antwort in Sinne von "Wenn es Dir auf Geschwindigkeit ankommt, dann schreib's doch in Assembler:" vorzubeugen. Im Übrigen finden sich solche Effektivitätsaussagen in der Fachliteratur zu Hauf.
Aber das kann man eh nur auf einem Niveau vergleichen, von dem ich noch Lichtjahre entfernt bin.
Mir geht es darum, überhaupt mal was Funktionierendes auf die Reihe zu kriegen. Und zeitkritisch ist mein Anspruch eh nicht.

entscheide dich. Entweder du benutzt einen Pin als digitalen I/O oder du liest dort die Spannung ein.
Hab' ich. Im Augenblick will ich Spannungen auslesen:wink:.

@Picojetflyer:


Wo hab ihr eigentlich solche Vorurteile her?
Siehe oben.
Um ehrlich zu sein, halte ich diese Diskussionen für genauso sinnlos und überflüssig, wie die Glaubenskriege zwischen Linux-und Windows-Anhängern, um mal ein klassisches Beispiel zu nennen. Wer maximal effektiv sein will, braucht seine Kunst einfach nur 100%ig zu beherschen.
Aber lassen wir das.
Ich danke Dir für Deinen Tipp. Ich werde es mal ausprobieren.
Zumindest die Pins auf 1 zu setzen gelingt mir damit besser, die ADC-Geschichte muss ich erst mal durchdenken.

Viele Grüße

Waldi

Michael
30.12.2013, 12:47
Im Augenblick will ich Spannungen auslesen
wie gesagt, ich bin der Meinung, dass Tutorials nicht umsonst sind. Sie ersparen es den Postern in Foren, immer wieder die gleichen Grundlagen auf's neue durchzukauen. Verstehst du sicher?
Der klassische Weg eben, LEDs blinken lassen, Lauflicht, Tastereingaben, verschiedene Variablen, Timer, LCD oder serielle Schnittstelle, AD-Wandler. Wie du siehst, ordne ich AD-Wandler weiter hinten ein.


Mir geht es darum, überhaupt mal was Funktionierendes auf die Reihe zu kriegen.
Ehrlich gesagt, kann ich mit deiner Beschreibung nicht wirklich etwas anfangen. Auch nach mehrmaligem Durchlesen nicht.
Versuch doch einfach mal eine Anwendung, die du machen willst, deiner Mutter zu beschreiben.
Das ist kein Scherz.
Nicht jeder der dir helfen könnte, versteht dich, aber die Beschreibung für die Mutter ist der gemeinsame Verständnislevel ;)

Gruß, Michael

Wsk8
31.12.2013, 15:43
Wo hab ihr eigentlich solche Vorurteile her?
Von Leuten mit mehr Erfahrungen als wir?
Gab hier erst neulich nen Thread, wo jemand den gleichen Code in Bascom und C programmiert hat und der in C war 14x schneller. Und wieso tun sich so viele C und ASM an, wenns in Bascom angeblich genauso gut funktioniert?? (Und ich spreche hier nicht davon, ob C oder Bascom besser für Anfänger geeignet ist.) Passt irgendwie nicht zusammen.
Aber ich sehs schon kommen, in den nächsten 2 Seiten wird mir jetzt sicher wieder erklärt, dass Bascom genauso gut ist und das ich total falsch liege...

BTT
Um Ports zu setzten, brauchst du keine Schleife. Geht ganz einfach. Leider kann ichs dir nur in C sagen:


PORTx |= (1<<MEIN_BIT);

Z.B.
PORTA |= (1<<PA0) | (1<<PA5);


Um den ADC auszulesen brauchst du sowieso ne Funktion, die kann man dann wieder in einer Schleife durchlaufen.
Z.B.


uint_16 ADC_Read(int channel);

for(...) {
val = ADC_Read(i);
...
}


mfg