Tiny13 ASM externer IRQ löst nicht aus..

OP #6847047
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
Gast #6847078
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.
OP #6847979
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?
#6848006
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.
Gast #6848023
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 ;-)
Gast #6848104
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.
#6848153
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.
Gast #6848249
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.
#6848281
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.
Gast #6848372
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.
Angehängte Dateien:
#6848843
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...
OP #6849048
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.
Gast #6849118
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
Gast #6849740
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren