Forum: Mikrocontroller und Digitale Elektronik Multiplexing HILFE


von Lukas S. (asdf)


Lesenswert?

Hallo erstmal ich habe eigentlich kaum Ahnung von der programmierung 
eines Pics deshalb benötige ich eure Hilfe. Danke schonmal im vorraus.

Wir müssen an unserer Schule eine Schulterschiene machen und ich und 
mein Freund müssen die nötige Software für jene proggen.

Als Pogrammieroberfläche benutzen wir MPLAB.Mein Problem ist nun 
folgendes ich muss einen Eingang des Pics mit einem multiplexverfahren 
abfragen ich kann mir vorstellen was das ist habe aber keine ahnung wie 
das funktioniert.

Ich habe mir das irgendwie so vorgestellt



while(1){

if(a==1){

blabla

}
}

das ist ansich ok das problem ist das der eingang nur dann auf 1 
schaltet wenn ein Taster gedrückt wird und man müsste genau dann drücken 
wenn die If schleife abgefragt wird und hat somit eigentlich keine 
chance diese auszuführen bin für jeden Source code dankbar.

von Lukas S. (asdf)


Lesenswert?

hmm anscheinend habe ich mich getäuscht indem was ich gesagt habe und 
hab erstma anschiss vom vom lehrer bekommen zurecht also werd ich das 
ganze in ruhe noch einmal erklären .


mir ham ne Tastatur matrix mit 12 Tasten d.h. da das ne matrix is und 
die einzelnen segmente harwaremäßig irgednwie ausgewählt werden brauch 
ich weniger I/O ports am pic selber um die Tastatur zu interpretieren 
das problem ist das selbe ich brauch nen source code mit dem diese 
12ermatrix abgefragt wird danke.

von Karl H. (kbuchegg)


Lesenswert?

Lukas Spielberger wrote:

> Ich habe mir das irgendwie so vorgestellt
>
>
>
> while(1){
>
> if(a==1){
>
> blabla
>
> }
> }
>
> das ist ansich ok das problem ist das der eingang nur dann auf 1
> schaltet wenn ein Taster gedrückt wird und man müsste genau dann drücken
> wenn die If schleife abgefragt wird und hat somit eigentlich keine
> chance diese auszuführen

?
Bist du dir im klaren wie schnell ein µC arbeitet.
Das Gegenteil ist eher der Fall: Du wirst mit diesem Code (sofern
man das überhaupt Code nennen kann) Schwierigkeiten haben, das if
nur einmal ausführen zu lassen, wenn du einmal die Taste drückst.
Je nach Taktfrequenz des Prozessors sieht der in jeder Sekunde
mindestens 100000 mal am Port nach ob die Taste gedrückt ist.
So schnell kannst noch nicht mal du eine Taste drücken und wieder
loslassen.

von Karl H. (kbuchegg)


Lesenswert?

Lukas Spielberger wrote:
> hmm anscheinend habe ich mich getäuscht indem was ich gesagt habe und
> hab erstma anschiss vom vom lehrer bekommen zurecht also werd ich das
> ganze in ruhe noch einmal erklären .
>
>
> mir ham ne Tastatur matrix mit 12 Tasten d.h. da das ne matrix is und
> die einzelnen segmente harwaremäßig irgednwie ausgewählt werden brauch
> ich weniger I/O ports am pic selber um die Tastatur zu interpretieren
> das problem ist das selbe ich brauch nen source code mit dem diese
> 12ermatrix abgefragt wird danke.


Ne.ne.
Dein Lehrer hat euch diese Aufgabe sicherlich nicht gegeben
damit ihr ins nächste Forum geht und euch dort sowohl
Hardware als auch Software erschnorrt.

Wenn du konkrete Probleme hast: Bitte gerne
Aber so ein Rundumschlag: Nein, danke

von Lukas S. (asdf)


Lesenswert?

Bei der weilschleife einen delay setzen macht das sinn ?

von Torben (Gast)


Lesenswert?

>mir ham ne Tastatur matrix mit 12 Tasten d.h. da das ne matrix is und
>die einzelnen segmente harwaremäßig irgednwie ausgewählt werden brauch
>ich weniger I/O ports am pic selber um die Tastatur zu interpretieren
>das problem ist das selbe ich brauch nen source code mit dem diese
>12ermatrix abgefragt wird danke.

Schonmal was von google gehoert?

>Ne.ne.
>Dein Lehrer hat euch diese Aufgabe sicherlich nicht gegeben
>damit ihr ins nächste Forum geht und euch dort sowohl
>Hardware als auch Software erschnorrt.

>Wenn du konkrete Probleme hast: Bitte gerne
>Aber so ein Rundumschlag: Nein, danke

Sehe ich genauso.

von Lukas S. (asdf)


Lesenswert?

Ihr könntet mir ja sagen ob der ansatz richtig ist sonst verwerf ich das 
ganze mal bzw. könntet ihr mir eine einfache Tastaturmatrix erklären 
falls ihr lust und laune habt. bzw. wenn ich bei google was gefunden 
hätte wäre ich net hier.

Mir würde es schon reichen wenn mir jemand erklären würde wie ich das 
mit der einen Taste mache danke

