- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 14 von 14

Thema: Taster interrupt

  1. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    09.05.2013
    Beiträge
    7
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Im Schaltplan bei den Kondensatoren ist ein Kondensator, der Betriebsspannung hat. Wird jetzt ein Schalter gedrückt, wird dieser Kondensator Entladen und gibt so einen Wert an den ADC. Zumindest habt ich den Schaltplan so verstanden. Und weil die Kondensatorspannung träge ist (ic=c*du/dt nicht) muss man dem kurz Zeit geben, sich zu entladen.

    - - - Aktualisiert - - -

    Es wird immer skurriler...
    Habe die ISR jetzt nur mit einer Flag änderung belegt die dann im Hauptprogramm abgefragt werden soll.
    Code:
       
    taster:
       ldi r20,1
       reti
    Aufgerufen wird dann:
    Code:
     .include "m8def.inc"
    
     ;############## M A I N ###########################
    
     
    .CSEG
    .org 0x0000
      rjmp main          ; Reset Handler
    reti; interrupt for into
    .org INT1addr
      rjmp taster;_interrupt    ; IRQ1 Handler
    reti; interrupt timer2 comp
    reti; interrupt for timer2 ovf
    reti; interrupt for timer1 capt
    reti; interrupt for timer1 compa
    reti; interrupt for timer1 compb
    reti; interrupt for timer1 ovf
    reti; interrupt for timer ofv
    reti; interrupt for spi,stc
    reti; interrupt for usart,rxc
    reti; interrupt for usart,udre
    reti; interrupt for usart, txc
    reti; interrupt for adc
    reti; interrupt for ee_rdy
    reti; interrupt for ana_comp
    reti; interrupt for twi
    reti; interrupt for spm_rdy
    
    .include "macros.inc"
    .include "functions.inc"
    .include "interrupts.inc"
    
     main:
    
      init:
     ;hier stehen alle möglichen inits
      sei
    
     start:
      ldi R16, 100
      mov R2, R16
      mov R3, R16
      rcall change_motorspeed
      MotorDir_FWD_FWD
      clr r20 ;test anderer interrupt
    
      wait:
      sbrc R20,0 ;if r20 bit 0 is clear dont go to get it
      rjmp get_it
      SWITCH_LEFT_BACKLED_ON
      rcall delay_turn
      SWITCH_LEFT_BACKLED_OFF
      rcall delay_turn
      rjmp wait
    
    
      get_it:
       cli  ;dont make another interrupt here
       ;dont save r16 and r17 here just a test
       clr r20
       MOTOR_BREAK
       SBI DDRD, PD3 
       SBI PORTD, PD3  ;if set the interrupt will not stop
       SET_BUMPER_TO_ADC_SOURCE
       ;rcall delay_short ;give the capacitor a bit time
       GET_ADC_VALUE R17, R16 ;r17=high, r16=low
       CBI PORTD, PD3
       CBI DDRD, PD3 ;so now that the value is in done by the adc make it again
       TRANSMIT R17 ;and send the high result
       TRANSMIT R16 ; and send the low result
       sei ;ok now you can interrupt again
       ret
    Hier tritt jetzt folgender Fehler auf:
    - Anstatt nach dem drücken eines Tasters in der Wait weiterzumachen, wird offenbar Resetet und das Teil fängt wieder an zu fahren... Mit dem anderen ISR ist er wenigstens stehen geblieben.
    - Dabei sendet er aber richtig die beiden Werte vom ADC (ob die Werte auch richtig sind, kann ich nicht sagen).
    - Bei einem bestimmten Schalter wird sporadisch wieder wie mit der anderen ISR plötzlich eine Endlosschleife ausgelöst.

    Kann es sein, das der Taster hängt, und so tatsächlich einen Dauerinterrupt auslöst? Aber wenn ja wieso bei der 2. ISR Routine nur ab und zu und bei der anderen immer? Und warum Resetet der µP bei der 2. Routine?
    Ich habe das gefühl irgendwie stimmt was mit den Sprüngen nicht so ganz...
    Geändert von Bastian90 (10.05.2013 um 12:11 Uhr)

  2. #12
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    Bad Bramstedt
    Alter
    45
    Beiträge
    1.369
    Du könntest mal z.B. mit einem Multimeter prüfen ob der Taster hängt.

    Welche beiden Werte - sollte das nicht nur ein Wert sein? Vielleicht muss man hier etwas warten, bis zum nächsten Tastendruck. Beim RP6 sagt man auch, das ja nicht direkt wieder ein Hinderniss da sein kann wenn z.B. garde ausgelöst wurde und/oder Rückwärts gefahren wird und gibt etwas zeit dazwischen.

    Also ich denke das der Kondensator C7 einfach zum Tastenentprellen da ist,da er parallel zu den tastern ist - und der muss sich wieder aufladen (give a bit time), damit er auch wiederholt das Tastenprellen abfangen kann. Also Aufgeladen wird er schon, aber diese Spannung wird ja nicht zum ADC zurückgeführt, denn dann würde annährend die Betreibsspannung gemessen - was in diesem Fall ja keinen Sinn macht Der entläd sich also über GND des gedrückten Tasters. Sonst würde der Interrupt auf PD3 vielleicht auch garnicht reagieren.
    Ist der Interrupt vielleicht noch falsch eingestellt - er müsste so eingestellt sein das immer bei fallender Flanke ausgelöst wird. Aber nicht bei steigender. Hast da vielleicht was verstellt (umprogrammiert)?
    Wenn also ein Interrupt (spannung geht zu GND) an PD3 erkannt wird (Tasterdruck) dann schaltet er den ADC4 ein - bzw eher übergibt den Wert der am ADC ansteht in eine Variable ein.

    Ich hoffe das ist in etwa so
    Geändert von HeXPloreR (10.05.2013 um 15:11 Uhr)

  3. #13
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Beim Tastendruck wird ein Spannungsteiler zwischen dem Tasterwiderstand und R24 gebildet. R24 liegt dann über PD3 an Vcc (Ausgang, high), C7 dient zum Entprellen und die an ihm anliegende Spannung wird dann über PC4 eingelesen. Beim asuro sind die Tastenwiderstände so gewählt, dass man auch das gleichzeitige Drücken mehrerer Tasten erkennen und die beteiligten Tasten ermitteln kann.

    "Kann es sein, das der Taster hängt..." Ich vermute, du verwendest einen Pinchange-Interrupt beim INT1 und der wird ausgelöst, wenn du eine Taste drückst (Eingang PD3 mit internem Pullup? wird low) und aber auch, wenn du PD3 zur Messung der Tastenspannung auf High setzt. Am Ende der ADC-Messung wird PD3 dann wieder auf Interrupteingang geschaltet und das Spielchen beginnt von vorne, solange ein Taster gedrückt ist.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    09.05.2013
    Beiträge
    7
    Zitat Zitat von radbruch Beitrag anzeigen
    Am Ende der ADC-Messung wird PD3 dann wieder auf Interrupteingang geschaltet und das Spielchen beginnt von vorne, solange ein Taster gedrückt ist.
    So sollte es ja auch sein Aber bei mir bleibt er im Interrupt obwohl der Taster losgelassen wurde...

    Der ADC wird so initialisiert:
    Code:
      init_adc:
        ldi R16, (1 << ADEN) | (1 << ADPS1) | (1 << ADPS2)
        out ADCSRA, R16
    Und dann wird im Interrupt, oder auch außerhalb der ADC Eingang eingestellt:
    Code:
     .macro SET_BUMPER_TO_ADC_SOURCE
       push R16 ;save R16
       ldi R16, (1 << REFS0)|(1 << MUX2)|(1 << ADLAR);set ADC4 to source
       ;ldi R16, (1 << REFS0)|(1 << MUX2) ;set ADC4 to source
       out ADMUX, R16 ;send the definition to ADMUS
       pop R16; restore R16
     .endm
    Der Interrupt ist auch auf eine fallende Flanke gestellt:
    Code:
      init_interupt:
        in R16 , MCUCR
        SBR R16, (1 << ISC11)
        CBR R16, (1 << ISC10) ;faling will trigger an interrupt
        out MCUCR, R16
        in R16, GICR
        sbr R16, (1 << INT1);activate interupt1
        out GICR, R16

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. Screens wechseln mit 2 Taster (oder mit einem Taster)
    Von tordy im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 14.07.2009, 13:39
  2. Taster per Interrupt nutzen
    Von lalas im Forum Assembler-Programmierung
    Antworten: 4
    Letzter Beitrag: 01.07.2008, 18:54
  3. Interrupt durch Taster ausgelöst
    Von Seppi1203 im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 05.03.2007, 21:25
  4. Mit Taster 1 auswählen und Taster 2 bestäti. " Menü aus
    Von Luppi im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 07.04.2006, 21:07
  5. Interrupt waehrend Interrupt
    Von thomas05 im Forum PIC Controller
    Antworten: 7
    Letzter Beitrag: 08.11.2005, 06:13

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests