Forum: Mikrocontroller und Digitale Elektronik Schalterabfrage: LED-Blinkt oder permanent leuchtet


von Kaveh D. (kaveh)


Lesenswert?

Hallo zusammen,
mit einem kleinen Programm versuche ich eine LED mal zum Blinken und mal 
zum permenent Leuchten bringen. Aber es funktioniert nicht ganz, wie ich 
mir vorgestellt habe und da ich gerade mit programmieren von 
Mikrocontrollern angefangen habe, bin ich etwas ratlos und daher möchte 
ich eure Hilfe in Anspruch nehmen.
Beschreibung meines Problemm:
ein Schalter soll abgefragt werden, ob geschlossen oder geöffnet ist?.
wenn der Schalter geschlossen ist, dann muss eine LED permanenet 
leuchten.
wenn der Schalter aber geöffnet ist, dann muss die selbe LED jetzt 
blinken.
Mit Timer 1 von Atmege8 habe ich ein PWM realisiert (Rechteck mit f=5 
Hz) und das funktioniert (gemessen mit oscilloscope).
Nun mein Problemm ist wenn der Schalter geöffnet ist, dann blinkt die 
LED aber wenn Schalter geschlossen ist, bleibt die LED für eine kurze 
Zeit dunkel und dann beginnt wieder zu blinken und das sollte in dem 
Fall aber nicht sein. Mit anderen Worten Die LED blinkt in jedem 
Zustand, in dem sich der Schalter gerade befindet.
Vielleicht weiß jemand von euch, wo der Fehler liegen kann. Da ich nach 
langem Suchen ziemlich ratlos bin.
Danke Kaveh

;+----------------------------------------------------------------------
;| Title    : myAVR Grundgerüst für ATmega8
;+----------------------------------------------------------------------
;| Funktion    : ...
;| Schaltung  : ...
;+----------------------------------------------------------------------
;| Prozessor  : ATmega8
;| Takt    : 3,6864 MHz
;| Sprache         : Assembler
;| Datum           : ...
;| Version         : ...
;| Autor           : ...
;+----------------------------------------------------------------------
.include  "m8def.inc"
.def    temp=r16
.def    temp1=r17
.equ XTAL = 4000000
;----------------------------------------------------------------------- 
-
;Reset and Interrupt vector             ;VNr.  Beschreibung
  rjmp  main  ;1   POWER ON RESET
  reti    ;2   Int0-Interrupt
  reti    ;3   Int1-Interrupt
  reti    ;4   TC2 Compare Match
  reti    ;5   TC2 Overflow
  reti    ;6   TC1 Capture
  reti    ;7   TC1 Compare Match A
  reti    ;8   TC1 Compare Match B
  reti    ;9   TC1 Overflow
  reti    ;10  TC0 Overflow
  reti    ;11  SPI, STC Serial Transfer Complete
  reti    ;12  UART Rx Complete
  reti    ;13  UART Data Register Empty
  reti    ;14  UART Tx Complete
  reti    ;15  ADC Conversion Complete
  reti    ;16  EEPROM Ready
  reti    ;17  Analog Comparator
  reti    ;18  TWI (I²C) Serial Interface
  reti    ;19  Store Program Memory Ready
;----------------------------------------------------------------------- 
-
;Start, Power ON, Reset
main:
      ldi  temp1,HIGH(RAMEND);Stack Inint
      out  SPH,temp1
      ldi  temp1,LOW(RAMEND)
      out  SPL,temp1

      ldi  temp1,0x00 ;port d eingang
      out  ddrd,temp1
      ldi  temp1,0xff
      out  portd,temp1

      ldi  temp1,0xff ;port b ausgang
      out  ddrb,temp1


mainloop:

loop1:in  temp1,pind
      sbrs  temp1,2
      sbi  portb,1
      rjmp  Blinken




Blinken:


ldi temp1, 1<<COM1A1 | 1<<WGM11
out TCCR1A, temp1
ldi temp1, 1<<WGM13 | 1<<WGM12 | 1<<CS11| 1<<CS10  ;Vorteile auf CK/64 
eingestellt
out TCCR1B, temp1

ldi temp1, 0x6F
out ICR1H, temp1
ldi temp1, 0x6F
out ICR1L, temp1

ldi temp1, 0x3F
out OCR1AH, temp1
ldi temp1, 0x3F
out OCR1AL, temp1
; Den Pin OC1A zu guter letzt noch auf Ausgang schalten
ldi temp1, 0x02
out DDRB, temp1

rjmp  loop1    ; oder soll an dieser Stelle rjmp mainloop sein

von spess53 (Gast)


Lesenswert?

Hi

Mal ehrlich, von dem, was du da zusammenkopiert hast, hast du nicht 
wirklich etwas verstanden?

>Vielleicht weiß jemand von euch, wo der Fehler liegen kann. Da ich nach
>langem Suchen ziemlich ratlos bin.

Der Fehler? Schmeiss das weg und fange von vorn an.

Den Timer brauchst du nur einmal initialisieren. Blinken schaltest du 
mit dem Setzen oder Löschen vom COM1A1-Bit.

>ldi temp1, 0x6F
>out ICR1H, temp1
>ldi temp1, 0x6F
>out ICR1L, temp1

Macht nur Sinn mit:

ldi temp1, High(Wert)
out ICR1H, temp1
ldi temp1, Low(Wert)
out ICR1L, temp1

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

Ich will mal nicht so sein. Für deine mainloop reicht folgendes:
1
mainloop:
2
      sbis  Pind,2
3
      rjmp  mainloop
4
5
Blinken:
6
      in temp1,TCCR1A
7
      sbr temp1,1<<COM1A1 
8
      out TCCR1A,temp1
9
Blinken10:
10
      sbic  Pind,2
11
      rjmp  Blinken10
12
13
      in temp1,TCCR1A
14
      cbr temp1,1<<COM1A1 
15
      out TCCR1A,temp1
16
17
      rjmp  mainloop

>Mit Timer 1 von Atmege8 habe ich ein PWM realisiert (Rechteck mit f=5
>Hz) und das funktioniert (gemessen mit oscilloscope).

Bist du sicher, das dein AVR mit der im Programm angegeben Frequenz 
läuft?
Wenn ich deine Werte durchrechne müssten ca. 2Hz herauskommen.

MfG Spess

von Kaveh D. (kaveh)


Lesenswert?

Hi,
ich habe es so gelöt und es funktioniert.danke für den tipp

       ldi    r17,0x00
       ldi    r18,0x80   ;f=7 HZ

mainloop:

      in      temp1,pind
      sbrs    temp1,2
      rjmp    led_on
      rjmp    led_blinkt

led_on:
      sbi    portb,1
      ldi    temp1,0b00000001
      out    TCCR1A,temp1
      rjmp   mainloop

led_blinkt:
      ldi    temp1,0b10000001
      out    TCCR1A,temp1
      ldi    temp1,0b00000101
      out    TCCR1B,temp1
      out    OCR1AH,r17
      out    OCR1AL,r18
      rjmp   mainloop
mfg kaveh

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
Noch kein Account? Hier anmelden.