Forum: Mikrocontroller und Digitale Elektronik Anfängerfrage PIC


von Thomas M. (guitarist2007)


Lesenswert?

Hallo,

ich bin erst seit heute hier im Forum angemeldet. Also habt etwas 
nachsicht, falls meine Frage schon irgendwo hier beantwortet wurde :)

Ich plane zur Zeit die Programmierung eines PICs. Ich schwanke zur Zeit 
zwischen der PIC16 Serie und den 18ern.
Meine Frage ist nun wieviele I/Os man braucht um mind. 21 Taster und pro 
Taster eine LED sowie ein LCD Display über eine 8Bit Schnittstelle zu 
verarbeiten. Die Taster sind in der Form OFF(ON) und das Display ist ein 
blau/weißes von Conrad.
Der Controller soll folgendes später erledigen.

1. Wird ein Taster gedrückt soll der Controller über ein Ausgabepin eine 
Nachricht an ein extern verbundenes Gerät schicken.

2. Es soll eine LED abwechselnd ein und ausgeschaltet werden (pro Taster 
eine LED)

3. Auf dem Display soll angezeigt werden welches Programm nun aufgerufen 
wurde.

Sind Taster in der Art Aus(An) dafür geeignet und wieviele I/Os braucht 
der PIC für diese Aufgaben?

Danke schonmal im Voraus
Christoph

von Falk (Gast)


Lesenswert?

@Thomas Müller

>Ich plane zur Zeit die Programmierung eines PICs. Ich schwanke zur Zeit
>zwischen der PIC16 Serie und den 18ern.

Dazu kann ich nix sagen, kenn mich mit dem PICs nicht aus.

>Meine Frage ist nun wieviele I/Os man braucht um mind. 21 Taster und pro
>Taster eine LED sowie ein LCD Display über eine 8Bit Schnittstelle zu
>verarbeiten. Die Taster sind in der Form OFF(ON) und das Display ist ein
>blau/weißes von Conrad.

Das kann eigentlich jeder PIC mit ner Handvoll IOs. Denn die Taster als 
auch die LEDs wird man sinnvollerweise per Schieberegister lesen bzw. 
Steuern.

Guggst du hier.

http://www.mikrocontroller.net/articles/Porterweiterung_mit_SPI

>Sind Taster in der Art Aus(An) dafür geeignet und wieviele I/Os braucht

Ja.

>der PIC für diese Aufgaben?

Ein Dutzend ist mehr als genug.

MFG
Falk

von Severino R. (severino)


Lesenswert?

Willkommen,  Thomas Müller (oder Christoph, was jetzt?)

> Ich plane zur Zeit die Programmierung eines PICs. Ich schwanke zur Zeit
> zwischen der PIC16 Serie und den 18ern.

In beiden Familien gibt es Typen mit genügend I/O Ports.

In welcher Programmiersprache willst Du das Ding schreiben?

> Meine Frage ist nun wieviele I/Os man braucht um mind. 21 Taster und pro
> Taster eine LED sowie ein LCD Display über eine 8Bit Schnittstelle zu
> verarbeiten. Die Taster sind in der Form OFF(ON) und das Display ist ein
> blau/weißes von Conrad.

Die Farbe des Displays hat einen vernachlässigbaren Einfluss auf die 
Anzahl I/O ;-)

Wenn Du die Taster und die Leds als Matrix organisierst, brauchst Du 10 
Pins für die Taster und 10 für die Leds (jeweils in 5x5 Anordnung).

Das LCD braucht noch 8+3 I/O, macht Total 31, was z.B. für den 
verbreiteten PIC16F877A kein Problem darstellt.
Es gibt bei www.microchip.com Application Notes, die zeigen, wie man 
Pins sparen kann. Z.B. kannst Du die 8 Datenleitungen des LCD auch für 
die Tasterabfrage brauchen, da sie nur während der Datenübertragung an 
das LCD genutzt werden, also nicht ständig.
Microchip zeigt auch, wie man Tasteneingänge und LED-Ausgänge 
multiplexen kann (falls überhaupt nötig, denn das erhöht die komplexität 
der Software).

> Der Controller soll folgendes später erledigen.
>
> 1. Wird ein Taster gedrückt soll der Controller über ein Ausgabepin eine
> Nachricht an ein extern verbundenes Gerät schicken.

