Forum: Mikrocontroller und Digitale Elektronik Frage zu AtTiny13 und Interrupt


von Fer T. (fer_t)


Lesenswert?

Hallo alle zusammen,

Zuerst zu meinem Problem mit dem Tiny:
Laut Datenblatt hat der Tiny ja nur 9,6 oder 4,8 Mhz Takt, ist es aber 
irgendwie möglich auf einen glatten Wert zu kommen für den Timer?
Also das Problem ist, hätte es 1 Mhz, so könnte ich ja den Prescaler 8 
nehmen:
1/(1000000  8  256) = 2,04 ms

das wäre sehr gut (ich brauche das für eine (nicht atom genaue) 
Zeitmessung.
Weil bei 4,8Mhz:

1/(4800000  8  256) = 0,43 ms
und:
1 / (4800000  64  256) = 3,41ms

so ähnlich sehen auch die Ergebnisse für 9,6 Mhz aus.
(Oder gibt es da noch einen anderen Trick?)

Die zweite Sache ist:
Ich möchte den Tiny schlafen legen (power down) und per externem 
Interrupt aufwecken.
Aber das Problem ist, ich kann nur + (Vcc) an einen Pin anlegen (wegen 
dem Layout, Transistor verstärktes positives Signal).
Und ich habe bisher nur gesehen das ein Level Interrupt per GND 
durchgeführt wird.
Deswegen dachte ich an ein Pin Change Interrupt, doch brauche ich da ein 
Pulldown widerstand? Oder reicht es aus wenn der Pin einen unbestimmten 
wert hat, und auf einmal "1" / "high" wird?

DANKE schon mal!

von Falk B. (falk)


Lesenswert?

@Fer T. (fer_t)

>das wäre sehr gut (ich brauche das für eine (nicht atom genaue)
>Zeitmessung.

Dann nimmt man sowieso einen Quarz. Der RC-Oscillator ist eher ungenau. 
Man kann ihn aber leidlich kalibrieren, Stichwort OSCCAL Register, siehe 
Datenblatt.

>Deswegen dachte ich an ein Pin Change Interrupt,

Hat den der Attiny13?

> doch brauche ich da ein
>Pulldown widerstand?

Wahrscheinlich.

> Oder reicht es aus wenn der Pin einen unbestimmten
>wert hat, und auf einmal "1" / "high" wird?

Nein.

MFG
Falk

von Karl H. (kbuchegg)


Lesenswert?

> (Oder gibt es da noch einen anderen Trick?)

mit einem CTC-Modus des Timers kann man noch viel machen.
Allerdings wie Falk schon sagte: die 4.8Mhz sind sowieso eher so 
ungefähr.

Du kannst aber natürlich auch 2325 Timerinterrupts deines 0.43ms IRQ 
abzählen, das als 1 Sekunde nehmen und dann den RC_Oszi mit dem OSCCAL 
soweit hinziehen, bis du leidlich bei 1 Sekunde bist.

Kommt halt immer drauf an, wieviele Sekunden du abmessen willst.

von Fer T. (fer_t)


Lesenswert?

Falk Brunner schrieb:
>>Deswegen dachte ich an ein Pin Change Interrupt,
>
> Hat den der Attiny13?

Aus dem Datenblatt:
0x0001 INT0 External Interrupt Request 0
0x0002PCINT0 Pin Change Interrupt Request 0

Also wahrscheinlich ja, nur stehen da keine Informationen dazu.


Ich habe vergessen zu erwähnen, es geht nicht wirklich um eine genaue 
Zeitmessung, es soll nur für folgendes dienen:
erste 10 Sekunden nach dem aufwachen:
mache a
Sekunden 10-15:
mache b
Sekunden 15-20:
mache c
geh wieder schlafen.

Danke aber schon mal.
MfG

von BigByte64 (Gast)


Lesenswert?

Hast du das Datenblatt zum ATtiny13? Wenn nicht lade es von der 
ATMEL-Seite herunter (doc2535.pdf). Da sind die Interrupts beschrieben. 
Nimm INT0, den kann man für steigende wie für fallende Flanke 
definieren. Und mit einem Widerstand gegen GND sollte es funktionieren.

Zum "schlafen legen": hier darfst du nur den "Idle"-Modus verwenden, 
sonst funktioniert der Interrupt nicht.

MfG
KF

von Fer T. (fer_t)


Lesenswert?

BigByte64 schrieb:
> Hast du das Datenblatt zum ATtiny13? Wenn nicht lade es von der
> ATMEL-Seite herunter (doc2535.pdf). Da sind die Interrupts beschrieben.
> Nimm INT0, den kann man für steigende wie für fallende Flanke
> definieren. Und mit einem Widerstand gegen GND sollte es funktionieren.

Danke für den Hinweis

> Zum "schlafen legen": hier darfst du nur den "Idle"-Modus verwenden,
> sonst funktioniert der Interrupt nicht.

Sicher?
Hab gerade mal nachgeguckt: 7.1 : INT0 Level Interrupt.
Oder vertue ich mich da?

> MfG
> KF

MfG,
Fer

von Fer T. (fer_t)


Angehängte Dateien:

Lesenswert?

Hallo,

heute ist wieder so ein Tag, an dem mein Hirn einfach nicht will...
Und zwar bin ich gerade am überlegen zum Thema Charlieplexing:
Wenn ich L4 "anmachen" will, muss ich ja P1 auf + und P2 Input und P3 
auf - setzen,
aber würde in dem Fall nicht auch L6 und L4 leuchten? Der Strom könnte 
ja auch dort langfließen, oder gilt hier das gesetz des kleinsten 
Widerstandes, weil er nur eine durchlaufen müsste und nicht zwei?
Danke schon mal, ich weiß nicht aber heute ist nicht mein Tag...
Bild siehe Anhang.


PS: Noch mal wegen dem Interrupt und dem Pulldown: würde es gehen wenn 
ich einen 10k Ohm Widerstand nehme?
Weil ich nur eine normale 3V Batterie habe, die lange halten soll, daher 
auch der sleep mode, bei 20k wären es noch 500uA (oder doch 5?) das ist 
mehr als der ganze Tiny braucht im sleep mode.

von Fer T. (fer_t)


Lesenswert?

Hat keiner dazu eine Idee?
MfG

von BigByte64 (Gast)


Lesenswert?

Fer schrieb:
> Sicher?
> Hab gerade mal nachgeguckt: 7.1 : INT0 Level Interrupt.
> Oder vertue ich mich da?

INT0 kennt drei Konfigurationsmöglichkeiten, den Interrupt auszulösen: 2 
mal Level Change, also beim Übergan von 0 nach 1 oder von 1 nach 0. Und 
dann kennt er noch den Low Level Interrupt. Ist dies eingestellt, dann 
wird der Interrupt aufgerufen, wenn am Eingang 0 (0 V, GND) anliegt. In 
dieser Konfiguration wird der Interrupt aber immer wieder aufgerufen, so 
lange der Eingang auf 0 liegt. Das finde ich eher unpraktisch. Und wenn 
ich das richtig verstanden habe soll der Interrupt ja ausgelöst werden, 
wenn logisch 1 am Eingang anliegt. Also kommt der Low Level Interrupt 
hierfür nicht in Frage. Und in Kapitel 7.1, in der Tabelle der 
Sleep-Modes ist bei INT0 die Anmerkung, dass dieser nur im oben 
beschriebenen Low Level Mode die CPU auch aus "ADC Noise Reduction" und 
"Power-down" aufweckt. Da aber hier nur der Level Change, am besten beim 
Wechsel von 0 auf 1 in Frage kommt, kann man nur den Idle-Mode 
verwenden.

> PS: Noch mal wegen dem Interrupt und dem Pulldown: würde es gehen wenn
> ich einen 10k Ohm Widerstand nehme?
> Weil ich nur eine normale 3V Batterie habe, die lange halten soll, daher
> auch der sleep mode, bei 20k wären es noch 500uA (oder doch 5?) das ist
> mehr als der ganze Tiny braucht im sleep mode.

Die internen Pullup-Widerstände (die für diese Anwendung nicht in Frage 
kommen) haben einen Wert zwischen 20 und 50 K. Das macht bei 3 V einen 
Strom von 150 bis 60 µA. Ich denke mal, da kann man auch 100 K nehmen, 
einfach mal ausprobieren. Außerdem fließt dieser Strom nur, wenn der 
Eingang auf logisch 1 gelegt wird. Und das ist ja der Interrupt-Fall. 
Für mich bedeutet das, dass im "Normalfall" der Eingang auf logisch 0 
liegt, dann fließt auch kein Strom.

Und zum Thema "Charlieplexing": was ist das denn? Dazu fällt mir nur 
folgendes ein: wenn die Dioden Leuchtdioden sind, dann haben die einen 
Spannungsabfall von ca. 2 V. Bei 3 V Betriebsspannung leuchtet nur die 
Einzeldiode. Die in Reihe geschalteten leuchten nicht, da hier 
mindestens 4 V anliegen müssen.

MfG
KF

von BigByte64 (Gast)


Lesenswert?

Ich habe gerade noch mal nach "Charlieplexing" gegoogled und bin auf 
folgenden Link gestoßen: http://en.wikipedia.org/wiki/Charlieplexing

Das beschreibt genau dein Problem und meine vermutete Lösung, etwas 
weiter unten auf dieser Seite mit der Überschrift "Forward voltage".

MfG
KF

von Fer T. (fer_t)


Lesenswert?

Danke,
hat mit sehr geholfen, werde Morgen mal basteln.

Ach ja theoretisch kann man das mit dem immer wieder ausüben des 
Interrupts blockieren, wenn man als erste "Tat" nach dem aufwachen 
folgendes macht:
1
GIMSK &= ~(1 << INT0);
(Wieder sperren).

Werde mir aber noch mal alles in Ruhe angucken und mal gucken was ich am 
besten anwenden kann.
MfG

von Falk B. (falk)


Lesenswert?

Siehe Sleep Mode

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.