Forum: Mikrocontroller und Digitale Elektronik Tiny13 ASM externer IRQ löst nicht aus..


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Björn W. (bwieck)


Lesenswert?

Hallo,

Ich stehe irgendwie auf dem Schlauch, ein Tiny13 soll über INT0 bei 
fallender Flanke einen IRQ auslösen aber tut es nicht. Ich muss 
irgendwas vergessen haben, aber ich komm nicht darauf..

Der Beispielcode soll nur ne LED einschalten wenn INT0 ausgelöst wird, 
tuts aber auch nicht.

.include "tn13def.inc"

.org 0x0000

        rjmp init        ; Init

.org INT0addr

        rjmp ZeroCross      ; IRQ bei Nulldurchgang

init:
    ldi temp, 0b00000010  ; PORTB 1 Ausgang
    out DDRB, temp
    ldi temp, 1<<ISC01 | 0<<ISC00    ;INT0 falling Edge IRQ einschalten
    out MCUCR, temp
    ldi temp, 1<<INT0
    out GIMSK, temp
    sei

main:    rjmp main

ZeroCross:

;testmode
sbi PORTB, PB1
reti
;testmode

von LostInMusic (Gast)


Lesenswert?

>ldi temp, 0b00000010  ; PORTB 1 Ausgang

Ist Dir klar, dass INT0 auf PB1 liegt? Konfigurier mal PB1 als Eingang 
und einen anderen Pin als Ausgang für die Test-LED. Sonst sehe ich 
keinen Fehler in Deinem Prog.

von Björn W. (bwieck)


Lesenswert?

LostInMusic schrieb:
> Ist Dir klar, dass INT0 auf PB1 liegt?

Jetzt wo du es sagst... Ich Depp.
Danke dir, jetzt gehts.

Aber dann hätte ich gerne noch ein anderes Problem:

Ich möchte per INT0 eine Nulldurchgangserkennung realisieren.
Dazu ist die AC Spannung von 24V Eff. (50Hz) über einen 47k Widerstand 
an INT0 angeschlossen, die andere Seite an GND, die Clampingdioden im 
AVR begrenzen das ganze.

Klappt soweit auch ausser das sehr oft mehrere IRQs ausgelöst werden.
Kann das daran liegen das die fallende Flanke (auf die ja getriggert 
wird) nicht steil genug ist?
Wie kann man dem am besten begegnen?

Meine erste Idee wäre am Ende der ISR Proforma das INTF0 Flag im GIFR zu 
löschen. Die ISR läuft ca. 6 µs.
Oder gibt es da noch elegantere Methoden in Software?

von (prx) A. K. (prx)


Lesenswert?

Björn W. schrieb:
> Ich möchte per INT0 eine Nulldurchgangserkennung realisieren.

Weshalb nicht den Analog Comparator?

Ohne Hysterese empfiehlt sich dank bekannter Frequenz ein 
Ausschlussfenster über Timer, sonst klapperts am Schwellwert. Also bei 
erkanntem Nulldurchgang INT0/AC abschalten und Timer starten. Mit Ablauf 
des Timers INT0/AC wieder einschalten.

Eine Hysterese lässt sich aber über Ausgang und Widerstand ins Signal 
einkoppeln.

: Bearbeitet durch User
von m.n. (Gast)


Lesenswert?

(prx) A. K. schrieb:
> Björn W. schrieb:
>> Ich möchte per INT0 eine Nulldurchgangserkennung realisieren.
>
> Weshalb nicht den Analog Comparator?

Den würde ich nicht nehmen, da er keine Hysterese hat.
Jeder digitale Eingang hingegen hat seine Schaltschwelle bei ca. Vcc/2 
mit ein paar 100 mV Hysterese. Daher wäre ein zusätzlicher Kondensator 
10 - 100 nF direkt am Eingang sinnvoll, der in Verbindung mit den 47 
kOhm einen Tiefpass bildet.

Aha, "freiwillige Selbstkritik" ist schon erfolgt ;-)

von (prx) A. K. (prx)


Lesenswert?

m.n. schrieb:
> Jeder digitale Eingang hingegen hat seine Schaltschwelle bei ca. Vcc/2
> mit ein paar 100 mV Hysterese.

Sieht freilich nicht so aus, als ob er damit glücklich wird. Ein 
Tiefpass R/C oder L/C ist aber sinnvoll.

