Hallo zusammen, ich habe auf einem Atmel Experimentierkasten folgendes vor: Mit dem Taster 1 soll eine rote LED leuchten auf Knopfdruck. Mit dem Taster 2 soll die gleiche LED leuchten, diesmal aber gedimmt. mit Taster 1&2 zusammen soll eine gelbe LED leuchten. Folgendes habe ich vor: Taster 1: Eingang (Pin B.0) Taster2: (Pin B.1) Taster 1&2: (Pin B.0 & B.1) LED 1 Ausgang (Port B.2) LED 1 Ausgang (Port B.3) LED 2 Ausgang (Port B.4) Ich möchte dafür 3 Unterprogramme machen: mainloop - Unterprogramm 1->rote LED - Unterprogramm 2->rote LED gedimmt . Unterprogramm 3 ->gelbe LED zurück Leider habe ich schon Probleme den Port B.2 als Ausgan zu definieren, wenn die ersten beiden Pins die Eingänge sind (PinB.0, Pin B.1). Ich weiss nicht genau, ob allenfalls im main in der Konfigurierung der Ein- und Ausgänge schon Fehler sind. Zusätzlich habe ich ein Chaos mit den Registern, weil ich nicht genau weiss, wann ich welches einsetzen muss. Unterprogramm 1 habe ich versucht zu machen Unterprogramm 2 mit PWM noch nicht, da ich schon bei 1. Probleme habe Unterprogramm 3 funktioniert nicht. Momentan leuchten LED 1 und 2 gleichzeitig, wenn ich Taster 1 drücke. Bei Taster 2 passiert nichts. Könnte mir vielleicht jemand helfen für diese Probleme irgendwie zu lösen?!? Vielen Dank:-) simonhu Wo ich ein Problem sehe: im mainloop: in r17, PINB ;Input Taster 1 in r19, PINB ;Input Taster 2 Ich möchte eigentlich Taster 1 ins Register 17 schreiben und Taster 2 ins Register 2. Aber so ist es falsch, so wie ich das glaube...???? Code: ;---------------------------------------------------------------------- ; Title : gedimmtes und ungedimmtes LED-Licht ;---------------------------------------------------------------------- ; Funktion : Mit Taster 1 und 2 kann man 3 verschiedene Modi einstellen ; Schaltung : PORTB.1=COB-LED undgedimmt PORTB.2=COB-LED gedimmt PORTB.3=LED-Rot ;---------------------------------------------------------------------- ; Prozessor : ATmega8 ; Takt : 3,6864 MHz ; Sprache : Assembler ; Datum : 20.04.2013 ; Version : 1.0 ; Programmer : ; Port : ;---------------------------------------------------------------------- .equ F_CPU, 3686400 .include "AVR.H" ;----------------------------------------------------------------------- ;Reset and Interruptvectoren ;VNr. Beschreibung begin: 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 Comperator reti ;18 TWI (I²C) Serial Interface reti ;19 Strore Program Memory Ready ;----------------------------------------------------------------------- - ;Start, Power ON, RESET main: ldi r16,lo8(RAMEND) out SPL,r16 ;Init Stackpointer LO ldi r16,hi8(RAMEND) out SPH,r16 ;Init Stackpointer HI; cbi DDRB,0 ;Definition Eingang cbi DDRB,1 ;Definition Eingang sbi PORTB,0 ;Pull up Port B.0 sbi PORTB,1 ;Pull up Port B.1 sbi DDRB,2 ;Port B.2 out sbi DDRB,3 ;Port B.3 out ;sbi DDRB,4 ;Port B.4 out ;----------------------------------------------------------------------- - mainloop: ldi r16, 0b00000001 ;Watchdor inizialisieren ldi r18, 0b00000010 ;Watchdor inizialisieren in r17, PINB ;Input Taster 1 in r19, PINB ;Input Taster 2 rcall led1 ;rcall led1dimm rcall ledgelb ;sbrs r17, 0 ;ldi r16, 0b00000111 ;Register auf Ausgansmodus setzen ;out PORTB, r16 ;wdr ;Watchdor inizialisieren rjmp mainloop ;zurück auf Anfang ;----------------------------------------------------------------------- - led1: sbrs r19, 0 ldi r16, 0b00000101 ;Register auf Ausgansmodus setzen out PORTB, r16 ;Port 3 auf B auf 1 setzen ret ;----------------------------------------------------------------------- - ;led1dimm: ;sbrs r18, 0 ;Skip, wenn keine Taste auf 1 ;ldi r16, 0b00001001 ;Daten wenn Taster ein ;out PORTB, r16 ;push r16 ;sbi ioPORTB,1 ; PWM-Chanel A ;ldi r16,0b10000001 ; PWM-Mode ;out ioTCCR1A,r16 ;ldi r16,0b00000010 ; Vorteiler / PWM Frequenz ;out ioTCCR1B,r16 ;pop r16 ;ret ;sbrs r17, 0 ;Skip, wenn keine Taste auf 1 ;ldi r16, 0b00000011 ;Daten wenn Taster ein ;out PORTB, r16 ;zurück auf Anfang ret ;----------------------------------------------------------------------- - ledgelb: sbrs r19, 0 ldi r18, 0b00001010 out PORTB, r18 ret
:
Verschoben durch Moderator
simon simon schrieb: > mainloop: > ldi r16, 0b00000001 ;Watchdor inizialisieren > ldi r18, 0b00000010 ;Watchdor inizialisieren Hö? Du meinst Watchdog, aber mit diesem haben r16 und r18 absolut nichts zu tun. Schalt das Ding per Fuse ab und kümmere dich darum wenn der Rest funktioniert. Ich denke Bitmanipulation und das Tutorial oben links (-->Eingänge abfragen) könnten nützlich sein.
simon simon schrieb: > ldi r16,lo8(RAMEND) > out SPL,r16 ;Init Stackpointer LO > ldi r16,hi8(RAMEND) > out SPH,r16 ;Init Stackpointer HI; Laut AN AVR072 muss das umgekehrt: Es high und dann low.
troll schrieb: > simon simon schrieb: >> mainloop: >> ldi r16, 0b00000001 ;Watchdor inizialisieren >> ldi r18, 0b00000010 ;Watchdor inizialisieren > Hö? Du meinst Watchdog, aber mit diesem haben r16 und r18 absolut nichts > zu tun. Schalt das Ding per Fuse ab und kümmere dich darum wenn der > Rest funktioniert. > > Ich denke Bitmanipulation und das Tutorial oben links (-->Eingänge > abfragen) könnten nützlich sein. Ja sorry hier stimmt der Kommentar nicht. Sollte heissen ldi r16, 0b00000001 ;Ausgabedaten bei Taster 1 offen ldi r18, 0b00000010 ;Ausgabedaten bei Taster 2 offen
troll schrieb: > simon simon schrieb: >> ldi r16,lo8(RAMEND) >> out SPL,r16 ;Init Stackpointer LO >> ldi r16,hi8(RAMEND) >> out SPH,r16 ;Init Stackpointer HI; > Laut AN AVR072 muss das umgekehrt: Es high und dann low. Laut meiner Basisstruktur/Vorlage stimmt das. Sollte auch so funktionieren.
simon simon schrieb: > troll schrieb: >> Laut AN AVR072 muss das umgekehrt: Es high und dann low. > Laut meiner Basisstruktur/Vorlage stimmt das. Sollte auch so > funktionieren. Mach was du willst, ich vertraue dem was Atmel schreibt. Die müssen es wissen, die stellen die Käfer her. Mal so als Idee, ungefähr so würde ich das lösen. Die ISR-Tabelle ist gekürzt. Entprellung und die Unterprogramme fehlen. Ohne Gewähr, hab es nicht assembliert und getestet.
1 | .def temp=r16 |
2 | |
3 | .equ F_CPU=3686400 |
4 | .equ LEDPORT=PORTB |
5 | .equ TASTERPIN=PINB |
6 | .equ DDRLEDTASTER=DDRB |
7 | .equ TASTER1=PB0 |
8 | .equ TASTER2=PB1 |
9 | .equ LEDROT=PB2 |
10 | .equ LEDGELD=PB3 |
11 | |
12 | .include "AVR.H" |
13 | |
14 | rjmp main ; 1 POWER ON RESET |
15 | reti ; 2 Int0-Interrupt |
16 | [...........] |
17 | |
18 | main: |
19 | ldi temp,hi8(RAMEND) |
20 | out SPH,temp;Init Stackpointer HIGH |
21 | ldi temp,lo8(RAMEND) |
22 | out SPL,temp;Init Stackpointer LOW |
23 | |
24 | ;Eingänge |
25 | ldi temp,(1<<LEDROT)|(1<<LEDGELB) |
26 | out DDRLEDTASTER,temp |
27 | ;Pullups |
28 | ldi temp,(1<<TASTER1)|(1<<TASTER2) |
29 | out LEDPORT,temp |
30 | |
31 | mainloop: |
32 | in temp,TASTERPIN |
33 | andi temp,(1<<TASTER1)|(1<<TASTER2) |
34 | cpi temp,(1<<TASTER1) |
35 | breq ledrot |
36 | cpi temp,(1<<TASTER2) |
37 | breq ledrotgedimmt |
38 | cpi temp,(1<<TASTER1)|(1<<TASTER2) |
39 | breq ledgelb |
40 | rjmp mainloop |
Sorry für OT, wo ist eigentlich Karl Heinz Buchegger? Der ist doch sonst immer sofort zur Stelle... Im Urlaub?
troll schrieb: > Der ist doch sonst > immer sofort zur Stelle... Im Urlaub? Es steht "Assembler" drüber, dürfte nicht so sein Metier sein.
Jörg Wunsch schrieb: > troll schrieb: >> Der ist doch sonst >> immer sofort zur Stelle... Im Urlaub? > > Es steht "Assembler" drüber, dürfte nicht so sein Metier sein. :-) Doch. Aber ich war bis vor kurzem beschäftigt. Und ausserdem hab ich beschlossen mich mal etwas zurückzuhalten. Speziell in Konstellationen wie dieser hier > ich habe xxxx vor > Leider habe ich schon Probleme ... als Ausgang zu definieren > wenn die ersten beiden Pins die Eingänge sind (PinB.0, Pin B.1). Also Dinge, die im ersten echten Programmierkapitel des Tutorials m.M. nach erschöpfend abgehandelt werden.
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.