mikrocontroller.net

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


Autor: Kaveh Deiport (kaveh)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Ich will mal nicht so sein. Für deine mainloop reicht folgendes:
mainloop:
      sbis  Pind,2
      rjmp  mainloop

Blinken:
      in temp1,TCCR1A
      sbr temp1,1<<COM1A1 
      out TCCR1A,temp1
Blinken10:
      sbic  Pind,2
      rjmp  Blinken10

      in temp1,TCCR1A
      cbr temp1,1<<COM1A1 
      out TCCR1A,temp1

      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

Autor: Kaveh Deiport (kaveh)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.