Forum: Mikrocontroller und Digitale Elektronik Programmierung


von Vince (Gast)


Lesenswert?

Hallo erstmal.

Ich habe eine kleine Hürde zu überwinden,

Ich möchte einen Attiny13 Programmieren, jedoch hakt es am Programm 
sehr. So sehr das ich alles gelöscht habe und von vorn beginnen wollte, 
es klappte dann immer noch nicht.

Mein Vorhaben:

-Es soll ein Eingang gesetzt werden, diese bleibt gesetzt solange bis 
ich
 ihn zurücksetze (Schalter)

-Nun soll mittels Poti der aktuelle Wert ausgelesen (Position) und
 gespeichert werden.

-Ausgang 1 wird gesetzt solange ein von mir definierter Wert im Programm
 erreicht wurde (Endlage)

-Ausgang 1 wird zurückgesetzt.

-Wenn ich den Eingang zurücksetze, wird Ausgang 2 gesetzt, solange bis 
der
 vorher ausgelesene und gespeicherte Wert erreicht wurde.

-Programmende, warte auf Eingang 1

Nutzen möchte ich dafür:

PB0= Eingang 1
PB1= Signal Poti
PB2= Ausgang 1
PB3= Ausgang 2

Ich bekomm es nicht hin, nicht einmal im Ansatz. Mein Veruchsaufbau war 
mit einer LOGO! von Siemens, klappte. Jetzt soll es deutlich kleiner 
werden.

Kann mir jemand helfen?

von Thomas D. (thomasderbastler)


Lesenswert?

Programiersprache ?

von der_ich (Gast)


Lesenswert?

Einen Eingang kann man nicht setzen.
Man kann in einlesen.
Einen "Ausgang" kann man setzen.

der_ich

von Vince (Gast)


Lesenswert?

Bascom, AVR Studio 4

von Vince (Gast)


Lesenswert?

Bascom, AVR Studio 4
Assambler

von Thomas D. (thomasderbastler)


Lesenswert?

Also die ganze Sache ist nichts anders wie ein paar If Then Schleifen.

Hast schon etwas geschrieben ? oder noch garnichts ?

von oldmax (Gast)


Lesenswert?

Hi
Ein bischen wirr, deine Beschreibung. Mein Tip: Mach dir eine Zeichnung 
zur Hardware. Dann blickst du besser durch. Dein Eingang st ein Schalter 
? Solange dieser Schalter ein ist fahren in Richtung x, solange der 
Analogwert < Max. Dann Halt.
Schalter aus, dann fahren in Richtung y, solange Analogwert > min.
Min und Maxwerte sind Konstante. Vermute ich mal.
Das Pseudoprogramm ist etwa so:
 Analogwert > min dann Freigabe_Y = 1
 Analogwert < Max dann Freigabe_X = 1
 Freigabe_X And Schalter dann Ausgang A       (vor)
 Freigane_Y And Not Schalter dann Ausgang B   ( zurück)

Ist jetzt aber nix besonderes. Wenn du lernst, deine Gedanken zu ordnen 
und die Schritte so zu beschreiben, das es auch andere verstehen, dast 
du dies ganz schnell raus.
Gruß oldmax

von oldmax (Gast)


Lesenswert?

Hi
an den Bastler
>If Then Schleifen
??? Das sind Bedingungen, die man zwar zu Schleifen vergewaltigen kann, 
aber für Schleifen gibt es For, While, Repeat ....

If Analogwert > min Thenn Freigabe_Y = 1
If Analogwert < Max Then Freigabe_X = 1
If Freigabe_X And Schalter Then Ausgang A       (vor)
If Freigane_Y And Not Schalter Then Ausgang B   ( zurück)


Nix für ungut, ich glaub, das hast du auch so gemeint.
Gruß oldmax

von Thomas D. (thomasderbastler)


Lesenswert?

Oldmax: Du hast erraten !

von Vince (Gast)


Lesenswert?

Ich bin da glaub ich total RAUS!!!

