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