Eine Frage an die Kreativen: Ich möchte gerne einen Mega8 verwenden für
einen Frequenzgenerator. Dafür brauche ich einen Port komplett frei. Da
ich auch einen Quarz anschließen will bzw. der Generator recht genau
gehen soll, fällt PortB schon weg. Also Port D nehmen, Aber: Da sitzen
Int0 und Int1, die ich eigentlich für meine 2 Bedientasten verwenden
will.
Der Code läuft in Assembler und ist sehr zeitkritisch. Deshalb also
keine Polling und keine halben Ports. Am einfachsten wäre es, einen
andren Chip zu nehmen, aber das kann ja jeder.. :-)
Also Frage: Wie kann ich in dieser Konstellation noch mit mindestens
einer Taste + Beschaltung einen Interrupt erzeugen (also ohne INT0 und
INT1)?
nee, das ist nicht gefährlich, wenn man es nicht so eilig hat: Wenn ich
in der ISR bin, schalte ich erstmal die Interrupts aus und warte ein
paar Millisekunden, das geht schon. Und Polling dauert zu lange, selbst
1 Takt.
Ich hab irgendwie auf einen Trick mit TWI gehofft..
So etwas geht schon und zwar "von hinten durch die Brust ins Auge" ;-)
Und zwar könntest Du den SPI-Interrupt für die Taster benutzen. Dazu den
Timer 1 als CTC programmieren, SPI als Slave. OC1A mit SCK verbinden,
Pull-Ups an SS und MOSI. Taster 1 setzt SS über eine Diode auf GND und
Taster 2 SS und MOSI. Wird jetzt ein Taster gedrückt, so wird SS
aktiviert und nach 8 Takten ein SPI-Interrupt ausgelöst.
Im letzten Bit von SPDR steht dann, welcher Taster gedrückt wurde.
Allerdings ist diese Art von Interrupt eher Zustands- als
Flankengesteuert.
Jörg
frq_gen schrieb:> warte ein> paar Millisekunden
ISR und Warten, alles sehr zeitkritisch? Das passt nicht zusammen.
und dann nicht mal zum polling 1 Takt haben?
Unabhängig davon, ob Tasten über Interrupts sinnvoll sind:
Nimm einen ATmega88 statt dem total veralteten ATmega8. Der ist
pinkompatibel und Du kannst auf jeden Pin einen PCINT aktivieren.
Man muss sich das Leben nicht unnötig schwer machen.
Frank M. schrieb:> Nimm einen ATmega88 statt dem total veralteten ATmega8. Der ist> pinkompatibel und Du kannst auf jeden Pin einen PCINT aktivieren.
Und 20MHz kann der auch noch.
mfg.
@Jörg - das ist genial! aber warum nur im letzten Bit - es müssten doch
alle Bits im SPDR betroffen sein, oder meintest Du weil es prellen
könnte?
@Cris
doch das passt: Wenn ich die Bedientasten drücke, hab ich alle Zeit der
Welt und die Anzeige anzusteuern etc. Wenn der Generator aber läuft,
braucht ein Durchlauf 9 Takte. 1 Takt mehr fürs Polling oder sogar 2
sind dann >10 oder >20% Auflösung weniger. Deswegen möchte ich diese
Schleife aus den 9 Takten per Interrupt und nicht per Polling
unterbrechen.
frq_gen schrieb:> Wenn der Generator aber läuft,> braucht ein Durchlauf 9 Takte. 1 Takt mehr fürs Polling oder sogar 2> sind dann >10 oder >20% Auflösung weniger.
weißt du dass du deine Frequenz nicht per Software erzeugen musst?
der uc hat dafür extra Hardware!
Walter schrieb:> weißt du dass du deine Frequenz nicht per Software erzeugen musst?> der uc hat dafür extra Hardware!
Er will wohl eher ein Byte auf einen DAC geben. Deswegen auch ein ganzer
Port, um das nicht noch portionsweise bitfriggeln zu müssen.
mfg.
@frq_gen
du könntest deine beiden Tasten mit einer Dioden-OR-Verknüpfung an PB0
anschließen und eine zusätzlich an einen anderen Pin und den ICP-Int
nehmen um den Tastendruck zu detekieren. Im INT kannst du dan schauen,
welche Taste gedrückt wurde.
Sascha
Da würde ich doch zu gerne mal das Konzept sehen was da hinter steht.
Also Was soll Wie gemacht werden.
Was ist die Max Frequenz die du darstellen willst.
Wie soll der Signalverlauf der Frequenz sein, mit welcher Auflösung ?
Ich gehe davon aus, wenn das Konzept sinnvoll geändert ( oder erst mal
erstellt ) wird, bekommst du einen µC der vor Langweile nicht weiß was
er tun soll.
frq_gen schrieb:> doch das passt: Wenn ich die Bedientasten drücke, hab ich alle Zeit der> Welt und die Anzeige anzusteuern etc. Wenn der Generator aber läuft,> braucht ein Durchlauf 9 Takte.
Das ist doch schon ein fauler Kompromiss.
Wenn eine Frequenzänderung gemacht wird, will man doch normalerweise
eine Unterbrechungsfreie Umschaltung auf die neue Frequenz, optimal beim
Nulldurchgang.
Den Generator abschalten, dann umstellen und wieder einschalten ist doch
Murks.
frq_gen schrieb:> Wenn der Generator aber läuft,> braucht ein Durchlauf 9 Takte. 1 Takt mehr fürs Polling oder sogar 2> sind dann >10 oder >20% Auflösung weniger.
Vergiss es, das wird nie auf Dauer stabil und zuverlässig laufen. Es sei
denn du machst soviele Einschränkungen für die restlichen Funktionen das
der µC NICHTS anderes mehr macht als den Ausgang zu treiben
.
So viele Zweifel zerstreue ich doch gerne.. :-) Das Konzept ist hier
sehr schön erklärt:
http://www.myplace.nu/avr/minidds/
Während der Umstellung brauche ich kein Ausgangssignal, dann aber möchte
ich ein möglichst genaues.