Forum: Mikrocontroller und Digitale Elektronik Ports in echtzeit ansprechen.


von Vitali (Gast)


Lesenswert?

Guten Abend,

ich habe da ein Problem mit meiner 8x8 LED-Matrix und hoffe Ihr könnt 
mir dabei helfen. Ich habe leider noch nicht so viel Erfahrung mit uC 
und arbeite daher mit BASIC.

Problem:
Eine 8x8 LED-Matrix soll verschiedene Muster (Unterprogramme) 
abarbeiten.
Über ein Taster möchte ich zwichen den Unterprogrammen springen.
Der Taster soll jedoch in echtzeit abgefragt werden. Das heißt, wenn 
sich das Programm gerade in einer Schleife befindet (Muster abarbeitet) 
möchte ich diese Prozedur mit einem Tastendruck unterbrechen und z.B die 
Variable counter um 1 zu adieren.

Ich stelle mir das ungefähr so vor:

start:
counter = counter + 1
if counter = 1 then goto programm1
if counter = 2 then goto programm2

programm1:
darstellung muster 1
if porta.0 = 1 then goto start
goto programm1

programm2:
darstellung muster 2
if porta.0 = 1 then goto start
goto programm2

Ich denke in dieser Lösung sind einige Fehler bezüglich der Logik.
Also bitte ich euch mal um Rat.

von Frank (Gast)


Lesenswert?

da wirst du um Interrupte nicht herumkommen. Entweder du lässt deine 
Lichtspielerei interruptgesteuert laufen und fragst im Hauptprogramm die 
Taste ab oder umgekehrt. Kannste dir aussuchen.

bye

Frank

von Peter D. (peda)


Lesenswert?

Vitali wrote:

> Über ein Taster möchte ich zwichen den Unterprogrammen springen.
> Der Taster soll jedoch in echtzeit abgefragt werden. Das heißt, wenn
> sich das Programm gerade in einer Schleife befindet (Muster abarbeitet)
> möchte ich diese Prozedur mit einem Tastendruck unterbrechen und z.B die
> Variable counter um 1 zu adieren.

Nun, es gibt 2 Ansätze:

1.
Du rufst die Tastenabfrage einfach in jeder Schleife auf und verläßt die 
Schleife dann.

2.
Da alle Schleifen ja genau das gleiche machen, nimmst Du auch nur eine 
Schleife und der Tastendruck zählt dann nur die Nummer der 
Mustertabellen (2-dimensionales Array) hoch.



Wichtig ist ne ordentlich Entprellung und Flankenerkennung.
Dazu hat sich eigentlich nur der Timerinterrupt bestens bewährt.


Peter

von rene (Gast)


Lesenswert?

Wenn es sich um eine manuell betaetigte Taste handelt, sollte eine 
Auswertung alle 10ms genuegen. Da kann man die LEDs getrost beenden. 
Derselbe Timertick kann auch angewendet werden um die Taste zu 
entprellen


rene

von Vitali (Gast)


Lesenswert?

Ich danke Euch für die schnelle Antwort.
Werde mich dann erstmal in das Thema Interrups reinlesen.

Gruß
Vitali

von Vitali (Gast)


Lesenswert?

Hallo nochmal.

Ich habe im Netz leider nichts brauchbares gefunden, ausser ein paar 
Grundlagen. Mein Problem ist aber auch dass ich nur leichtes Basic kann.
Die meisten Beispiele sin in C oder ASM.
Habe nur ein kleines Codebeispiel in Basic gefunden, kann damit aber 
nicht viel anfangen. Wäre echt super wenn mir das jemand erklähren 
könnte.
Hier das Codebeispiel:

Dim a As Byte
a = 255
TRISA = 0
PORTA = a
INTCON.INTE = 1
Enable
End
On Interrupt
a = a - 1
PORTA = a
INTCON.INTF = 0
Resume

Ich müsste eigentlich nur wissen wie ich mit einem Taster
( z. B. wenn porta.0 = 1 dann springe zu einem Punkt.)

Sorry bin halt Anfänger...

Gruß
Vitali

von ich (Gast)


Lesenswert?

Das Programmschnipsel ist für für einen PIC

von Peter D. (peda)


Lesenswert?

Vitali wrote:

> Dim a As Byte
> a = 255
> TRISA = 0
> PORTA = a
> INTCON.INTE = 1
> Enable
> End
> On Interrupt
> a = a - 1
> PORTA = a
> INTCON.INTF = 0
> Resume

...

> Sorry bin halt Anfänger...


Auch als Anfänger hast Du das Recht, Deinen Kode kommentieren zu dürfen.
Ausreden zählen nicht !

Was soll das da oben denn sein ?


Peter

von Peter D. (peda)


Lesenswert?

Vitali wrote:

> Ich müsste eigentlich nur wissen wie ich mit einem Taster
> ( z. B. wenn porta.0 = 1 dann springe zu einem Punkt.)

So gehts eben genau nicht.
Du würdest mit „wahnsinniger Geschwindigkeit“ umherspringen.

Daher mußt Du den 0->1 Wechsel auswerten, nicht den 1-Zustand.

Lies mal im Tutorial "Entprellen"


Peter

von Gerhard (Gast)


Lesenswert?

Hallo ,

falls du in Bascom programmierst
dann schau dir mal den Befehl Debounce an
der beinhaltet all das was du brauchst :
Entprellung, Sprung ins Unterprogramm ....


Gruss Gerhard





von Vitali (Gast)


Lesenswert?

Danke für die Hilfe, hat mir echt weitergeholfen.
Experementiere zur Zeit mit dem XPort herum.
Ist echt spannend...

P.S. Gehört hier fielleicht nicht rein, aber weis jemand wie ich eine 
Weboberfläche erstelle, die mir den Status des Kontrolers anzeigt?


Gruß
Vitali

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.