: Bearbeitet durch User
von Björn W. (bwieck)


Lesenswert?

(prx) A. K. schrieb:
> Weshalb nicht den Analog Comparator?

Hat der eine Hysterese? Da konnt ich im Datenblatt nichts zu finden.
Ansonsten würde es da ja genauso "Klappern" nur auf einem wählbaren 
Level.

Aber die Sache mit dem Timer gefällt mir. Werd ich ausprobieren.

von Björn W. (bwieck)


Lesenswert?

m.n. schrieb:
> Daher wäre ein zusätzlicher Kondensator
> 10 - 100 nF direkt am Eingang sinnvoll, der in Verbindung mit den 47
> kOhm einen Tiefpass bildet.

Ähm, macht denn das die eh schon zu langsame Flanke nicht noch 
langsamer?

von (prx) A. K. (prx)


Lesenswert?

Björn W. schrieb:
> Hat der eine Hysterese?

Nein. Aber wenn man mit dem AC-Interrupt einen Ausgang schaltet, kann 
man den per Widerstand in den AC-Eingang einkoppeln und damit eine 
Hysterese erzeugen.

von (prx) A. K. (prx)


Lesenswert?

Björn W. schrieb:
> Ähm, macht denn das die eh schon zu langsame Flanke nicht noch
> langsamer?

Wie beschrieben haben die normalen Eingänge Schmitt-Trigger Eigenschaft, 
sind somit nicht von der Flankensteilheit beeinflusst. Allerdings ist 
das Stromnetz selten ein perfekter Sinus.

von c-hater (Gast)


Lesenswert?

Björn W. schrieb:

> Hat der eine Hysterese?

Ja, aber eine sehr kleine.

> Da konnt ich im Datenblatt nichts zu finden.

Nun, worauf man sich im DB nicht festlegt, braucht man auch nicht zu 
garantieren ;o)

Sprich: das schwankt exemplarabhängig ganz erheblich.

> Ansonsten würde es da ja genauso "Klappern" nur auf einem wählbaren
> Level.

Eine Hysterese ist eher etwas, was dem "Klappern" entgegenwirkt. Sprich: 
Wenn's schon an einem digitalen Eingang klappert, klappert's an einem 
AC-Eingang noch sehr viel mehr. Allerdings haben die einen zuschaltbaren 
digitalen "Tiefpaß", der eventuell nützlich sein könnte.

Was aber auf jeden Fall helfen würde, wäre ein externer Tiefpaß in 
Hardware.

von Charly B. (charly)


Lesenswert?

Björn W. schrieb:

> Klappt soweit auch ausser das sehr oft mehrere IRQs ausgelöst werden.
> Kann das daran liegen das die fallende Flanke (auf die ja getriggert
> wird) nicht steil genug ist?

den Int nach dem ersten ausloesen erst nach einer zeit X (z.B. 5 ms)
wieder freigeben z.B. ueber einen int eines Timer's

VlG
Charly

von Peter R. (pnu)


Lesenswert?

Björn W. schrieb:
> die Clampingdioden im
> AVR begrenzen das ganze.

Iiiiihhhh!

24V eff. haben fast 34V Spitze. Und auch noch die clamping-Dioden 
missbrauchen!

Wenn der 50-Hz-Sinus kleine Impulse im Bereich des Nulldurchgangs 
enthält, spricht der Kontroller darauf an.

Abgesehen davon: über 47k auf die clampingdioden zu gehen ergibt eine 
deutlich unsymmetrische Begrenzung und damit Verschiebung des 
Nulldurchgangs.

etwas sauberere Lösung: erstmal mit Vorwiderstand und zwei externen 
Dioden (ist ja ein einzelnes Dreibein-IC) auf (Vcc + 0,7V) und -0,7 V 
begrenzen und dann mit einem Kondensator an den Eingang, der mit zwei 
Widerständen auf Vcc/2 gebracht ist.

: Bearbeitet durch User
von m.n. (Gast)


Lesenswert?

c-hater schrieb:
> Björn W. schrieb:
>
>> Hat der eine Hysterese?
>
> Ja, aber eine sehr kleine.
>
>> Da konnt ich im Datenblatt nichts zu finden.

Das steht im Datenblatt unter "typische Eigenschaften".