Oh, noch ein Pin, macht 32. Wie denn? RS232 oder so?
>
> 2. Es soll eine LED abwechselnd ein und ausgeschaltet werden (pro Taster
> eine LED)
>
> 3. Auf dem Display soll angezeigt werden welches Programm nun aufgerufen
> wurde.
>
> Sind Taster in der Art Aus(An) dafür geeignet und wieviele I/Os braucht
> der PIC für diese Aufgaben?
>
> Danke schonmal im Voraus
> Christoph

Gern geschehen, viel Spass

Severino

von Thomas M. (guitarist2007)


Lesenswert?

Ok,

das klingt ja schonmal recht gut. Wie sieht es denn bei der Technik mit 
Schieberegistern mit dem Zeitverhalten aus?
Da ich die Umschaltung von Effektgeräten (via MIDI) plane, wäre es schon 
gut, wenn hier eine möglichst geringe Zeitdifferenz zwischen schalten 
des Tasters und senden der Nachricht vergeht.

von Falk (Gast)


Lesenswert?

@Thomas Müller

>das klingt ja schonmal recht gut. Wie sieht es denn bei der Technik mit
>Schieberegistern mit dem Zeitverhalten aus?
>Da ich die Umschaltung von Effektgeräten (via MIDI) plane, wäre es schon
>gut, wenn hier eine möglichst geringe Zeitdifferenz zwischen schalten
>des Tasters und senden der Nachricht vergeht.

Dann nenn doch mal ein paar Zeiten. 10ms Verzögerung sind problemlos 
erreichbar, ggf. auch weniger.

MFG
Falk

von Thomas M. (guitarist2007)


Lesenswert?

Also bei den Zeiten ist natürlich je weniger desto besser. Ich denke 
mal, dass 10ms durchaus kurz genug sind.

Was mir bei diesem Projekt am liebsten wäre ist ein PIC den man über ein 
USB Interface mit einem PC verbinden kann (z.B. um Presets zu kopieren, 
etc.) Diese Presets sagen eigentlich nur, welche Nachricht via MIDI 
geschickt werden soll, sobald eine bestimmte Taste gedrückt wird.
Später soll vielleicht auch ein Expression-Pedal (=Poti) angeschlossen 
werden können so dass der Controller den Wiederstandswert errechnet und 
diesen dann in einen Wert von 0-127 umwandelt um damit z.B. die 
Lautstärke oder andere Parameter in Echtzeit zu steuern.
Also wären 10ms ein guter Wert für sowas, oder?

Ob Assembler oder C ist mir eigentlich egal. Ich vermute, dass Assembler 
für zeitkritische Anwendungen vielleicht besser geeignet ist und ehrlich 
gesagt hätte ich auch Lust dazu mich mit der Sprache zu beschäftigen. C 
ist aber auch kein Problem, da ich schon viel damit programmiert habe.

Achja zu Thomas. Ist der Zweitname. Mein Fehler :o)

von Meister E. (edson)


Lesenswert?

Thomas Müller wrote:

> Diese Presets sagen eigentlich nur, welche Nachricht via MIDI
> geschickt werden soll, sobald eine bestimmte Taste gedrückt wird.
> Später soll vielleicht auch ein Expression-Pedal (=Poti) angeschlossen
> werden können so dass der Controller den Wiederstandswert errechnet und
> diesen dann in einen Wert von 0-127 umwandelt um damit z.B. die
> Lautstärke oder andere Parameter in Echtzeit zu steuern.
> Also wären 10ms ein guter Wert für sowas, oder?
>
> Ich vermute, dass Assembler für zeitkritische Anwendungen
> vielleicht besser geeignet ist und ehrlich
> gesagt hätte ich auch Lust dazu mich mit der Sprache zu beschäftigen.

Da Du nur MIDI senden willst, ist das in Assembler ne nette 
Programmierübung.
(Damit meine ich nicht die USB-Einbindung) 10ms sind für MIDI ein 
akzeptabler Wert, man geht in der Theorie von 20ms aus. Ab da werden die 
Latenzzeiten hör- bzw. spürbar wenn man ein MIDI-Keyboard nutzt. Ich 
habe bei 20ms schon meine Zweifel, aber zehn sind ok. Würde über den 
Daumen gepeilt für 8 Controller reichen. Die Länge der MIDI-Befehle kann 
ja gewaltig variieren, wenn man Controller, Noten und SySEX vergleicht. 
Aber gut 1ms geht immer drauf.