Ich Versuche das nochmal zu Verdeutlichen:

1. Schalter Ein, Signal an PB0
2. Wert einlesen vom Poti an PB1 und speichern (das ist die
   Ausgangsposition, die sich immer ändern kann)
3. Ausgang 1, PB2 Setzen, solange bis der Eingestellte Wert erreicht ist
   (den muss ich dann manuell ermitteln und halt anpassen)
4. Signal immer noch an PB0, aber alles ruhig
5. Signal an PB0 weg, PB3 wird gesetzt. Vergleich vom gespeicherten Wert 
mit
   ist-Wert, wenn der erreicht dann stop und ende.


Mir geht es erstmal rein um den Controller, ich möchte die Position 
eines Motors mittels Poti speichern und ihn bis Anschlag fahren lassen, 
dann soll er automatisch wieder zurück. Aufgrund der Platzverhältnisse 
geht nur ein Poti zur ermittlung der Position. Auf einen Endschalter 
möchte ich ebenfalls verzichten.

von Peter D. (peda)


Lesenswert?

In C:
1
#define UPPPER 1023
2
  uint16_t lower;
3
//1. Schalter Ein, Signal an PB0
4
  while( !PIN_B0 );
5
//2. Wert einlesen vom Poti an PB1 und speichern (das ist die
6
//   Ausgangsposition, die sich immer ändern kann)
7
  lower = ADC;
8
//3. Ausgang 1, PB2 Setzen, solange bis der Eingestellte Wert erreicht ist
9
//   (den muss ich dann manuell ermitteln und halt anpassen)
10
  PORT_B2 = 1;
11
  while( ADC < UPPER );
12
  PORT_B2 = 0;
13
//4. Signal immer noch an PB0, aber alles ruhig
14
  while( PIN_B0 );
15
//5. Signal an PB0 weg, PB3 wird gesetzt. Vergleich vom gespeicherten Wert 
16
  PORT_B3 = 1;
17
//mit
18
//   ist-Wert, wenn der erreicht dann stop
19
  while( ADC > lower );
20
  PORT_B3 = 0;
21
// und ende.
22
  for(;;);

von Vince (Gast)


Lesenswert?

@ Peter Dannegger

WOW....

Erstmal danke dafür.

Das kann ich jetzt so in den Editor Kopieren und dann ab dafür?

Oder muss ich außer in den Projektoptionen den Attiny13 zu definieren 
noch was beachten?

von spess53 (Gast)


Lesenswert?

Hi

>Das kann ich jetzt so in den Editor Kopieren und dann ab dafür?

Du hast etwas übersehen:

Karl-Heinz schrieb

In C:

MfG Spess

von Vince (Gast)


Lesenswert?

????

Ich kann doch mit dem AVR Studio auch in C Programmieren, oder nicht?

von spess53 (Gast)


Lesenswert?

Hi

>Ich kann doch mit dem AVR Studio auch in C Programmieren, oder nicht?

Das AVR-Studio bringt einen C-Compiler mit. Aber ob du C programmieren 
kannst wage ich zu bezweifeln.

MfG Spess

von Vince (Gast)


Lesenswert?

Was brauche ich denn an software und das programm auf den controller zu 
bringen?

von 4to Takoe (Gast)


Lesenswert?

Diese:

Vince schrieb:
> AVR Studio

PS: Sorry, aber so wie du dich anhörst schaust du wie ein Schwein in ein 
Uhrwerk. Also entweder du sagst jetzt ehrlich, dass du keinen Schimmer 
hast und nur zu faul bist dich da rein zu arbeiten oder du strengst dich 
klammheimlich mal ein wenig an und überlegst dir selbst eine Lösung.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

Da steht alles was du brauchst.

von Hmm (Gast)


Lesenswert?

Das AVRStudio reicht an Software schon um ein "Programm auf de uC zu 
bringen". Du brauchst noch eine Hardware dazu. Etwa ein STK500, einen 
AVR-Dragon. Es gibt eine Reihe von Möglichkeiten.
Auch sind die einzelnen Teilaufgaben so einfach, das Du ihre 
Programmierung sicher in einigen Tagen oder Wochen lernen kannst.

