Forum: Mikrocontroller und Digitale Elektronik Mega8: Ein kompletter Port (B oder D) plus 2 Taster (Interrupt)


von frq_gen (Gast)


Lesenswert?

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

von Newcomer (Gast)


Lesenswert?

frq_gen schrieb:
> Aber: Da sitzen
> Int0 und Int1, die ich eigentlich für meine 2 Bedientasten verwenden
> will.

Gefährliches Thema. Beitrag "Entprellen von Schalter mit Interrupt und PinChange"
Versuch es mit Polling, dann kannst du jeden Pin für die Tasten nehmen.

von frq_gen (Gast)


Lesenswert?

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

von Joerg W. (joergwolfram)


Lesenswert?

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

von Chris (Gast)


Lesenswert?

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?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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.

von Thomas E. (thomase)


Lesenswert?

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.

von frq_gen (Gast)


Lesenswert?

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

von frq_gen (Gast)


Lesenswert?

Na guuut, das Datenblatt vom Mega88 guck ich mir auch an :-)

von Walter (Gast)


Lesenswert?

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!

von Thomas E. (thomase)


Lesenswert?

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.

von Sascha W. (sascha-w)


Lesenswert?

@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

von Ralph (Gast)


Lesenswert?

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
.

von frq_gen (Gast)


Lesenswert?

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.

von frq_gen (Gast)


Lesenswert?

Sascha Weber schrieb:
> Dioden-OR-Verknüpfung

ICP ist auch gut, wie meintest Du das mit der Dioden - OR Verknüpfung ?

von frq_gen (Gast)


Lesenswert?

Sorry hatte wohl ein Brett vorm Kopf, wahrscheinlich so - müsste 
klappen, oder?

                             5V
                             |
                             |
               +-------------+-------------+
               |                           |
              |R|                         |R|
               |                           |
               |                           |
 PortB(n)------+-----------|<|-------------+-------PortB(0) = ICP
               |                           |
              \  S1                       \  S2
               |                           |
              GND                         GND

von Sascha W. (sascha-w)


Lesenswert?

ja so sollte es gehen

Sascha

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.