Hi, ich habe mal eine allgemeine Frage zu den Vor- und Nachteile beim setzen oder löschen der Fuses Bits beim ATmega 8. Welchen Verlust habe ich wenn ich das "PC6 as i/o pin" Bit setze. Kann ich dann gar keinen Reset mehr machen? Wird er beim anlegen der Betriebsspannung intern generiert? Und dann noch eine Frage zu den "1 Million" OSC Bits. Ich würde gerne einen Internen Oscillator verwenden um auch hier die beiden PINS als I/O Pins nutzen zu können. Was erbirgt sich hinter den verschiedenen Möglichkeiten? Takt in MHz ist schon klar aber was bedeutet die Startuptime? Und zu guter letzt... wie "genau" ist der interne Oscillator? Ich möchte gerne ADC Wandlung und die UART Funktion nutzen. Ist dies ohne weitere ok oder würdet ihr generell einen Externen Quarz empfehlen? Gruß AVRli...
Hi, <WARNUNG, WARNUNG, WARNUNG> wenn du den Reset wegbiegst, fehlt dir der externe Reset vollkommen. Das ist ausserordentlich schlecht, falls du vorhast die ISP-Schnittstelle zum Programmieren zu verwenden :-) Die Startuptime setzt du einfach gemäß der Tabelle im Datenblatt, da sollte es keine Probleme geben. Der interne Oszillator, nur der ist so genau, wie's im Datenblatt steht :) Ich habe damit schon den UART bei 38400 Baud zum funktionieren bekommen - ohne augenscheinliche Übertragungsfehler. Wichtig ist allerdings zu bemerken, dass dann eine relativ starke Abhängigkeit von Temperatur und Betriebsspannung besteht. Viele Grüße
Hi... Lass am besten die Finger davon, solange du nicht hundertprozenig Bescheid weißt. Der Mega8 wird mit aktiviertem internen Oszillator (1MHz) ausgeliefert, womit die XTAL-Pins als Ports genutzt werden können. Für erste Tests gibt es also keinen Anlass, etwas zu verstellen! Vorsicht auch bei der Darstellung der Fusebits bei den unterschiedlichen ISP-Programmen, da sind Missverständnisse vorprogrammiert. Verschieb' das am besten auf später... ...HanneS...
Hi nochmal, was ich vergessen hatte zu erwähnen: der Takt aus dem internen RC ist für die AD-Wandlung allemal gut genug. Da brauchst du dir keine Gedanken machen. Wenn du an den Fuses für den Oszi rumspielst solltest du dir schon einmal einen externen Taktgenerator bereitlegen :) sobald nämlich die gültige Taktquelle "weggefust" wurde, kann man das Teil nicht mehr programmieren...
Hi! ;-) Als ob ich es geahnt hätte... lieber einmal mehr fragen... hahaha Ich möchte später schon per ISP programmieren also bleibt das RESET PIN erhalten... puhh das war knapp... ;-( > Wenn du an den Fuses für den Oszi rumspielst solltest du dir > schon einmal einen externen Taktgenerator bereitlegen :) > sobald nämlich die gültige Taktquelle "weggefust" wurde, > kann man das Teil nicht mehr programmieren... ??? soll heißen? Die Fuses sollte man am besten einmal setzen und es dann lassen sie zu verändern? Es sind also keine "Optionsbits" die man nach belieben setzen und löschen kann? Ohh man dann werde ich mich mal zurüchhalten mit meine Experimente. Gruß AVRli... der nun auf der Suche nach I/O Pin's ist... :-D
Hi Avrli, nein, nein, die Fuses sind schon mehrfach programmierbar. Der AVR braucht aber halt immer einen gültigen Takt zum ISP. Wenn du also normalerweise nen Quarz nimmst, dann aber die Fuses auf externen Takt umstellst, dann wird der AVR einfach aufhören zu funktionieren. Dazu brauchst du dann nen ext. Clock. Ist aber auch nicht so wild, dann ein Quarz und ein NAND-Gatter reichen aus (na gut, und Widerstände :) Wenn du auf der Suche nach noch mehr I/O Pins bist, dann schau dich mal auf www.avrfreak.net um. Da sind einige Dokus zu diesem Zweck. Porterweiterung mittels Schiebregister, I2C oder halt einfach per Adressdekoder und Latches. Grüße
oder lieber gleich den Mega16 nehmen, ist zumindest in der TQFP-Version (die ich am liebsten nehme) nur wenig grösser als der Mega8, kaum teurer und insgesamt auf jeden Fall kleiner als an den Mega8 wieder externe Erweiterung dranpappen. Und die wirklich böse reset-fuse gibts da auch nicht. Ich mach äusserst ungern Designs, wo ich nur mit Tricks/Kniffen/weiterer Hardware mit den I/Os klarkomme, meist rächt sich das früher oder später. Die Produktionsstückzahlen meiner Sachen gehen selten über 1000 hinaus, insofern lohnt es sich nicht, mit Macht den gerade ausreichenden MC zu nehmen. Aussnahmen: der MC ist vorgegeben oder es kommt wirklich auf den letzten Cent an. Und jetzt rechne mal: 20 Cent WErsparnis am Controller bei 1000 Stück macht gerade mal 200 für die gesamte Serie. Damit kann man gerade mal reichlich 2h Softwareentwicklung bezahlen. Mit Rumgurkerei sind 2h weg wie nichts, am Ende hat nichts gespart.
Hi Thomas, ok habe mich da angemeldet... :-) Denke Du meintest www.avrfreaks.net hättest dann das "s" vergessen. Ich finde aber erstmal nix... könntest mal vielleicht antippen wo die Hardware Ecke ist? Ich bin mir sicher das es eine einfache Lösung gibt meine 5 Tasten irgenwie an der Anzahl der Anschlüsse zu "beschneiden". Nun sind ja 5 Pins belegt. Irgendie muss man es auch mit 3 hinbekommen... und schwups da währen meine beiden benötigten Leitungen frei... Gruß AVRli
schreib doch lieber mal, was du sonst so anschliesst, dann kann man eher was zum Freischaufeln erkennen. Wenn mam z.b. eine 4stellige LED-Multiplexanzeige laufen hat, kann man z.B. mittels 4 einfacher Dioden 4 Taster an einen einzigen Eingangspin hängen. Andere Möglichkeit, relativ wenige Tasten zu erkennen: Widerstandskette aufbauen, jeder Taster verändert diese Kette durch Überbrücken einzelner Widerstände, das Signal mit dem A/D-Wandler einlesen, fertig.
Hiho. Crazy Horse: ich hatte nicht das Gefühl, dass er hier industriell arbeiten will :) er darf also ruhig auch was über Schiebregister und Co. lernen, auch wenn das vielleicht länger als zwei Stunden dauert. Ansonsten hast du natürlich recht, dass man nicht an der falschen Stelle geizen muss, zumal externe Schaltkreise und Platz auf der Platine dann auch nicht umsonst sind. Avrli: Ähem, nun, ich hatte das "s" extra wieder weggemacht :) war falsch... Naja, guckst du bei Academy, da gibts designnotes und articles von den nutzern... Grüße
Hi, ja was ist noch dran... :-) PORTD 0-1:UART 2-7:Dotmatrix Display. (4bit Datenbus) PORTB 0-5:Taster nach GND 6-7:XTAL für UART... PORTC 0-1:ADC 2-3:Steuerausgänge 4-5:I2C soll nach Möglichkeit für Erweiterungen frei bleiben 6: der ominöse RESET Pin :-I 7: nicht vorhanden Nun min. 2 Steuerausgänge fehlen mir. Das mit den Taster über Wiederstände zu machen muss ich morgen mal probieren. Ich hoffe es ist absolut zuverlässig denn ein "Fehleingabe" sollte nicht vorkommen. Gruß AVRli und danke für die Hilfe...
Anbei ein Beispiel, welches ich eingesetzt habe. Alternativ könntest du auch parallel zum Display Taster abfragen, musst allerdings bei der Programmierung aufpassen, dass keine Konflikte entstehen.
Hi crazy horse, mit den Tastern über die R's ist sehr interessant! Nur denke ich für meine Anwendung ist das nicht geeignet. Denn man kann wohl nicht erkennen wenn der Anwender aus Spieltrieb mal mehrere Tasten drückt. :-( Über die parallele Abfrage zum Display schlafe ich mal eine Nacht. Im Moment ist mir das noch nicht klar wie es gehen soll. Vielleicht reicht doch der interne Osc. :-I Gruß und gute Nacht... AVRli...
man kann auch bei der version mit wiederständen einzelne tasten erkennen. du musst die werte nur richtig anordenen, so dass mehrere tasten addiert nie den gleichen wert geben wie andere tasten gabs vor kurzen schonmal einen thread zu, muss du mal suchen. da wurde das recht ausführlich besprochen
und abgesehen davon - 2 Tasten gleichzeitig erkennen zu müssen, ist nicht die Regel. Wichtiger ist, dass dann nicht versehentlich eine völlig andere Aktion vorgetäuscht wird. In meinem Beispiel ist eine eindeutige Priorität vorgegeben, selbst wenn alle Tasten gedrückt werden, wird nur die untere wirksam. Wenn also nicht explizit die Verwendung von 2 Tasten nötig ist (wie shift+Taste beim PC) ist das sogar ein Vorteil. Ich weiss nicht, wie viele von euch sich schon mal Gedanken über Fehlbedienung (absichtlich oder versehntlich) machen mussten, dass kann ein sehr komplexes Thema werden. Normalerweise geht man als Programmierer an die Sache so ran, dass sich der Bediener "normal" verhält, also auch nur das macht, was in der Bedienungsanleitung (die kaum einer liest) steht. Alle fangen lieber an zu spielen, scheint menschlich zu sein. Zu erwarten, dass der Bediener nur das tut, was ich in der Software vorgesehen habe, ist ein Irrtum. Ist es irgendwas sicherheitsrelevantes, muss man alle möglichen Fehler ausschliessen (was manchmal gar nicht so einfach, bei komplexeren Sachen fast unmöglich ist).
nochmal zum Thema Tasten am Displayport: -an jede Datenleitung einen Taster -Diode 4148 (Anode) an den anderen Tasteranschluss -Alle Katoden an einen freien Portpin. Ablauf ist einfach: Der Portpin sw_out wird auf L geschaltet, und der Displayport eingelesen, anschliessend der sw_out wieder auf 1 gesetzt. Allerdings sind ein paar Randbedingungen zu beachten: Das LCD-Programm muss nach erfolgtem Schreiben aufs LCD DDRx für den Datenbus wieder auf Eingang setzen, das machen nicht alle LCD-Programme. Alternativ kann man das vor der Tasterabfrage selbst machen, anschliessend wieder zurücksetzen. Probleme kann es auch geben, wenn entweder das LCD oder die Tasterabfrage in einem Interrupt-Programm arbeiten, da muss man aufpassen. Das E-Signal kann man nicht als sw_out-Signal nehmen, auch wenn es verführerisch einfach aussieht (ist ja immer L, wenn das Display inaktiv ist). Daten werden mit den Flanken des E-Signals übernommen, geht also nicht. ein Beispiel, Display am Port C, sw_out PortB.7, Datenbus PortC.4..7 in r16, DDRC andi r16, 0x0f out DDRC, r16 //Datenbus auf Eingang in r16, PORTC ori r16, 0xf0 out PORTC, r16 //pullups einschalten cbi sw_out //sw_out aktiv schalten nop in r17, PINC //Schalterzustand einlesen sbi sw_out //sw_out inaktiv In R17 hat man jetzt den Zustand der Taster in den oberen 4 Bit. Anschliessend kann/muss man den vorherigen Zustand von PORTC/DDRC wiederherstellen, je nach LCD-Funktionen, da muss man sich durchwurschteln, falls man fremde Software mitbenutzt. Nach demselben Prinzip kann man natürlich noch weitere Tasten mit einem weiteren sw_out anschliessen, ebenso kann man die R/W und RS-Leitung mitbenutzen. Alles kann so programmiert werden, dass es niemals Konflikte gibt. Wird das LCD in irgendeinem Interrupt benutzt, vor Tasterabfrage Interrupts sperren, schauen, ob E=0, dann Taster abfragen, Interrupts wieder freigeben. Ebenso ist es möglich, die Abfrage in einer ISR laufen zu lassen.
Erstmal vielen Dank für die Erklärungen!!! Ich muss eigendlich nur ausschließen das es keine Fehlfunktion gibt wenn der Anwender mal mehrere Tasten drückt. Soll heißen das ich keine 2 Tasten Bedienung gleichzeitig habe. Was passiert wenn der Anwender Taste 1 und 3 drücken würde? Welche Spannung würde anliegen? Wird dann nur eine Taste erkannt oder ein "Zwischending"? Wie heist das das "geniale" Verfahren eigendlich? Ich würde gerne dieses anwenden... dann hätte ich sogar noch 2 I/O Pins frei das währe ja wirklich super... Das mit der Display Pin Sache... hmm würde ich als letzte Möglichkeit in Betracht ziehen aber die Idee alleine ist schon fazinierend... da muss ein Schrauber erstmal drauf kommen... ;-D Gruß AVRli...
"Was passiert wenn der Anwender Taste 1 und 3 drücken würde?" wenn du meine Schaltung meinst - dann wird nur Taste 3 erkannt. Was an Taster 1 und 2 passiert, spielt keine Rolle. Ausser natürlich beim Loslassen von 3, dann wird 1 erkannt, wenn noch gedrückt.
Hi crazy horse, jo dann werd ich deine Empfehlung verwenden. Eine letzte Frage... ;-) Werden die Tasten im Programm mit einem normalem größer gleich Vergleich gemacht oder muss man für jede Taste ein "Tor" programmieren. Würde zu gerne das mal antesten... Leider ist meine "Bastellkiste" nicht die "beste". Besorge mir morgen mal die Bauteile... Gruß AVRli...
kannst du als fortlaufenden Vergleich machen. Der Einfachheit halber vorher den A2D-Wert zum 8bit-Wert umformen. Gibt viele mögliche Varianten, die Zuordnung durchzuführen, geht auch als Schleife, immer wieder einen bestimmten Betrag subtrahieren, dabei zählen, wie oft die Subtraktion durchgeführt wird oder oder oder. Kommt auch auf die Werte der Spannungen an, welche Methode am sinnvollsten ist. Hier mal ganz Tippel Tappel: unsigned char TasteCode; unsigned char TasteA2D; if (TasteA2D < Schwelle1) TasteCode=1; else if (TasteA2D < Schwelle2) TasteCode=2; . . else TasteCode=0; // keine Taste
Hi, habe es heute endlich mal geschafft den Vorschlag von crazy horse auszuprobieren. Und was soll ich sagen... es klappt zu 98% !!! Das einzige Problem was sich manchmal einstellt ist das er beim schnellen "Tippern" von Taste 1, Tase 2 erkennt. Sollte aber mit einem Moment warten zu beheben sein. Gruß AVRli...
Das lässt sich wohl damit ausbügeln, dass du einen Tastendruck erst dann registrierst, wenn sich der Pegel innerhalb einiger Abtastungen nicht verändert hat (bzw. nur in einem kleinen Bereich schwankt), dann sollte es auch zu 100% klappen.
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.