Lies Dir hier mal das Tutorial 
http://www.mikrocontroller.net/articles/AVR-Tutorial und 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial durch und 
versuche erstmal die Beispiele nachzuvollziehen, also auch selbst 
einzugeben, zu kompilieren und zu flashen (das ist der präzisiere 
Terminus).

Was Peter Dannegger Dir da gezeigt hat ist nur ein Teil dessen was Du 
schreiben und verstehen musst. Habe bitte Verständnis dafür, das wir 
hier in der Regel keine fertig ausprogrammierten Lösungen präsentierten. 
Vielmehr geben wir hier Hilfe zu Selbsthilfe, wie man so schön sagt.
Du musst schon selbst aktiv werden und Dich über die diversen kleinen 
und grüssen Hürden bewegen. Ob das nun im Sprung geschieht oder mittels 
eines Flaschenzuges spielt für uns keine Rolle. Nur eben, das Du selbst 
substantielle Bemühungen zeigst.

von Peter D. (peda)


Lesenswert?

Vince schrieb:
> Das kann ich jetzt so in den Editor Kopieren und dann ab dafür?

Jain.

Da fehlt noch das Init-Zeugs (ADC free running, IO-Pins).
Und für die Portpins brauchst Du noch meine sbit.h:

http://www.mikrocontroller.net/attachment/157663/sbit.h

von Vince (Gast)


Lesenswert?

Ich schrieb doch: Ich bin RAUS!!!

Das mit dem Schwein und dem Uhrwerk kommt hin.

Ich hab ne Platine mit Sockel und RS232 anschluss, kabel und AVR Studio 
4 und WinAVR.

Laut google und Fränzis Lernpaket soll das reichen.

Ich komm aber echt nicht klar. Und je mehr ich lese desto komplizierter 
wird das für mich.

Tut mir echt leid das meine Fragen sich so blöde anhören (sind sie 
vielleicht auch) aber das scheint nicht mein Gebiet zu sein.

von Hmm (Gast)


Lesenswert?

>Ich schrieb doch: Ich bin RAUS!!!
Schreie bitte nicht. Ja und? Was sollen wir nun mit dieser Aussage 
anfangen?

Als Erklärung dafür das Du das nicht verstehst, ist das hinreichend und 
befriedigend. Als Motivation, das wir das für Dich programmieren aber 
nicht. Du wirst das Problem selbst lösen müssen in dem Du wieder 
hineinkommst.

Ich kenne das AVR Franzis Lernpaket nicht, meine aber das es einen 
Bootloader hat. Dann brauchst Du nur noch ein RS232 Kabel und die 
Software vom Lernpaket.

>Ich komm aber echt nicht klar. Und je mehr ich lese desto komplizierter
>wird das für mich.
Aha. Meinst Du das war für uns anders? Willkommen in der Welt der 
Informatik. Es wird erst schlimmer ehe es besser wird.

>Tut mir echt leid das meine Fragen sich so blöde anhören (sind sie
>vielleicht auch) aber das scheint nicht mein Gebiet zu sein.
Dann mach was anderes. Es gibt noch andere schöne Hobbies.

von Peter D. (peda)


Lesenswert?

Vince schrieb:
> Laut google und Fränzis Lernpaket soll das reichen.

Es heißt deshalb Lernpaket, weil man es natürlich auch durcharbeiten 
muß.
Es transferiert nicht magisch das Wissen in Dein Gehirn, wenn Du es nur 
auf dem Tisch liegen hast.

von Hmm (Gast)


Lesenswert?

>Es transferiert nicht magisch das Wissen in Dein Gehirn, wenn Du es nur
>auf dem Tisch liegen hast.
Ich wusst doch: Da ist ein Haken an diesen Lernpaketen. :-)

von Vince (Gast)


Lesenswert?