> Nun, worauf man sich im DB nicht festlegt, braucht man auch nicht zu
> garantieren ;o)
>
> Sprich: das schwankt exemplarabhängig ganz erheblich.

Die Schwankungen sind minimal und somit völlig bedeutungslos.

Charly B. schrieb:
> den Int nach dem ersten ausloesen erst nach einer zeit X (z.B. 5 ms)
> wieder freigeben z.B. ueber einen int eines Timer's

Einen Timer muß man nicht verwenden. In Verbindung mit ext. Tiefpass und 
etwas Software, lassen sich Totzeit und große Hysterese realisieren: 
Beitrag "Re: EIN-AUS mit Taster per Interrupt, ATtiny25 o.ä."
Die ISR kann man auch einfach in Assembler umschreiben.

von c-hater (Gast)


Lesenswert?

m.n. schrieb:

> Das steht im Datenblatt unter "typische Eigenschaften".

Ist das tatsächlich so? Dann sollte es dir ja nicht schwer fallen, 
einfach mal ein Beispiel aus irgendeinem DB zu zeigen.

Ich erwarte es sehr gespannt...

von Thomas (kosmos)


Lesenswert?

hast du nicht ein paar Bytes im Flash übrig um die 
Interrupt-Einsprungtabelle vollständig anzugeben? Dürfte ein späteres 
erweitern viel leichter machen.
1
.org 0x000
2
rjmp RESET ; Reset Handler
3
reti; rjmp EXT_INT0 ; IRQ0 Handler
4
rjmp PCINT0 ; PCINT0 Handler
5
reti; rjmp TIM0_OVF ; Timer0 Overflow Handler
6
reti; rjmp EE_RDY ; EEPROM Ready Handler
7
reti; rjmp ANA_COMP ; Analog Comparator Handler
8
reti; rjmp TIM0_COMPA ; Timer0 CompareA Handler
9
reti; rjmp TIM0_COMPB ; Timer0 CompareB Handler
10
reti; rjmp WATCHDOG ; Watchdog Interrupt Handler
11
reti; rjmp ADC ; ADC Conversion Handler
12
13
Reset:              ; Main program start
14
ldi r16, low(RAMEND); Set Stack Pointer to top of RAM
15
out SPL,r16 
16
sei                 ; Enable interrupts

https://www.microchip.com/content/dam/mchp/documents/OTH/ApplicationNotes/ApplicationNotes/Atmel-2508-Zero-Cross-Detector_ApplicationNote_AVR182.pdf

Man kann das auch mit einen AC Optokoppler machen, bei den Widerständen 
gilt es auf die maximale Spannung zu achten, da viele nur bis 100V 
zugelassen sind.

: Bearbeitet durch User
von m.n. (Gast)


Angehängte Dateien:

Lesenswert?

c-hater schrieb:
> Dann sollte es dir ja nicht schwer fallen,
> einfach mal ein Beispiel aus irgendeinem DB zu zeigen.

Wenn Du schon so lieb fragst, dann nehme ich mal den ATtiny417.

Thomas O. schrieb:
> Man kann das auch mit einen AC Optokoppler machen, bei den Widerständen
> gilt es auf die maximale Spannung zu achten, da viele nur bis 100V
> zugelassen sind.

Ich bin mir garnicht sicher, ob der TO tatsächlich den (exakten) 
Nulldurchgang braucht, oder nur ein Signal synchron zur Netzfrequenz.
Bei 24 Veff müssen keine speziellen Widerstände verwendet werden.

Björn W. schrieb:
> Oder gibt es da noch elegantere Methoden in Software?

Das Signal abzuschwächen und per ADC einzulesen geht natürlich immer. 
Per Software lassen sich die Grundfrequenz filtern sowie Maximum, 
Minimum und Nulldurchgänge ermitteln.

von Charly B. (charly)


Lesenswert?

m.n. schrieb:
.
.
.
> Charly B. schrieb:
>> den Int nach dem ersten ausloesen erst nach einer zeit X (z.B. 5 ms)
>> wieder freigeben z.B. ueber einen int eines Timer's
>
> Einen Timer muß man nicht verwenden. In Verbindung mit ext. Tiefpass und
> etwas Software, lassen sich Totzeit und große Hysterese realisieren:
> Beitrag "Re: EIN-AUS mit Taster per Interrupt, ATtiny25 o.ä."
> Die ISR kann man auch einfach in Assembler umschreiben.

