hallo leute, ich bin vor ein paar wochen angefangen mich mit avr microkontrollern zu befassen und habe mir ein myavr einsteiger set gekauft und mit dem lehrbuch schon viel gearbeitet und die beispiele nach programmiert. Jetzt wollte ich mal etwas selbst erstellen aber habe da so ein paar probleme mit. Ich habe vor eine zugangskontrolle für einen raum zu bauen. als sensoren für den eingang habe ich zwei lichtschranken, eine soll zum hoch zählen sein und eine zum runter zählen. wenn der zähler oder register ungleich 0 ist soll ein ausgang auf 1 sein. Ich habe jetzt mal versucht etwas zu programmieren. die 2 taster auf dem testboard habe ich statt der lichtschranken genommen und um den ausgang an zu zeigen habe ich eine led auf dem testboard verwendet. nun mein problem: wenn ich starte ist die led aus, betätige ich kurz einen taster geht die led an aber wenn ich den anderen taster wieder drücke der den register um 1 verringern soll, geht die led nicht mehr aus. könnt ihr mir vielleicht helfen und sagen wie ich das problem lösen kann. wahrscheinlich muss ich die Taster entprellen aber ich weiß nicht wie es Softwaretechnisch am besten geht und an welcher stelle ich die Befehle einsetzen muss. MfG meino hier mein Programm ;----------------------------------------------------------------------- --- ; Title : Assembler Grundgerüst für myAVR-Board ;----------------------------------------------------------------------- --- ; Funktion : ... ; Schaltung : ... ;----------------------------------------------------------------------- --- ; Prozessor : ATmega8 ; Takt : 3,6864 MHz ; Sprache : Assembler ; Datum : ... ; Version : ... ; Autor : ... ;----------------------------------------------------------------------- --- .include "AVR.H" ;----------------------------------------------------------------------- ---- ; Reset and Interrupt vector Beschreibung begin: rjmp main ;POWER ON RESET reti ;Int0-Interrupt reti ;Int1-Interrupt reti ;TC2 Compare Match reti ;TC2 Overflow reti ;TC1 Capture reti ;TC1 Compare Match A reti ;TC1 Compare Match B reti ;TC1 Overflow reti ;TC0 Overflow reti ;SPI, STC Serial Transfer Complete reti ;UART Rx Complete reti ;UART Data Register Empty reti ;UART Tx complete reti ;ADC Conversion Complete reti ;EEPROM Ready reti ;Analog Comparator reti ;TWI (I²C) Serial Interface reti ;Store Program Memory Redy ;----------------------------------------------------------------------- ---- ; Start, Power ON, Reset main: ldi r16, lo8(RAMEND) out SPL, r16 ldi r16, hi8(RAMEND) out SPH, r16 cbi DDRD, 2 sbi PORTD, 2 cbi DDRD, 3 sbi PORTD, 3 ldi r16, 0b11111111 out DDRB, r16 ldi r17, 0b00000000 ;----------------------------------------------------------------------- ---- mainloop: wdr sbis PIND, 2 rjmp zplus sbis PIND, 3 rjmp zminus rjmp mainloop ;----------------------------------------------------------------------- ---- zplus: inc r17 rjmp vergleich zminus: dec r17 rjmp vergleich vergleich: cpi r17, 0 brcc ausgabe ldi r16, 0b00000000 out PORTB, r16 rjmp mainloop brcc ausgabe rjmp mainloop ausgabe: ldi r16, 0b00000001 out PORTB, r16 rjmp mainloop
meino schrieb: > nun mein problem: wenn ich starte ist die led aus, betätige ich kurz > einen taster so kurz kannst du gar nicht drücken, dass dein µC dieses Drücken nicht viele tausend male registriert. Alles was du tust, tust du aus Sicht des µC in extremer Zeitlupe. http://www.mikrocontroller.net/articles/AVR-Tutorial:_Tasten
Hi Da hat KHB recht. Die Lösung heißt "Flankenerfassung". Da du dich in ASM austobst, mal eine kleine Hilfe: Lese die Eingangsbits in eine Variable. Das macht dich erst mal von der Hardware unabhängig. So kannst du am Anfang deiner Programmschleife ein Unterprogramm aufrufen, um die Eingänge in eine Variable einzulesen. Nennen wir sie New_In. Über eine Exclusiv-Oder Verknüpfung mit em vorherigen ( alten) Zustand bekommst du heraus, ob sich ein Bit geändert hat. Nennen wir diese Variable Old_In. Diese Operation geht nur über Register. Also,
1 | LDS reg_A, New_In |
2 | LDS Reg_B, Old_In |
3 | EOR Reg_A, Reg_B |
4 | BREQ Weiter ; wenn 0 dann keine Änderung |
5 | LDS REG_B, New_In ; Reg_A hat das Ergebnis aus EOR |
6 | AND REG_B, Reg_A ; gesetzte Bits = Flanke von 0 nach 1 |
7 | STS Flag_To_High, Reg_B ; auch in eine Variable eintragen |
8 | LDS Reg_B, Old_In |
9 | AND REG_B, Reg_A ; gesetzte Bits = Flanke von 1 nach 0 |
10 | STS Flag_To_Low, Reg_B ; auch in eine Variable eintragen |
11 | Weiter: |
12 | LDS Reg_A, Flag_To_High |
13 | ANDI Reg_A, 0b00001000 ; Ist Taste auf Bit 3 betätigt ? |
14 | BREQ Weiter1 |
15 | RCALL Step_Up |
16 | Weiter1: |
17 | LDS Reg_A, Flag_To_High |
18 | ANDI Reg_A, 0b00000100 ; Ist Taste auf Bit 2 betätigt ? |
19 | BREQ Weiter2 |
20 | RCALL Step_down |
21 | Weiter2: |
22 | LDS reg_A, New_In |
23 | STS Old_In, Reg_A ; Und neuen Zustand der Eingänge merken |
24 | .... |
Nun hast du nur wen ein Signalwechsel erfolgt ist, dir ein Bit gesetzt. In der Behandlungsroutine dafür setzt du dieses am Schluß zurück. Damit wird diese Routine nur einmal aufgerufen, wen du die Taste beätigst.
1 | Step_Up: |
2 | LDS Reg_A, Counter |
3 | INC Reg_A |
4 | STS Counter, Reg_A ; Tastendruck zählen |
5 | LDS Reg_A, Flag_To_High |
6 | ANDI Reg_A, 0b11110111 ; Nur Bit 3 auf 0 setzen |
7 | STS Flag_To_High, Reg_A ; Flag quittieren |
8 | RET |
Beachte aber, die Signallage bei gedrücktem Taster muss "1" sein. In der Regel aber werden Taster aber gegen GND geschaltet, wegen der internen Pull-Up Widerstände. Du kannst aber die Signallage anpasen, indem du die Eingangsbits vor der Ablage in New_In mit "1" Exclusiv Oder verknüpfst.
1 | |
2 | In Reg_A, PinD |
3 | LDI Reg_B, 0b11111111 |
4 | EOR Reg_A, Reg_B |
5 | STS New_In, Reg_A |
Diese Info sollte erst mal weiterhelfen. zum Entprellen der IO's wirst du dir evtl. auch noch Gedanken machen müssen, da diese Flankenauswertung dies nicht berücksichtigt. Gruß oldmax
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.