Ich glaub ich werd stricken oder häkeln lernen.

Nein im ernst, hab das Lernpaket durch, LED blinkt und lässt sich dimmen 
und Strom kann ich auch damit messen.

Das ist aber alles BASCOM und C erscheint mir anhand des Beispiels 
weiter oben leichter.

Hmm schrieb:
> Habe bitte Verständnis dafür, das wir
> hier in der Regel keine fertig ausprogrammierten Lösungen präsentierten.

Gibts ne Ausnahme (SCHÄM) ?

Auf jeden Fall erstmal ein riesen Danke für die Starthilfe.

von Hmm (Gast)


Lesenswert?

>Nein im ernst, hab das Lernpaket durch, LED blinkt und lässt sich dimmen
>und Strom kann ich auch damit messen.

Na, das ist doch schon mal was. ;-)

Ich würde Dir aber nicht raten mittem im Rennen das Pferd, sprich: die 
Programmiersprache, zu wechseln.

C mag für Dich einfacher aussehen wenn Du den obigen Schnipsel 
anschaust, aber das ist es nicht. BASIC nimmt Dir eine Menge Arbeit ab, 
indem es Details vor Dir versteckt, die Du dann auch noch 
berücksichtigen musst.
Und angesichts von:
>Und je mehr ich lese desto komplizierter wird das für mich.
wird Dich das vorerst noch mehr frustrieren.

Du lernst mit BASIC überhaupt erstmal den uC kennen und damit hast Du 
genug zu tun.

>Gibts ne Ausnahme (SCHÄM) ?

Das kommt vor, aber viele hier und ich gehöre dazu, machen das nicht.

von Electronics'nStuff (Gast)


Lesenswert?

Also wenn du einen Schaltplan zeichnest findet sich bestimmt jemand, der 
dir dafür das Programm schreibt. Sind für jemanden mit Übung vllt. 5 
Minuten seines Lebens.

Gruss

von oldmax (Gast)


Lesenswert?

Hi

>Mir geht es erstmal rein um den Controller, ich möchte die Position
>eines Motors mittels Poti speichern und ihn bis Anschlag fahren lassen,
>dann soll er automatisch wieder zurück. Aufgrund der Platzverhältnisse
>geht nur ein Poti zur ermittlung der Position. Auf einen Endschalter
>möchte ich ebenfalls verzichten.

So, nun wird das Bild fast klar. Ein Motor steht irgendwo im Nirwana. 
Nun schaltest du den Schalter ein und er rast vor die Wand. Huch, 
schnell wieder aus und er kommt zum Ausgangspunkt zurück. Aber 
Endschalter gibts nich.
Ok, C ist einfacher wie Bascom. Das glaubst nur du. Aber egal, Bascom 
hast du scheinbar. Dann schau mal nach "Flankenerfassung". Wenn du 
deinen Schalter einschaltest, dann wechselt din Signal am Eingang, 
entweder von "0" nach "1" oder umgekehrt. Das ist eine Flanke. Nur hier 
darfst du dir den momentanen Wert des Potis einlesen. Nicht wenn das Bit 
am Eingang einen geschalteten Kontakt meldet, sondern nur in dem Moment, 
wo der Wechsel von einem Status zum anderen stattfindet. In Bascom bin 
ich leider nicht bewandert und Assembler spar ich mir mal. Aber es gibt 
die Suchfunktion und Flankenauswertung ist nun wirklich kein Geheimnis. 
Ich tipp da mal auf über hundert für dich brauchbare Antworten.
Im Übrigen, ein kleiner Rat zum Schluss, auch wenn ich es bereits 
angedeutet hatte:
Ein Programm zu schreiben geht nur, wenn man ein Problem oder eine 
Aufgabe verständlich beschreiben kann. Deine Beschreibung mag dir klar 
sein, aber mir scheint, das du nicht wirklich weißt, was du willst. Mir 
ist z.B. unklar, wieso du beim Einschalten dir einen Wert ablegen 
möchtest, der beim Abschalten wieder angefahren wird. Das Ding bleibt 
doch sowieso da und wenn du nicht Gewalt anwendest, bleibt auch der 
gespeicherte Wert für immer und Ewig der Selbe. Dann kannst du auch 
gleich eine Konstante eintragen. Und wenn die Wand nicht umgesetzt wird, 
ist das der Max-Weg. Dann kannst du auch den Istwert vom Poti dazu 
benutzen, gezielt davor anzuhalten. Die vier "Bascom"-Zeilen sollten dir 
eigentlich genug Hilfe dazu sein.
Und nun mach mal deinen Lernkasten zu und lerne Gedanken zu ordnen. Auf 
einer Logo hast du das bereits umgesetzt. Na, so groß ist der 
Schwierigkeitsgrad nicht, das du das in Baascom auch hinbekommst.
Gruß oldmax

