mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Ports in echtzeit ansprechen.


Autor: Vitali (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: rene (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Vitali (Gast)
Datum:

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

Gruß
Vitali

Autor: Vitali (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Programmschnipsel ist für für einen PIC

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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





Autor: Vitali (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.