rcall schlafen ; Pwr active, pwr down, wait for PIND3
53
rcall check
54
;rcall led
55
56
57
58
59
schlafen:
60
clr pressedcount
61
clr a
62
ldi a, (0<<PB2) | (0<<PB3) | (0<<PB4) ; Port B Pin 2,3,4 als Ausgang
63
out DDRB, a
64
clr a
65
out OCR1AL, a ; PWM Register loeschen
66
out OCR1BL, a
67
out OCR0A, a
68
out TCCR0A, a ; Beide Timer deaktivieren
69
out TCCR0B, a
70
out TCCR1A, a
71
out TCCR1B, a
72
ldi a, (1<<SM0) | (1<<SM1) | (1<<SE) | (1<<ISC10) | (0<<ISC11) ; Power down, reagiert auf jede Pinaenderung, sleep enable
73
out MCUCR, a
74
sei
75
sleep ;<<<<<<<<< ein Sprung auf PIND3 weckt ihn trotzdem nicht auf
76
77
nop ;Zeit nach dem Sleep sich einzuschwingen (interner Oszi)
78
nop
79
nop
80
nop
81
nop
82
nop
83
nop
84
rcall check
85
86
INT1_handler:
87
cli
88
in sregsave, SREG
89
inc pressedcount
90
out SREG, sregsave
91
sei
92
reti
-Nach dem sleep kann ich machen was ich will nix passiert -- aktiv:
ISC01 (MCUCR), INT1 (GIMSK), SEI (SREG), DDRB auch auf Eingang aber der
Interrupt würd trotz Ausgang getriggert werden...
-Ein Taster zieht den Pin auf GND, also active LOW config.
- Wenn ich ISC11 und ISC10 komplett lasse (auf 0), also es soll ein
Interrupt auf LOW getriggert werden, dann springt er kontinuierlich auf
die INT1 Interruptadresse, dann auf den handler, und nach dem reti
wieder auf die Interruptadresse.
Auf wunsch schick ich das ganze Programm als Anhang, is etwas länger
deswegen hab ichs nicht gepostet.
Ist ein 3-channel 4 Stufen Dimmer mit Pwr down und standby mode. -.-
8 Bit Fast PWM ~1kHz
Was habe ich bitte übersehen? Kann mir jemand bitte helfen?
1) Wo genau setzt du GIMSK in deinem Code?
2) Der Programmcounter läuft nach dem rcall check in main direkt in die
Funktion schlafen rein.
> reagiert auf jede Pinaenderung
3) Bei manchen AVRs ist das Aufwachen per INT nur bei bestimmten
Bedingungen möglich (z.B. low level). Sagt das DB zu deinem AVR was dazu
Hy! Vielen Dank für die schnelle Antwort!
1) steht ganz am anfang in der reset routine unter dem PD3.
2) das verstehe ich leider nicht. wie könnte ich es ändern, dass nach
dem sleep auf "rjmp check" gesprungen wird? indem dass der interrupt
ausgelöst wird oder?
3) ja, das geht beim Tny2313. INT1 ist auf jede änderung programmiert.
(ISC10)
also der program counter zügelt nach und deswegen geht es nicht? muss
ich da einfach extra sprungmarken einfügen?
vielen dank für die hilfe!
ach ja zu 2)
er kommt ja gar nicht mal bis "rcall check".
er soll gleich nach dem start schlafen, aber er wacht nicht auf bei
einem interrupt von INT1 auf PD3.
1) GIMSK
Ah dort habe ich es nicht erwartet.
Ich habe es in der Nähe von MCUCR gesucht.
2) Du brauchst eine saubere Struktur deines Programms z.B.
1
; Definitionen
2
3
; Initialisierungscode
4
5
mainloop:
6
; Unendliche Arbeitsschleife...
7
rcall schlafen
8
rcall check
9
rjmp mainloop
10
11
; #########
12
13
schlafen:
14
; Code ...
15
ret
16
17
; #########
18
19
check:
20
; Code ...
21
ret
22
23
; #########
24
25
INT1_handler:
26
in sregsave, SREG
27
inc pressedcount
28
out SREG, sregsave
29
reti
Der Aufruf von check in schlafen würde ich nicht machen. Das ist ja
derzeit doppelt gemoppelt - in main und in schlafen.
Du musst auch überlegen, ob die Aufwachbedingung (INT1) nach dem
Aufwachen weiterhin anliegt, d.h. ob der AVR dann dauernd im
INT1_handler rumrennt. Bei einem Level-Interrupt oder bei
Flanken-Interrupt mit prellenden externen Bauteilen ist das der Fall.
Das kann man beheben, wenn man im INT1_handler nach dem Auftreten des
ersten INT1 weitere INT1s sperrt (GIMSK). Und später vorm Schlafenlegen
wieder zulässt. Vorm Zulassen des INT1 aber das ggf. anstehende alte
INT1-Flag löschen!
Power-down mode:
"Only an External Reset, a Watchdog Reset, a Brown-out Reset, USI start
condition interrupt, an external level interrupt on INT0, or a pin
change interrupt can wake up the MCU."
Peter
1) :) ja, eig. sollte es ja immer gelten ^^
2) alles klar, ich strukturiere das programm mal anders, und schau was
passiert. ja, kenne ich, danke für die tipps mit der flag und im
allgemeinen =) !!!
wenn ich damit fertig bin poste ich es nochmal, kann aber bis morgen
dauern..
danke !!