von Vince (Gast)


Lesenswert?

oldmax schrieb:
> Mir
> ist z.B. unklar, wieso du beim Einschalten dir einen Wert ablegen
> möchtest, der beim Abschalten wieder angefahren wird.

Die Ausgangsposition ist verängerbar. Je nach lage ändert sich dann auch 
der Wert am Poti. Und da ich auf die Ausgangsposition zurück will muss 
er sich die vorher merken.

Nur die Endposition ist fest definierbar.

von Electronics'nStuff (Gast)


Lesenswert?

Vince schrieb:
> Nur die Endposition ist fest definierbar.

Fest definierbar? Was denn nun? Frei definierbar oder fest eingestellt?

von Freund Blase (Gast)


Lesenswert?

Lieber Vince,

Da du nun schon offenkundig keine Ahnung vom Programmieren hast, 
solltest du dein Vorhaben erst einmal ordentlich und detailliert 
beschreiben (quasi ein Lastenheft schreiben).

Dann würde dir und vor allem uns schon einmal klarer, worum es geht und 
wie man das Problem lösen könnte.

Und wenn du dann noch die Hosen komplett runter lässt und uns verrätst, 
wofür diese Aufgabe gelöst werden soll (Hausaufgabe  Projektarbeit  
Hobby), dann wird man dir durch deine offengelegte Ehrlichkeit viel 
schneller und besser helfen.

von Vince (Gast)


Lesenswert?

Ich fahre manuell den Motor auf die gewünschte unterste Position. Diese 
ist fest hinterlegt und soll angefahren werden.

Die Ausgangsposition, da der Motor immer anders steht muss er sich 
merken um zurück zu fahren.

von Electronics'nStuff (Gast)


Lesenswert?

Wenn du es nicht schaffst, dein Anliegen in Form einer Skizze, eines 
Schemas, eines Blockschaltbildes oder zumindest in vernünftigem Deutsch 
zu schildern, kann dir kein Mensch helfen.

Was ich bis jetzt verstanden habe von deinem Gekrakel:

- Du hast einen Motor
- Der ist auf irgend eine Art an ein Potentiometer gekoppelt
- Der fährt irgendwie rum
- Der hat eine (fest definierte) Ausgangsposition (Nullposition)
- Der soll zu Beginn deines Programmes an diese Nullposition fahren

Und wo hängst du überhaupt?

Bauteilauswahl?
Schaltplan?
Programm?

Keine Ahnung was du hast, was du willst oder ob du überhaupt ein kleines 
fitzelchen von Elektronik oder Programmierung verstehst.

von Vince (Gast)


Lesenswert?

Freund Blase schrieb:
> Und wenn du dann noch die Hosen komplett runter lässt und uns verrätst,
> wofür diese Aufgabe gelöst werden soll (Hausaufgabe  Projektarbeit
> Hobby), dann wird man dir durch deine offengelegte Ehrlichkeit viel
> schneller und besser helfen.

Hobby

Ich habe eine Kamera die ich mit einem Joystik steuern kann.
Diese Kamera steuere ich eine Belibige Position.
Jetzt möchte ich aber kurz mal runtergucken ohne an die Steuerung zu 
gehen.

