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.