Forum: Mikrocontroller und Digitale Elektronik ATmega8 Fuses?


von AVRli (Gast)


Lesenswert?

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...

von Thomas Burkhardt (Gast)


Lesenswert?

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

von ...HanneS... (Gast)


Lesenswert?

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...

von Thomas Burkhardt (Gast)


Lesenswert?

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...

von AVRli (Gast)


Lesenswert?

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

von Thomas Burkhardt (Gast)


Lesenswert?

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

von crazy horse (Gast)


Lesenswert?

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.

von AVRli (Gast)


Lesenswert?

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

von crazy horse (Gast)


Lesenswert?

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.

von Thomas Burkhardt (Gast)


Lesenswert?

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

von AVRli (Gast)


Lesenswert?

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...

von crazy horse (Gast)


Angehängte Dateien:

Lesenswert?

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.

von AVRli (Gast)


Lesenswert?

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...

von Tobi (Gast)


Lesenswert?

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

von crazy horse (Gast)


Lesenswert?

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).

von crazy horse (Gast)


Lesenswert?

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.

von AVRli (Gast)


Lesenswert?

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...

von crazy horse (Gast)


Lesenswert?

"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.

von AVRli (Gast)


Lesenswert?

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...

von crazy horse (Gast)


Lesenswert?

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

von AVRli (Gast)


Lesenswert?

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...

von Christof Krüger (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.