Am Motor habe ich ein Poti an die Welle geflanscht.

Wenn ich einen seperaten Schalter betätige soll die Kamera runtergucken.

Meine Idee war, die Kamera manuell runter zu fahren, auf die Position 
die angefahren werden soll und den Wert den das Poti ausgibt als 
"Unterste Position" festzulegen.

Kamera guckt jetzt irgendwo hin, wenn ich jetzt den Schalter betätige, 
soll der Wert des Potis geschpeichert werden "Ausgangsposition" durch 
Joystig manuell veränderbar.

Dann soll "Ausgang 1" gesetzt werden. Die Kamera fährt runter bis 
"Unterste Position" erreicht ist.

Wenn ich nicht mehr runtergucken möchte, schalte ich den Schalter aus 
und "Ausgang 2" wird gesetzt. Die Kamera fährt zurück auf 
Ausgangsposition.

Dann ist die Kamera da wo sie vorher war.

Electronics'nStuff schrieb:
> Und wo hängst du überhaupt?
>
> Bauteilauswahl?
> Schaltplan?
> Programm?

Am Programm.

von Vince (Gast)


Lesenswert?

Das hab ich bis jetzt.
wenn ich nichts verkehrt gemacht habe dann müsste wenn der eingang 1 ist 
der Wert ausgelesen und gespeichert werden. Dann erst wird Ausgang1 
gesetz bis vorgegebene Endlage erreicht ist.


$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 32
$swstack = 5
$framesize = 20


Config Pinb.0 = Input
Config Pinb.1 = Input
Config Pinb.2 = Output
Config Pinb.3 = Output

Eingang1 Alias Portb.0
Eingang2 Alias Portb.1
Ausgang1 Alias Portb.2
Ausgang2 Alias Portb.3

Config Adc = Single , Prescaler = Auto , Reference = Avcc
 Start Adc


Dim "wert" As Integer
Dim endlage As Integer

    Do
      If Eingang1 = 1 Then
          Wert = Getadc(1) Then
             Ausgang1 Until endlage = ´xxxxx´ ; xxxx Muss Ich Festlegen

       End If

    Loop
End

von Peter D. (peda)


Lesenswert?

Electronics'nStuff schrieb:
> Wenn du es nicht schaffst, dein Anliegen in Form einer Skizze, eines
> Schemas, eines Blockschaltbildes oder zumindest in vernünftigem Deutsch
> zu schildern, kann dir kein Mensch helfen.

Ich weiß nicht, was dieses Rumgemosere soll.
Er hat hier doch die Funktion ausreichend beschrieben:

Beitrag "Re: Programmierung"

Und genau danach habe ich das Programm geschrieben:

Beitrag "Re: Programmierung"

Es fehlen nur noch ein paar Kleinigkeiten.

von Vince (Gast)


Angehängte Dateien:

Lesenswert?

Nach sehr viel lesen und einigen Fehlversuchen habe ich mich 
entschlossen mal eine kleine Skittze zu fertigen.

Dort ist mein Vorhaben zu erkennen.

Mein Lernpaket, welches ich jetzt ausführlich durchgearbeitet habe 
konzentriert sich jedoch auf eine Fränzis Eigenentwicklung.

Mit diesem Programm kann ich dann per Häckchen steuern was passieren 
soll.

Es ist jeweils ein Bascom, Assember und C Projekt auf der CD vorhanden 
welche im Buch recht dürftig beschrieben sind.

Ich bräuchte doch nochmal Hife von Euch.

von oldmax (Gast)


Angehängte Dateien:

Lesenswert?