sicher, alle Wege fuehren nach Rom, auch die ueber Moskau
oder Peking...

von m.n. (Gast)


Lesenswert?

Charly B. schrieb:
> sicher, alle Wege fuehren nach Rom, auch die ueber Moskau
> oder Peking...

Wieso Rom? Mussolini ist doch schon länger tot.

von Björn W. (bwieck)


Lesenswert?

m.n. schrieb:
> Ich bin mir garnicht sicher, ob der TO tatsächlich den (exakten)
> Nulldurchgang braucht

Doch, brauch ich. Das Ganze soll am Ende eine Wellenpaketsteuerung für 
meine Lötstation werden.

Die Vergess ich ständig auszuschalten wenn sie nicht gebraucht wird...
Die Station soll nach Einschalten für 30 Minuten auf 100% laufen und 
dann für 30 Minuten auf 15% der Leistung laufen. Danach soll sie 
abschalten.
Der ganze Vorgang kann jederzeit per Taster retriggert werden.

von Rainer V. (a_zip)


Lesenswert?

Schöne Bastelei! Hoffentlich kommt jetzt nicht die Frage, wie du die 
Wartezeit von 30s programmierst :-)
Viel Spass und Gruß, Rainer

von Jimi H. (jimih)


Lesenswert?

Björn W. schrieb:
> Der ganze Vorgang kann jederzeit per Taster retriggert werden.

Warum nicht durch Aktivität des Lötkolben (über Wärmeverlust beim Löten) 
oder Aktivität des Nutzers (Bewegungssensor) ?

von Uwe (Gast)


Lesenswert?

Hi,
also für deine Wps reicht tätsächlich ein Tiefpass. Ob da eine Halbwelle 
mehr oder weniger ist, hat kaum Wirkung.
Für einen sauberen Phasenanschnitt ist sowas aber ungünstig.
Der ACO geht da aber wirklich recht gut weil minimale Filterwirkungen
(4 Takte Verzögerung) schon eingebaut sind. Wenn dann noch für 9,5ms der 
Int.
verhindert wird geht das ganze sehr zuverlässig.
Die beiden Eingänge bekommen 2 Dioden als Überspannungsschutz.
Die Ref.diode ist eine mit 0,2V Uf und die am Eingang eine mit 0,5V Uf.

Mach was du für richtig befindest Vorschläge gab es genug.

Viel Erfolg, Uwe

von Björn W. (bwieck)


Lesenswert?

Rainer V. schrieb:
> Hoffentlich kommt jetzt nicht die Frage, wie du die
> Wartezeit von 30s programmierst :-)

Wenn man schon Nulldurchgänge erfasst, und die kommen noch von der 
stabilen Netzfrequenz.. Da könnte man ja auf die Idee kommen die zu 
zählen ;)

von Björn W. (bwieck)


Lesenswert?

Jimi H. schrieb:
> Warum nicht durch Aktivität des Lötkolben (über Wärmeverlust beim Löten)
> oder Aktivität des Nutzers (Bewegungssensor) ?

Weil ich das alles für Unzuverlässig halte.

von c-hater (Gast)


Lesenswert?

m.n. schrieb:

> Wenn Du schon so lieb fragst, dann nehme ich mal den ATtiny417.

Du schummelst. Der ist XMega-Erbe.

Es ging aber um die klassischen AVR8, da der Tiny13 (Thema dieses 
Threads) eben einfach mal zu diesen gehört. Und da wirst du nix dazu 
finden.

von m.n. (Gast)


Lesenswert?

c-hater schrieb:
> Du schummelst. Der ist XMega-Erbe.

Schon vergessen? Du wolltest irgendeinen ATtiny und den habe ich Dir 
gezeigt.

> Es ging aber um die klassischen AVR8, da der Tiny13 (Thema dieses
> Threads) eben einfach mal zu diesen gehört. Und da wirst du nix dazu
> finden.

Ich hatte es bereits gefunden; es steht ja in jedem Datenblatt.

von Björn W. (bwieck)


Angehängte Dateien:

Lesenswert?

Funktioniert Zufriedenstellend.

Die gelbe Linie ist die Trafospannung und die türkise Linie ist die 
Sapnnung am Lötkolben bei 15% Leistung.

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.