Viel Spass bei diesem Projekt, es eignet sich echt um Assembler gut zu 
nutzen

Gruss,
Edson

von Severino R. (severino)


Lesenswert?

@Christoph

> Was mir bei diesem Projekt am liebsten wäre ist ein PIC den man über ein
> USB Interface mit einem PC verbinden kann (z.B. um Presets zu kopieren,
> etc.) Diese Presets sagen eigentlich nur, welche Nachricht via MIDI
> geschickt werden soll, sobald eine bestimmte Taste gedrückt wird.

PIC18F4x5x haben USB integriert, siehe auch:
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2124&param=en022613&page=wwwFullSpeedUSB

> Später soll vielleicht auch ein Expression-Pedal (=Poti) angeschlossen
> werden können so dass der Controller den Wiederstandswert errechnet und
> diesen dann in einen Wert von 0-127 umwandelt um damit z.B. die
> Lautstärke oder andere Parameter in Echtzeit zu steuern.

Also noch ein Pin, und mit ADC. Ok ist auch integriert.

Zu PIC18 gibt es von Microchip eine kostenlose Student-Version des 
C-Compilers C18. Und einen ganzeh Haufen Applicaton Notes.

Severino


von Thomas M. (guitarist2007)


Lesenswert?

Hallo,

also zuerst einmal vielen Dank für eure Hilfen.

Meine Einkaufsliste würde momentan wie folgt aussehen. Da es für USB 
Implementierungen glaub ich nur C-Beispiele gibt werde ich wohl das 
komplette Projekt damit umsetzen.

PIC18F2550

Zusätzlich möchte ich noch einen oder zwei 64K EEPROM a la 24LC64P 
verwenden um möglichst viele Presents speichern zu können.
So wie ich es verstanden habe läuft das Laden und Schreiben in einen 
Speicher über I2C. Laut sprut.de besitzt der PIC eine SPP welche für SPI 
(für die Input/Output-Erweiterung) und I2C (Speicher) genutzt werden 
kann. Ist die Nutzung exklusiv oder kann ich je nach Anforderung hin und 
her schalten? Was würde z.B. mit LEDs passieren, die ich über einen 
74HC595 an und ausschalte, wenn ich den SPP als I2C nutze. Würden die 
LEDs dann weiter leuchten oder hab ich da jetzt irgendwas falsch 
verstanden?

Grüße
Christoph

von Falk (Gast)


Lesenswert?

@ Thomas Müller

>her schalten? Was würde z.B. mit LEDs passieren, die ich über einen
>74HC595 an und ausschalte, wenn ich den SPP als I2C nutze. Würden die
>LEDs dann weiter leuchten oder hab ich da jetzt irgendwas falsch
>verstanden?

Die leuchten weiter. Du musst nur dafür sorgen, dass dein Programm die 
Finger vom LATCH Signal der Schieberegiser lässt (damit werden neue 
Daten vom Schieberegister in das Speicherregister geladen).

Viel Erfolg
Falk

von Selmak (Gast)


Lesenswert?

>>Ich plane zur Zeit die Programmierung eines PICs. Ich schwanke zur Zeit
>>zwischen der PIC16 Serie und den 18ern.

>Dazu kann ich nix sagen, kenn mich mit dem PICs nicht aus.

Klasse, hauptsache mal was abgelassen.

von Peter D. (peda)


Lesenswert?

Thomas Müller wrote:

> Zusätzlich möchte ich noch einen oder zwei 64K EEPROM a la 24LC64P
> verwenden um möglichst viele Presents speichern zu können.

Warum nimmst Du dann nicht gleich nen AT24C512 ?


> So wie ich es verstanden habe läuft das Laden und Schreiben in einen
> Speicher über I2C. Laut sprut.de besitzt der PIC eine SPP welche für SPI
> (für die Input/Output-Erweiterung) und I2C (Speicher) genutzt werden
> kann.

Ich würde dazu raten, das in Software zu machen.
Ist kaum langsamer oder größer, aber dafür wesentlich universeller 
(jeder Portpin nutzbar, portabel auf andere MCs).
Ist ne gute Lernmethode, um I2C und SPI zu verstehen, d.h. man hats 
später viel leichter, wenn man wieder sowas braucht.
Wenn einem etwas unklar ist, kann man bequem nach jedem Bit ne 
Testausgabe einfügen.