von Falk B. (falk)


Lesenswert?

@ Lukas Spielberger (asdf)

>hmm anscheinend habe ich mich getäuscht indem was ich gesagt habe und
>hab erstma anschiss vom vom lehrer bekommen zurecht also werd ich das

Liest der hier mit ? ;-)

>mir ham ne Tastatur matrix mit 12 Tasten d.h. da das ne matrix is und
>die einzelnen segmente harwaremäßig irgednwie ausgewählt werden brauch
>ich weniger I/O ports am pic selber um die Tastatur zu interpretieren

So sieht es aus.

>das problem ist das selbe ich brauch nen source code mit dem diese
>12ermatrix abgefragt wird danke.

Irrtum, DU sollst ihn dir ERARBEITEN. Nicht nur Copy & Paste.

Hier ein paar kleine Ansatzpunkte.

Multiplexen
Beitrag "Matrixtastatur am AVR"

Ist zwar für den AVR, das Prinzip ist aber beim PIC genauso.

MFG
Falk

von Lukas S. (asdf)


Lesenswert?

dankeschön

von Lukas S. (asdf)


Lesenswert?

Mir ist nun fast alles klar ich verstehe diese 4*4 Matrix und wie ich 
das einlesen muss also mit den Reihen und dann die ganze Spalte abfragen 
um die entsprechende Tast ezu erhalten ich habe mir das so vorgestellt:

Ich frage alle 8 Leitungen permanent und falls z.B. PB5(1) und PB3(0) 
ist erhalte ich meine gewünschte Taste löse einen Interrupt aus der mir 
dann die gewünschte Funktion ausführt. Programmiertechnisch alles kein 
Problem bis auf dieses dauerhafte abfragen ich habe das bisher nur mit 
Polling gemacht würde gerne wissen ob das dauerhatfe Abfragen so geht 
:main()
{


  while(true)

  {

    delay(30ms)
    if(input(pin_a0)){

      }



  }

von Thorsten (Gast)


Lesenswert?

Schonmal nen Timer mit passendem Interrupt verwendet? Sowas wird i.d.R. 
für Tastergeschichten ganz gern genommen. Ich hab keine Ahnung von PICs, 
da musste selber mal im Datenblatt gucken gehen.

von Lukas S. (asdf)


Lesenswert?

Du meinst einen Interrupt der z.b. alle 20ms ausgeführt wird und welcher 
dann alle Ports der matrix abfragt ?

von Karl H. (kbuchegg)


Lesenswert?

Lukas Spielberger wrote:

> Problem bis auf dieses dauerhafte abfragen ich habe das bisher nur mit
> Polling gemacht würde gerne wissen ob das dauerhatfe Abfragen so geht
>
> :main()
> {
>
>   while(true)
>   {
>     delay(30ms)
>     if(input(pin_a0)){
>
>       }
>   }

Das ist Polling!
Polling nennt man es wenn man ständig die Eingänge abfragt.
Im Gegensatz zum Interrupt, bei dem sich Eingang 'selbsttätig'
beim Programm meldet um mitzuteilen, dass sich etwas ereignet
hat.

Damit pollt deine Schleife ständig den pin_a0 (wenn ich
das input(pin_a0) mal richtig interpretiere.

Der delay ist wahrscheinlich nicht unbedingt notwendig, könnte
aber in einem ersten Ansatz mal das Prellen etwas dämpfen.
Schön ist es nicht, aber im Moment hast du ganz andere
Probleme als eine Diskussion über Tasten-prellen.

> Programmiertechnisch alles kein Problem

Deinen Optimismus möchte ich haben :-)
Aber ich will dich nicht abhalten.

von M. V. (-_-)


Lesenswert?

>würde gerne wissen ob das dauerhatfe Abfragen so geht

Nein, geht es nicht.
Wenn man Buttons abfragt, sollte man eine Flankenerkennung verwenden, 
dahinter eine kleine Verzögerung, um das Prellen nicht als weitere 
Flanken mitzuzählen, dann nachsehn, ob sich nochmals was am Pin-zustand 
geändert hat...

Siehe dazu:
Entprellung
AVR-Tutorial: Tasten

oder auch diverse Beiträge in der Codesammlung.

von Lukas S. (asdf)


Lesenswert?

Naja Programmiertechnisch alles kein Problem

isses ja wirklich nicht ich programmier einen interrupt der alle 20ms 
ausgeführt wird (kann ich) der dann alle Ports abfragt ( auch kein 
Problem) und da ich 4*4 hab benutz ich ein Array indem 8 Bits drinnen 
sind und der Interrupt vergleicht dann immer die Speicher und falls 
dieser sich verändert tja da fällt mir schon was ein ...

von Karl H. (kbuchegg)


Lesenswert?

Irgendwie erinnert mich das an Buzzword-Bingo  :-)

von Falk B. (falk)


Lesenswert?

@  Karl heinz Buchegger (kbuchegg)

>Irgendwie erinnert mich das an Buzzword-Bingo  :-)

Na wnn du auf die Semaphore atomar einen Taskswitch castest, dann ist 
klar dass der Scheduler nicht reentrant auf dein Array zugreifen kann, 
weil . . .

;-)

MFG
Falk

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.