Ok, jetzt hab ich s verstanden. Du hast eine Kamera, die zum Zeitpunkt x 
einen analogen Wert abhängig von einer variablen Position liefert. Nun 
möchtest du einen gezielten Blick in eine Richtung werfen ( Festpunkt). 
Wenn du alles gesehen hast, dann soll die Kamera ihre letzte Position 
einnehmen. Diese Position wird nicht über die Antriebsgeschichte 
verändert. Dieser Punkt ist mir noch nicht ganz klar, aber für das 
Prinzip ist das unerheblich. Wert.
In dem Moment, wenn du den Schalter umlegst, hast du eine Flanke des 
Eingangssignales. Hab ich aber schon geschrieben, Stichwort 
"Flankenbildung". Zu dieser Flanke setzt du dir ein Bit. Und nur, wenn 
diese Flanke erkannt wird, setzt du das Bit ! Das ist entsscheidend. Nun 
schaust du in deinem Programm, ob dieses Bit gesetzt ist und wenn, dann 
merkst du dir den Wert des Potis. Dann, und auch das ist wichtig, setzt 
du das Bit zurück. Nun ist die Position gespeichert und wird erst wieder 
neu gesetzt, wenn genau die gleiche Flanke das Bit wieder setzt. Also, 
ich weiß, das es manchmal schwierig ist, etwas umzusetzen, aber du musst 
dazu wissen, das ein Controller sein Programm immer schön der Reihe nach 
abarbeitet.(Interrupts (fast) ausgenommen).
Du liest die Eingänge ein und vergleichst diese mit einem hinterlegten 
Wert. Sind sie gleich, also entweder beide "1" oder beide "0" ist keine 
Änderung. Sind sie unterschiedlich, hat sich der Eingang geändert. 
(Flanke).  Eine solche Operation erledigt ein XOR oder EOR oder Klartext 
: Exclusiv Oder. Anhand der neuen Lage kannst du erkennen, ob es ein 
kommendes oder gehendes Ereignis ist. Alter Wert AND Ergebnis aus 
Vergleich  ist Flanke von "1" nach "0". Neuer Wert AND Ergebnis aus 
Vergleich ist Flanke von "0" nach "1". Nun setzt du ein Bit und 
schreibst den neuen Status vom Eingang in den hinterlegten Wert. Fertig.
Schau dir dazu mal die Skizze an
Gruß oldmax

von vince (Gast)


Lesenswert?

Hab mich jetzt mal für Bascom entschieden und Festgelegt.
Aktuell hab ich jetzt das.
Was ist alles falsch?

1
$regfile = "attiny13.dat"
2
$crystal = 9600000
3
4
$hwstack = 32
5
$swstack = 5
6
$framesize = 20
7
8
Config Pinb.0 = Input
9
Config Pinb.4 = Input
10
Config Pinb.2 = Output
11
Config Pinb.3 = Output
12
13
Signal Alias Pinb.0
14
  Poti Alias Pinb.4
15
  Hoch Alias Pinb.2
16
Runter Alias Pinb.3
17
18
Config Adc = Single , Prescaler = Auto , Reference = Avcc
19
Start Adc
20
21
Dim "X" As Integer
22
23
24
Do
25
26
If Signal = 1 ; Schalter Auf An
27
   Then ; Dann
28
   X = Getadc(2) ; Wert Am Poti Auslesen Und Speichern
29
   Runter = 1 ; Und Runterfahren
30
   Until ; Bis
31
   Poti = Xxxxxx ; Wert Am Poti = Unterste Position Muss Ich Noch Festlegen
32
End If
33
34
If Signal = 0 ; Wenn Schalter Auf Aus
35
   Then ; Dann
36
   Hoch = 1 ; Hochfahren
37
   Until ; Bis
38
   Poti = X ; Wert Am Poti = Gespeicherter Wert
39
Loop
40
End

von Karl H. (kbuchegg)


Lesenswert?

vince schrieb:
> Hab mich jetzt mal für Bascom entschieden und Festgelegt.
> Aktuell hab ich jetzt das.
> Was ist alles falsch?

So ziemlich alles

> If Signal = 1 ; Schalter Auf An
>    Then ; Dann
>    X = Getadc(2) ; Wert Am Poti Auslesen Und Speichern
>    Runter = 1 ; Und Runterfahren
>    Until ; Bis
>    Poti = Xxxxxx ; Wert Am Poti = Unterste Position Muss Ich Noch
> Festlegen
> End If

