Hey, ich habe zwar vorab nach einer entsprechenden Lösung gesucht, allerdings waren mir die Lösung zu aufwendig. Wieso folgt zugleich Ich bin Student und habe seit eingier Zeit an einer Displayprogrammierung gearbeitet. Da ich jetzt einen GLCD beherrsche dachte ich mir, dass ich damit endich zuhause praktische Anwendungen bauen kann und nicht nur n paar Bitmuster auf LEDs ausgeben kann. Damit ich möglichst viele verschiedene Applikationen mit nur einem Board realisieren kann, wollte ich mir mein eigenes "Einsteiger-Dev-Board" bauen, das die nötigen Schnittstellen für Display, ISP, 7-Segment, LED-Bar,Temp.-Sensor, Servo-Motor bereithält und man diese Jumpern kann o.ä. Verwenden möchte ich einen Atmega8515L. Dazu möchte ich mir jetzt selber noch ein Bedienteil mit Tasten 0-9, OK und Back entwerfen. Wie man sich denken kann, fehlen für einem da die Ports, wenn man Display und Bedienteil Standartmäßig laufen lassen will und dann vll noch den Motor mit Temperatursensor laufen lassen will (Display läuft auf 8bit-->14ports mit CS1,2 und RST). Da ich ALLES selber bauen möchte um auch komplett nachvollziehen zu können, warum es so funktioniert, wie es funktioniert. Und hier kommen wir zur eigentlichen Frage: Wenn ich das Tastenfeld vom Bedienteil auf einen anderen µC (z.Bsp. ATTiny44) gebe, dort die 10 Eingänge auf ein 5-bit Muster reduzieren und dieses auf einen Port ausgebe...kann der "Hauptmikrocontroller" dann einfach die 5-bit über 5 Pins einlesen? Oder gibt es da Probleme beim Einlesen? Ich möchte keine besondere serielle Schnittstelle benutzen oder Daten besonders schnell übertragen. Mir geht es um die Funktionalität und darum, dass ich mir das Konzept selber überlegt habe und ich nicht einfach irgendwelche Chips verwende, die die Arbeit erleichtern. Ich möchte halt vorerst mit diesem Projekt in den Basics bleiben. Falls das möglich ist... Eine andere Idee war Anfangs das Tastenfeld auf ANDs zu geben und so das 5-Bit Muster zu erzeugen. Dann hab ich aber gedacht, dass ich einen 2ten µC zudem für andere Funktionen innerhalb des Bedienteils nutzen kann.. Thema Multiplexer oder ähnliches: Wie gesagt: Ich würde gerne bei meinen eigenen Konzepten bleiben.. Ich sag jetzt schonmal Danke ;) Ich denke die Frage sollte für die Mehrheit hier nicht allzu schwer sein ;) Steffen
Steffen Jü schrieb: > Thema Multiplexer oder ähnliches: > Wie gesagt: Ich würde gerne bei meinen eigenen Konzepten bleiben.. dann mach doch mal eine Zeichnung, wie dur dir das vorstellst in deinem eigenen Konzept, und stelle sie hier rein zur Diksussion oder Niedermetzelung.
Warum nicht UART? Wenn die Schnittstelle noch frei ist spricht doch nichts dagegen. Ansonsten vielleicht was anderes, einfaches. Ich hab irgendwann mal sowas ähnliches realisiert. Die Kommunikation erfolgte über 2 Leitungen, eine Datenleitung und einen Takt. Die Taktleitung habe ich mit einem Pin-Change Interrupt verbunden, bei jedem Pegelwechsel wurde die ISR angesprungen und das Datenbit eingelesen. Der Vorteil ist, dass das Timing beim Bedienteil absolut unkritisch ist und beim Master (oder hier eigentlich dann Slave?) keine Eingänge gepollt werden müsse wie bei einer Software-UART.
sry, für die auflösung, aber musste es eben flott aufm 13-Zoller machen. Ist nur eine Prinzipzeichnung, ohne alle Tasten etc.
bisschen blöd zu sehen: Mit der Verbidung zum Display sind die Pins rechts daneben gemeint
hab mir das thema UART nchmal angeschaut, da die stimmen sofort laut wurden. Mag vll eine praktische Lösung sein, aber ich würde ungern viele Sachen auf einmal zum ersten Mal benutzen. Habe ohnehin schon dran gedacht es für Ausbildungszwecke tauglich zu machen. Und da wäre ja schon ein zweiter µC eigntl zu viel.
Steffen Jü schrieb: > Verwenden möchte ich einen Atmega8515L. Gibt es dafür einen besonderen Grund? 512Byte RAM und 8K Flash, 2 Timer, kein ADC sind doch Tiny-Niveau. Das ist was Ordentliches für ein Dev-Board: http://www.atmel.com/images/doc8059.pdf mfg.
Thomas Eckmann schrieb: > Steffen Jü schrieb: >> Verwenden möchte ich einen Atmega8515L. > Gibt es dafür einen besonderen Grund? > 512Byte RAM und 8K Flash, 2 Timer, kein ADC sind doch Tiny-Niveau. > > Das ist was Ordentliches für ein Dev-Board: > http://www.atmel.com/images/doc8059.pdf > > mfg. jauh, damit lässt sich schon sau viel machen, aber habe meine lcd-lib schon für den atma8515.. Kann mir nun jemand sagen, ob so eine Kommunikation prinzipell fnktioniert und was ich beachten sollte, ohne mir eine andere Schnittstelle oder ein andere Bauteil vorzuschlagen? Das wäre dann später die zweite Lösung. Aber Danke für die Hilfe und Anregungen bisher :)
Wenn man knapp an Ports ist, den naechst groesseren nehmen. Die software benoetigt wenig anpassungen
Steffen Jü schrieb: > aber habe meine lcd-lib schon für den atma8515.. Solange du dafür kein Memory-Mapped I/O verwendest, wäre das doch kein Problem das anzupassen. Das Gehampel mit zwei Controllern ist eher nicht trivial. Wenn man das nicht unbedingt braucht, macht man das auch nicht. Für Porterweiterungen nimmt man dann Schieberegister. Für langsame Sachen wie Tasten oder Leds allemal. mfg.
Ich frage nochmal expliziet nach dieser Art von Kommunikation: Wenn ich 10 if-Abfragen im "Haupt"-µC programmiere und dort das 5-bit muster (das den 10 Tasten entspricht) entsprechend den 10 Tasten abfrage, kommt es da zu problemen? Ich stelle mir das so vor: Bedienteil-µC (1) setzt das 5-bit-muster auf den ausgangsport PA0-PA4 auf 01011. Der µC zur Display-Steuerung (2) hat diese 5 Leitungen als Eingänge. Die if-Abfragen, fragen eben diese ab. Hier kommt es zum Problem: Setzt µC 1 seine Ausgänge ALLE exakt zum selben Moment bzw. löscht sie? Ansonsten könnte es innerhalb der 10 if-Abfragen zu Fehlern kommen. Möchte ohne extra Takt arbeiten. Ich hoffe jemand kann klar sagen: Ja, das funktioniert / Ja, mit einer Fehlerqute von xy% /Nein, das geht gar nicht
Thema hat sich glaub ich geklärt. sollte ich nach einer if-Abfrage einen kleinen Delay einbauen und erneut abfragen, erkenne ich, ob das muster noch "am aktualisieren war". Der Delay sollte kleiner sein als 2 Tastendrücke und größer als die Zeit die es benötigt die Ausgänge des µC 1 zu setzen/löschen. Ansonsten verhält sich ja alles entsprechend der Logik-Pegel. Sollte also keine Probleme geben, richtig?
>Bedienteil-µC (1) setzt das 5-bit-muster auf den ausgangsport PA0-PA4 >auf 01011. Warum dann nicht gleich die Tasten direkt an den zweiten µC anschließen? Wenn der erste eh nur die Tasten weiterreicht..? >Möchte ohne extra Takt arbeiten. Das Ganze würde nur Meldungsorientiert funktionieren. Wenn also der BedienµC eine Meldung versendet, wo drinsteht, das Taste X betätigt/losgelassen wurde. (So arbeiten auch Tastaturen) >Ich hoffe jemand kann klar sagen: EIn guter Tipp: Lass es. Bleibe bei einem µC.
Ich seh gerade auf dem Schaltplan, daß du die Tasten alle gegen (+5V) geschaltet hast. Was lesen die Pins des Prozessors ein, wenn die Tasten offen sind? Die Prozessoren haben keine Pulldown's. Also lesen sie irgendwas ein. Nur bei geschlossenen Tasten bekommen sie definiertes High-Signal. Lösung 1: externe Pulldown's an die Prozessorpins Lösung 2: Tasten an Masse und interne Pullup's aktivieren Zum eigentlichen Thema kann ich nur sagen, nimm eine serielle Kommunikation. Die ist nicht schwierig und braucht nur 2 Leitungen. Wenn du noch andere Sachen übertragen möchtest (und das kommt bestimmt noch), dann hast du in deiner Variante keine Möglichkeiten mehr. Wenn du es seriell machst, kannst du übertragen, was und so viel du willst. Überleg es dir mal. Sind nur paar Zeilen Software. Tipps dazu hast du hier schon bekommen. Und wenn du nicht zurecht kommst, fragst du einfach nach. Hilfe gibt's hier umsonst :-)
MoinMoin Noch ne Möglichkeit, Pins zu sparen ist es, die Taster per ADC abzufragen, und per Spannungsteiler jedem Taster ne "eigene" Spannung zuzuweisen. Idealerweise sollte man den Spannungsteiler so abstimmen, das man pro Taster eine Spannungsverdopplung/halbierung hat. Sprich erste Taste gedrückt zb Vcc/2, 2 Taste gedrückt Vcc/4 usw, dann kannst du auch mehrere Tasten gleichzeitig drücken und abfragen. Und wenn du bei 2 Controllern bleiben möchtest, Kommunikation über UART ist wirklich kinderleicht! =) MfG Chaos
Steffen Jü schrieb: > sollte ich nach einer if-Abfrage einen kleinen Delay einbauen und erneut > abfragen, ... > Sollte also keine Probleme geben, richtig? Delay ist, sobald der Prozessor eigentlich mehr zu tun hat, als auf die Taste zu warten, immer ein Problem, weil er in der Zeit nichts anderes erledigen kann. Guck mal nach "Timer" und "Entprellen"
>Ich hoffe jemand kann klar sagen: Zuwenige I/O-Pins am Controller ist ein Standardproblem, für das es zwei bewährte Standardlösungen gibt: - Controller mit mehr Pins nehmen. Dazu sind sie da. - Schieberegister: http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister >sollte ich nach einer if-Abfrage einen kleinen Delay einbauen <ironie> Unbedingt. Solche Delays kann man gar nicht genug einbauen. </ironie>
Ich versuch auf jeden zu Antworten: Matthias Lipinsky: Tu ich doch gar nicht. Ich wandel 12 Tasten in ein 5-bit Muster und unterscheide ob ich es als Nummernblock oder Navigation benutze. Bernd S.: Wie ich sagte ist es eine Prinzipzeichnung und "..eben schnell.." gemacht. Da kann ich doch auf sowas verzichten,oder? Aber wenn ich ehrlich bin, habe ich auch gar nicht dran gedacht!! Danke :) (Hatte ne Sps-lastige Ausbildung. Da konnten wir Logos und S7-300 auch so anschließen :) j. t. (chaoskind): DAS gefällt mir!! Also das ist wirklich eine elegante und einfache Lösung, die mir richtig gut gefällt. Genau sowas habe ich mir vorgestellt! Super Beitrag also ;) Vuvuzelatus: Thema Delay: Ach lasst das Kind doch spielen :) Sagen wir es doch ganz einfach: Ich habe noch nicht viele Kenntnisse und möchte meine eigenen Mittel ausnutzen und eigene Ideen entwickeln. :) Steffen
ohne scheiss, du hast einen echten Nachteil bei zwei µC: bei Änderungen musst du immer zwei Programme ummodeln und zwei mal hintereinander zwei Controller flashen. Mach es mit Schieberegistern. Es wird dich weniger Zeit kosten. Eine Library für einen größeren Controller findest du bestimmt auch noch, und ansonsten geht das Ändern der Register-Flags für einen anderen Controller in deiner Library auch echt fix. Ich mache das immer so, dass ich mir beide Datenblätter öffne und alle Befehle mit Registern drin im Datenblatt für den einen suche und gucke was das sein soll und dann jenes in dem Datenblatt des neuen µC suche um zu sehen wie es dort heißt. Das kannst du ja auch trocken machen, wenn es am Ende kompilliert kannst Du dir jenen µC kaufen. Aber ich sehe gerade, dass der ATmega8515 schon recht groß ist, also AVR-Tutorial: Schieberegister
Auf jeden Fall brauchst du etwas, das dem Display-Controller mitteilt, daß er Daten vor der Türe hat. Immer vor der Türe nachschauen, Polling genannt, ist nicht optimal. Zusätzlich zur verschwendeten Rechenzeit könnte man was verpassen. Um diese Gefahr zu reduzieren muß an noch häufiger pollen. Also brauchst Du eine Interruptleitung die entweder zusätzlich verlegt wird oder per extra Baustein aus den 5 Datenleitungen erkennt das sich da was tut. Manche Bausteine die man zum Thema Porterweiterung findet erkennen ein Toggeln auf den Leitungen. Ich tue mich nur noch schwer mir die ganzen Teilenummern zu merken. Da diese Teile zur Porterweiterung seriell angebunden werden kann man dann aber auch gleich eine der seriellen Schittstellen direkt nehmen. Die haben schon eine Interruptmöglichkeit integriert. So schwer ist das es nicht sie zu benutzen. Zusätlich haben sie noch den Vorteil, daß sie eigene Register haben in denen die Empfangenen Daten zwischengespeichert werden bis sie verarbeitet werden. Wenn man das nun per Interruopt bearbeitet, hat man die Daten in aller Regel abgeholt bevor Neue kommen. Wenn man also nicht gerade tippt wie ein Weltmeister wäre diese Lösung in dieser Hinsicht nahezu sorgenfrei. Wenn Dir aber weiterhin die Lösung mit den verschiedenen Spannungen mehr zusagt, kannst du auch den Komperator mit auf die Leitung hängen, der dann bei Tastendruck die geänderte Spannung erkennt und über Interrupt die Auswertung startet. Wie Du es auch machst, so oder so läuft es darauf hinaus das Du mehr als nur die einfache Port-Funktion brauchst wenn es kein Polling werden soll. Also etwas, aber nur etwas, komplizierter wird es weil du dann zusätzliche Einheiten im Chip nutzt, sei es nun der Komperator, der ADC oder eine der seriellen Schnittstellen. viele Grüße Carsten
Ok. Werde wohl beim nächsten mal ein Schieberegister nehmen. Bzw ich mache ein zweites Board. Aber würd mich doch interessieren wie es so abläuft. von daher werde ich es trotzdem zuende aufbauen und sehn was bei rumkommt. zum polling: hatte zum glück noch 1 bit frei, dass ich als control-bit auf einen anderen port gebe und dort einen interrupt auslöse, der die 4 bits einliest. habe bisher immer 5bit und 10 tasten geschrieben. RICHTIG IST: 12 Tasten in 4 bit umwandeln
SO schaut der Schaltplan derzeit aus. Fehler mögen vll noch drin sein, aber hab für heute genug..
Ob man nun zwei oder einen Controller hat ist Geschmackssache. Einer ist oftmals billiger. Aber was die Entwicklung betrifft. Solange man nicht ständig die Schnittstellen zwischen den beiden ändert ist es eigentlich sogar einfacher. Bei Änderungen zerschießt man nicht gleich alles sondern nur einen Teil. Man hat hier keinen Speicherschutz und andere Möglichkeiten die man beim PC hat. Hängt eine Routine hängt das ganze System. Zumindest in der Regel. Natürlich gibt es Minibetriebssysteme und Watchdogs. Aber die wenigsten Hobbyprojekte sind so konzipiert, dass sie hängende Programmteile abfangen können. Und selbst Wenn, geht das auch nicht uneingeschränkt. Bei getrennten µC hat man eine gewisse Trennung. Divide and Conquer ist nicht umsonst eine beliebte Strategie in der Entwicklung. Dadurch das man im Computer Grafikkarten Soundkarten und Controller hat ist es auch nicht notwendigerweise schlechter geworden. Das war nicht nur eine Performancefrage. Und wer erinnert sich noch an die Zeiten in denen Windows 3.x oder Win9x Stand der Technik waren. Da liefen auch einige Programmteile im selben Bereich ohne saubere Trennung. Das war nicht unbedingt besser. Die Idee eine funktionierende Grafikeinheit erst einmal so zu belassen und sie nur mit einer Schnittstelle nachzurüsten um dann die neuen Ideen außerhalb dessen zu erproben ist nicht unbedingt die schlechteste. Ich sehe vom Konzept her keinen zwingeden Grund der dagegen spricht das so zu machen, eher im Gegenteil. Zusätzlich ist es eine Gute Übung weil man sich mehr Gedanken darüber macht Informationen mit System zwischen den Komponenten auszutauschen und nicht, weil es on-Chip so schön bequem ist, einfach mal stumpf mit mehreren Programmteilen die gleichen Speicherbereich anzusprechen. Dann kommt noch ein Interrrupt dazu, welcher das eine Programm unterbricht während ein anderes dann genau dort rumfuhrwerkt, dann kehrt man vom Interruopt zurück und macht an der gleichen Stelle weiter et Voila....
Hallo Steffen, wenn ich richtig verstanden habe, ist bei dir der Weg das Ziel. Ich hab Berufsmässig damit zu tun, deshalb hier ein paar Hinweise: Eine Tastatur schaltet man in einer Matrix, in deinem Fall als 3x4 Matrix, wobei die Tasten auf den Matrix-Kreuzungen liegen. 3 Leitungen werden als Ausgang im Ruhezustand auf "high" geschaltet, und 4 als Eingänge mit pull downs auf low gelegt. Die Tastenerkennung wird über eine Timerroutine gemacht, 20ms ist eine gute Zeit für die meisten Taster. In der Timer ISR-routine werden die Inputs gelesen und gecheckt ob sie gleich 0 sind. Wenn nein, werden die Ausgänge abgeschaltet und einer nach dem anderen eingeschaltet. Dadurch kann ermittelt werden, welche Taste gedrückt wurde. Der ermittelte Tastenwert wird gespeichert, und nach 20ms wird das ganze wiederholt um sicher zu sein, dass die Taste wirklich gedrückt wurde (entprellen). Die gedrückte Taste wird dann vom Interrupt an das Hauptprogramm in einer Variablen und einem Key-Pressed Bit übergeben. In den weiteren Timer ISR's wird gecheckt ob die Taste wieder losgelassen wurde (d.h Ports wieder 0) auch dass wird mehrfach gemacht, z.b mit einem Softwarezähler. Damit erübrigt sich vielleicht schon ein Portexpander, weil man so viele Ports sparen kann. Falls nicht würde ich die beiden Controller über das sowieso vorhandene SPI Interface der Atmels (TWI) im Interruptmodus zusammenschalten. Noch ein Wort zu oben erwähnten zerschießen des Seichers. Das kann vorkommen, aber A und O in der embedded Programierung ist: So kleine Module wie möglich machen und diese mit speziellem Testcode bis zum Erbrechen testen, nur so wird ein System stabil. Besonders gefährlich sind Race conditions, die man sich leicht über die Verwendung von globalen Variablen einhandelt. Es gibt sehr gute Bücher zu dem Thema. Gruß, Andreas
Carsten R. schrieb: > Ob man nun zwei oder einen Controller hat ist Geschmackssache. Aber nicht für Anfänger, die unterschätzen in der Regel den Aufwand für eine zuverlässige Kommunikation völlig. Ein Anfänger sollte erstmal auf einem MC die Grundlagen lernen, sonst hat man zuviele Baustellen auf einmal und kriegt garnix fertig. Es ist überhaupt keine Kunst, ein LCD und eine 3*4 Tastenmatrix direkt anzuschließen. Das LCD braucht 6 Leitungen, wovon man die 4 Datenleitungen mit der Tastenmatrix zusammen nutzen kann. Die 4 Leitungen muß man nur mit 4 Widerständen (1k) entkoppeln, damit gedrückte Tasten die LCD-Daten nicht kurzschließen. Macht insgesamt 9 Leitungen und die sollte ja ein 40-Pinner leicht übrig haben.
Carsten R. (kaffeetante) und Andreas Br. (myratz): Ihr habt vollkommen begriffen was ich möchte. Wie im Plan zu sehen habe ich ein CNTRL-Bit eingefügt um die 4-Bit über einen Interrupt einzulesen. Also genau das was du auch gesagt hast, Carsten. Dein ganzer Beitrag hat mir grundsätzlich aus der Seele gesprochen. :) Andreas: Habe es nochmal woanders gefunden mit Beispiel. WIrklich ein Kinderspiel. Im Datenblatt hat mich allerdings die Zeichnung etwas verwirrt. Jetzt kann ich sie leicht nachvollziehen. Das Problem hat man ja des Öfteren :) Aber da liegt der Unterschied der mir wichtig ist, den scheinbar einige nicht begriffen haben, oder ihn nicht ausreichend berücksichtigt haben: Ich möchte bei einem Problem keine vorhande Lösung nachbauen, sondern eine eigene entwicklen. Und in diesem Falle war das halt die Lösung über einen zweiten µC die liebste, da ich mir nicht sicher war ob und wie es MIR möglich ist ich Eingänge zu sparen, nur mit Hilfe von ANDs und RS-Gliedern oder so. Da dachte ich mir n µC ist einfacher als sich eine Logik-Schaltung zu überlegen...Hinzu kamen Überlegungen zu bidirektionalem Fluss. Zu der Schaltung: Abgesehen von der 4x3-Matrix die noch ersetzt werden muss und n paar Schaltzeichen, funktioniert das so? Läuft alles auf VCC=5V. 7-Seg. und LEDs müssten bei 330R auch im oberen Berreich sein (alle 2V/10mA). Poti sollte zwischen 1k-1M sein-->500k, Pulldown=10k Standart, ISP mit 5V. 3x100n pro VCC Pin Was hab ich vergessen, außer vll so Kleinigkeiten wie Verpolungsschutzdioden, "nimm lieber n Tiefpass an VCC !!! ", oder so? Steffen
Hallo Steffen, Steffen Jü schrieb: > Läuft alles auf VCC=5V. 7-Seg. und LEDs müssten bei 330R auch im oberen > Berreich sein (alle 2V/10mA). Poti sollte zwischen 1k-1M sein-->500k, > Pulldown=10k Standart, ISP mit 5V. 3x100n pro VCC Pin Mir erscheinen 10mA etwas hoch für die LED's der 7 Segmentanzeige. Die heutigen modernen LED's sind sehr hell, daher reichen auch 2mA oder 5mA. Der Typ, den Du rausgesucht hast, ist ein "high brightness" Typ. Möchtest Du Dich mit der Sonnenbrille davor setzten? :-) Zudem würde ich auch die Segmente multiplexen. Die acht Leitungen für die Digits parallel zu allen Segmenten führen und dann das "Common-Signal" im Multiplex schalten. Auch dazu lässt sich der 20ms Timer verwenden. Du mußt nur darauf achten, dass der Strom durch die Common Leitung zum Port nicht zu hoch wird. Aber da Du das Signal multiplexed, wird der Strom ums Tastverhältnis reduziert. Was der Prozessorport maximal aushält, steht im Datenblatt. Auch könntest Du zwei Prozessorports parallel schalten, bei CMOS ist das erlaubt. Der Vorteil der Multiplexerei ist, dass Du es leicht um mehrere digits erweitern kannst, der Nachteil: Je mehr digits, desto dunkler, oder Du musst den Strom wieder vergrößern. Für was möchtest Du die "Left"-"Right" - Trimmer verwenden? Gruß, Andreas
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.