hallo erstmal, ich habe eine kleine steuerung mit einem ATmega32 realisiert, mit dem ich ein Relias ansteuere, das wiederrum ein 230v ventil ansteuert. das Ventil soll über zwei wege angesteuert werden. 1- automatisch: es sind zwei schwimmerschalter, die in einem wassertank angebracht sind. der erste schalter schaltet das Relias ein und der zweite schalter schaltet dies wieder aus (Ausgang PORTD,6). 2- Manuel: dies bedeutet das Relias über einen taster (S1) einzuschalten bzw über einen zweiten taster (S2) wieder auszuschalten. obwohl PORTd,6 über den zweiten schwimmerschalter im Automatikbetrieb ausgeschaltet ist. und da liegt mein problemm. ich habe den manuelbetrieb über INT0 für einschalten und INT1 für das ausschalten realisiert und es funktioniert nur einmal. das heißt, ich kann PORTD,6 mit taster S1 einschalten und mit Taster S2 wieder ausschalten, aber dann reagiert das programm nicht mehr und es kann nicht mehr manuel wieder eingeschaltet werden. die tastern sind wirkungslos. es sei denn ich übertrage den programmcode erneut in den controller und kann es nur einmal einschalten und das problemm taucht wieder ein. da möchte ich euch zur hilfe bieten. danke kaveh .include"m32def.inc" rjmp main .org INT0addr ;Interrupt0 INT0 INT1 rjmp INT0_einschalten ;manuele ein bzw ausschalten vom Ventil 1 über Interrupt .org INT1addr rjmp INT1_ausschalten .def temp=r16 main: ldi temp,high(ramend) out sph,temp ldi temp,low(ramend) out spl,temp ;interrupts ldi temp,0b11000000 out GICR,temp ldi temp,0b00001010;Interrupt auf fallende Flanke auslösen out MCUCR,temp sei ;Interrupt erlauben ;eingänge cbi DDRC,6 ; SW2 als Eingang konfig. sbi PORTC,6 ; Pull-Up widerstand. cbi DDRC,5 ; SW3 als Eingang konfig. sbi PORTC,5 ; Pull-Up widerstand. ;ausgänge sbi DDRD,6 ; Relais-1 als Ausgng konfig. mainloop: ;--------Automatik sbic pinc,6 sbi portd,6 sbic pinc,5 cbi portd,6 rjmp mainloop ;-----------------------------Manuel INT0_einschalten: push temp in r18,SREG rcall Ventil_1M out SREG,r18 pop temp reti ventil_On: push temp in r18,SREG Loop1M: sbi PORTD,6 sbic PIND,3 rjmp Loop1M out SREG,r18 pop temp ret INT1_ausschalten: push temp in r18,SREG cbi PORTD,6 out SREG,r18 pop temp reti
> rcall Ventil_1M
Ich vermisse das Label Ventil_1M und den Code der da dazugehört.
Und ich frag mich warum du da für die Taster INterrupts nimmst. Sieh doch deine Taster als ganz normale Eingänge an, so wie es die Schwimmschalter auch sind, und pack den Code dafür in die main-Schleife. Deine mainloop wird in weniger als 15µs einmal durchlaufen. Kein Mensch kann einen Taster derartig schnell drücken und wieder loslassen, als das du dieses Ereigniss im Programm verpassen würdest. Als Faustregel: Alles was dein Benutzer mit Tastern oder sonstige Eingabegeräte macht, ist für einen µC extreme Zeitlupe! In dem Zeitraum, den du als Mensch einmal zum blinzeln brauchst, löst dein µC viele viele quadratische Gleichungen.
> 1- > automatisch: es sind zwei schwimmerschalter, die in einem wassertank > angebracht sind. der erste schalter schaltet das Relias ein und der > zweite schalter schaltet dies wieder aus (Ausgang PORTD,6). > > 2- > Manuel: dies bedeutet das Relias über einen taster (S1) einzuschalten > bzw über einen zweiten taster (S2) wieder auszuschalten. Und der interesante Fall entsteht dann, wenn der SChwimmschalter ein sagt und der Mensch aus. Bzw. umgekehrt: der Mensch ein sagt aber der SChwimmschalter aus.
oh entschuldiege ich muss mich hier korrigieren, richtig ist so: INT0_einschalten: push temp in r18,SREG rcall ventil_On out SREG,r18 pop temp reti ventil_On: push temp in r18,SREG Loop1M: sbi PORTD,6 sbi PORTA,0 sbic PIND,3 rjmp Loop1M out SREG,r18 pop temp ret INT1_ausschalten: push temp in r18,SREG cbi PORTD,6 cbi PORTA,0 out SREG,r18 pop temp reti
Wie gesagt: Nimm die Taster-Logik mit in die mainloop. Einen µC im Interrupt in einer Schleife festhalten macht man sowieso nicht.
Karl Heinz Buchegger schrieb: > Wie gesagt: > Nimm die Taster-Logik mit in die mainloop. danke für den Tipp. ich habe es mit einem unterprogramm in mainloop realisiert und es funktioniert. > Einen µC im Interrupt in einer Schleife festhalten macht man sowieso > nicht. da hast Du Recht, in dem fall sollte man den Finger vom Interrupt lassen. in dem sinne einen schönen Tag
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.