Du kannst nicht einfach hergehen und deine Gedanken einfach so in 
englische Wörter übersetzen.
Programmiersprachen folgen Regeln! Du musst dich an diese Regeln 
anpassen und nicht umgekehrt.

Such dir erst mal ein BASCOM Tutorial und fang mit den Grundlagen an. 
Und ja, das beinhaltet auch, wie die Programmiersprache funktioniert.
Sonst hat das alles keinen Sinn.

von oldmax (Gast)


Lesenswert?

Hi
Nun hab ich dir so schön versucht, Flankenbildung und deren Bedeutung zu 
erklären. Ich geb's auf. Ein "Then" brauchst du nicht mit "dann" zu 
kommentieren. Aber, wenn du einen Potiwert einliest, wenn ein Schalter 
betätigt ist wirst du nie eine Position speichern können. Im nächsten 
Zyklus liest du wieder Den Wert ein und immer wieder. DU MUSST EINE 
FLANKE BILDEN UND DANN DEN WERT ABSPEICHERN!! Ausserdem solltest du auch 
mal auf die hören, die dir Tipps geben und die nicht total ignorieren. 
Mit einer anderen Sprache anzufangen ist nicht die Lösung.
Gruß oldmax

von vince (Gast)


Lesenswert?

zum Thema Flanke:

So vielleicht?

dim an as byte
din aus as byte
dim flanke as byte

do
         an = pinb.x
         flanke = an xor aus
         if flank = 1 then
               rising
         else
               falling
         end if
end if
an = aus
loop

von oldmax (Gast)


Lesenswert?

Hi
Ok, nagelt mich jetzt nicht auf den Syntax fest, BASCOM ist halt nicht 
mein Ding...

vince schrieb:
> So vielleicht?
>
>
>
> dim an as byte
>
> din aus as byte
>
> dim flanke as byte
>
>
>
> do
>
>          an = pinb.x
>
>          flanke = an xor aus
>
>          if flank = 1 then
>
>                rising
>
>          else
>
>                falling
>
>          end if
>
> end if
>
> an = aus
>
> loop

Nicht wirklich, eher so
Variable ist nur ein Bit ! Allerdings weiß ich nicht, ob das Bit so 
zugeordnet werden kann. Wie gesagt, BASCOM ist nicht mein Ding. Zum 
Verständnis sollte es aber reichen.

dim neu as bool   ; damit du erkennst, welches der neue Status ist !
dim alt as bool   ; und natürlich auch den alten !
dim wechsel as Bool ; das Ergebnis aus XOR ist keine definierte Flanke

dim flanke_To_High as bool  ; das ist Wechsel von 0 nach 1 !
dim flanke_To_Low as bool  ; das ist Wechsel von 1 nach 0 !

do
  neu = pinb.x        ; Bit einlesen, kein Byte
  Wechsel = neu xor alt
  if Wechsel = 1 then
    flanke_To_High = Neu and Wechsel  ; kommentarlos
    flanke_To_low = alt and Wechsel
    alt=neu   nur hier musst du alt neu besetzen da Äanderung vom Status
  end if
  if flanke_to_High then  ; aha, Taster betätigt
      ; mach was
      Flanke_to_High = False     ; Flankenmerker zurücksetzen
  end If

loop


Nun noch was zur Signallage. In der Regel werden Kontakte gegen GND 
gelegt, damit der interne PullUp Widerstand genutzt werden kann. Dann 
ist natürlich "Taster betätigt = 0", also entgegen der Denkrichtung. 
Damit im Programm aber mit "Taster betätigt = 1" gearbeitet werden kann 
drehe ich das eingelesene Bit. So ist es einfacher, den Kontakt im 
Programm zu bearbeiten und man kommt durch die verdrehte Logik nicht 
durcheinander.
Gruß oldmax

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.