Ich kenne zwar nur SW-SPI und SW-I2C Beispiele für 8051, AVR aber C läßt 
sich ja relativ einfach auf andere MC-Typen anpassen. Sprut hat bestimmt 
auch welche für PIC.


Peter

von Peter D. (peda)


Lesenswert?

Thomas Müller wrote:

> Ob Assembler oder C ist mir eigentlich egal. Ich vermute, dass Assembler
> für zeitkritische Anwendungen vielleicht besser geeignet ist


Das wird gerne von C-Hassern so behauptet, aber in der Realität sind 
C-Programme kaum größer und langsamer (etwa 20%) als Assembler.

Wichtig ist eigentlich nur, es in C so zu machen, wie man es in 
Assembler gemacht hätte.
D.h. wenn man in Assembler ein Byte nimmt, muß man in C auch unsigned 
char nehmen und nicht int, long oder gar double float.

Es kann daher überhaupt nichts schaden, wenn man erstmal ein bischen 
Assembler gemacht hat. Dann kann man sich das C-Listing angucken, ob man 
irgendwo zu verschwenderisch war.

Ich habe zuerst Assembler gelernt und dann C, indem ich in das Listing 
geschaut habe, um zu prüfen, ob der Compiler mich so verstanden hat, wie 
ich es gemeint hatte.
Und man weiß dann auch, wie so ein Compiler denkt, welche Ausdrücke er 
mag und welche nicht.


Peter

von Dirk H. (arm-dran)


Lesenswert?

Peter Dannegger wrote:

> Das wird gerne von C-Hassern so behauptet, aber in der Realität sind
> C-Programme kaum größer und langsamer (etwa 20%) als Assembler.
>
> Wichtig ist eigentlich nur, es in C so zu machen, wie man es in
> Assembler gemacht hätte.
> D.h. wenn man in Assembler ein Byte nimmt, muß man in C auch unsigned
> char nehmen und nicht int, long oder gar double float.
>

@Peter

so sehe ich das auch. Es gibt ja beides C oder Assembler Hasser.
Denke die Kombination des Wissen über beide Programmiersprachen
ist ideal.
Denke, daß man keine andere Sprache mehr benötigt.

Möchte bloss auf Dein Beispiel unter GCC mit dem BUG im Compiler 
hinweisen.
Sowas ist zwar ärgerlich aber ein wirklich fitter Programmierer in 
beiden
Sprachen findet das.
Was aber wenn dieses Basiswissen und Verständniss fehlt?

Nützt auch nix, wenn man mit dem Auto liegen bleibt und nicht weiss, daß 
es im Kofferraum ein Erstzrad gibt.

Gruß

Dirk

von Thomas M. (guitarist2007)


Lesenswert?

Also ich will hier keinesfalls sagen, dass die eine oder andere Sprache 
besser oder schlechter ist. Es kommt wie bei allem ja auch den 
VErwendungszweck und die Fähigkeiten des Programmierers an.

Was mich zu der Vermutung geführt hat, dass Assembler ggf. "besser" sein 
könnte als C ist ganz einfach die Tatsache, dass Assembler näher an der 
eigentlichen Hardware ist.

Ich muss zugeben, dass ich von C schon beruflich mehr Erfahrung habe und 
das einzige, was mich so ein wenig abschreckt Assembler zu verwenden ist 
die Tatsache, dass die USB Anbindung quellcodetechnisch in C bereits 
besser vorhanden ist.

von KING (Gast)


Lesenswert?

Wie steuere ich die zweite Zeile des LCD Displays an?

von KING (Gast)


Lesenswert?

Brauche bitte möglichst schnell eine Antwort!!
Bitte zurückschreiben!!
Hab nur noch eine Stunde Zeit dafür!!!!
DANKE!

von Falk (Gast)


Lesenswert?

@ KING (Gast)

>Wie steuere ich die zweite Zeile des LCD Displays an?

>Brauche bitte möglichst schnell eine Antwort!!
>Bitte zurückschreiben!!
>Hab nur noch eine Stunde Zeit dafür!!!!

Das kostet was.

Setz mal die DD Adresse auf 0x40 und schreib ein paar Zeichen.

MfG
Falk

von KING (Gast)


Lesenswert?

Danke für die Antwort nur wie setze ich den Cursor an eine Adresse?

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.