Willkommen Gast. Bitte einloggen oder registrieren.
März 16, 2025, 06:43:45
Übersicht Ungelesene Beiträge auflisten Hilfe Suche Spiele Mitgliederkarte Kalender Login Registrieren

Schnellsuche
+  MODDING-FAQ FORUM
|-+  Alles rund ums Modden
| |-+  Elektronik, Elektrik (Moderator: TzA)
| | |-+  Taster als Schalter via AVR
  « vorheriges nächstes »
0 Mitglieder und 2 Gäste betrachten dieses Thema.
Seiten: 1 ... 6 7 8 9 10 [11] 12 13 14 15 16 17 nach unten Drucken
Autor Thema: Taster als Schalter via AVR  (Gelesen 152225 mal)
OlafSt
Global Moderator

*

Karma: +13/-0
Offline Offline
Geschlecht: Männlich
Beiträge: 2138


Master of STLCD and LISA III


Profil anzeigen
Re: Taster als Schalter via AVR
« Antwort #150 am: November 8, 2007, 18:20:09 »

Oder solche eleganten Sachen wie AND und OR benutzen... Wink
Gespeichert

Erstens: Lies was da steht. Zweitens: Denk drüber nach. Drittens: Dann erst fragen
Fabeulous
Gast


E-Mail
Re: Taster als Schalter via AVR
« Antwort #151 am: November 8, 2007, 18:21:18 »

Also wir wollen es mal nicht übertreiben mit AND und OR Cheesy
Ich mach das jetzt ersmal mit der unelegenaten methode und wenn das funktioniert verfeinere ich das. Langsam gehen mir nämlich die zum weiter machen animierenden Glücksmomente aus...
Gespeichert
Reisi
Lötkolbenfreak

*

Karma: +2/-0
Offline Offline
Beiträge: 190



Profil anzeigen
Re: Taster als Schalter via AVR
« Antwort #152 am: November 8, 2007, 18:33:34 »

Würde es denn so auch funktionieren?
Jein, solange der µC mit der sinnlosen Warteschleife beschäftigt ist, kann natürlich nicht überprüft werden, ob ein Zeichen am UART empfangen wurde. Das kann dann natürlich sehr wohl zu einen Problem werden.

Aber ich würd dir sowieso erst mal empfehlen erst mal nur die Tastenabfrage und Ausgabe zu erledigen, und wenn das funktioniert die Tastenabrage auf Interrupts umstellen. Erst wenn das funktioniert solltest dich mit dem UART beschäftigen.
Gespeichert
PoWl
Dremelfreund

*

Karma: +0/-0
Offline Offline
Beiträge: 140


Atmel AVR Mikrocontroller


Profil anzeigen
Re: Taster als Schalter via AVR
« Antwort #153 am: November 8, 2007, 18:46:41 »

Also wir wollen es mal nicht übertreiben mit AND und OR Cheesy
Ich mach das jetzt ersmal mit der unelegenaten methode und wenn das funktioniert verfeinere ich das. Langsam gehen mir nämlich die zum weiter machen animierenden Glücksmomente aus...

setz dich dran, denkn bissel nach.. je nach taktrate deines kopfes bist du innerhalb von 5 minuten und ner halben stunde fertig.. kein frust und keine langwierigen programmierversuche, und du lernst es gleich richtig^^

lg, PoWl
Gespeichert
Fabeulous
Gast


E-Mail
Re: Taster als Schalter via AVR
« Antwort #154 am: November 9, 2007, 18:17:53 »

So ich habe was von dem ich denke das es eigentlich funktionieren müsste:
Leider gehen anstatt eine einzelne LED, alle an(wenn ich den Taster drücke. Egal an welchem eingangspin) und auch nur wenn ich temp1 vor der ausgabe invertiere! Ich verstehe nicht warum temp1 nach dem farbig markiertem anscheinend den wert 0b00000000 hat. Es müsste doch eigentlich an der stelle eine 1 haben an der ein taster gedrückt wurde oder nicht?

Zitat
.include "m8def.inc"
.def temp1              = r16
.def temp2           = r17
.def tast_neu           = r18
.def tast_alt           = r19
.def temp3           = r20
.def temp4           = r21
.def temp5           = r22
.def temp6           = r23


.equ F_CPU = 8000000        ; Systemtakt in Hz
.equ BAUD  = 9600           ; Baudrate
 
; Berechnungen
.equ UBRR_VAL   = ((F_CPU+BAUD*Cool/(BAUD*16)-1)  ; clever runden
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))      ; Reale Baudrate
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille
 
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ; max. +/-10 Promille Fehler
  .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
.endif



            ldi    temp1, 0b00111111     ;PORTC -> Ausgang
            out    DDRC, temp1

            ldi    temp1, 0b00011111   ;PORTB -> Pull-Up Widerstände ein
            out    PORTB, temp1

            ldi    temp1, 0b00001100   ;PORTD -> Ausgang und Eingang
            out    DDRD, temp1

            ldi    temp1, 0b11000000   ;PORTD -> Pull-Up Widerstände ein
            out    PORTD, temp1
      

            ldi   Â   tast_alt, 0b11111111

            
haupt:
         
            in     tast_neu, PIND             ; PIND -> temp1 (11100000)
            andi   Â   tast_neu, 0b11100000
            in     temp1, PINB             ; PINB -> temp2 (00011111)
            andi   Â   temp1, 0b00011111
            or   temp1, tast_neu         ; 11100000(temp1) und 00011111(temp2) = 11111111(temp1)
            
            mov  tast_neu, temp1         ; und in temp1 sichern
               eor  tast_neu, tast_alt       ; mit dem vorhergehenden Zustand XOR
               mov  tast_alt, temp1         ; und den jetzigen Zustand für den nächsten
                                  ; Schleifendurchlauf als alten Zustand merken
 
               breq haupt                   ; Das Ergebnis des XOR auswerten:
                                  ; wenn keine Taste gedrückt war -> neuer Schleifendurchlauf
 
               and  temp1, tast_neu         ; War das ein 1->0 Ãœbergang, wurde der Taster also
                                  ; gedrückt (in key_now steht das Ergebnis vom XOR)
               brne haupt     
            
            ldi  temp1, $7F             ; ein bisschen warten ...
wait1:
               ldi  temp2, $7F
wait2:
               dec  temp2
               brne wait2
               dec  temp1
               brne wait1
            Â               ; ... und nachsehen, ob die Taste immer noch gedrückt ist
               in   temp2, PIND             ; PIND -> temp1 (11100000)
            andI temp2, 0b11100000
            in   temp1, PINB             ; PINB -> temp2 (00011111)
            andi temp1, 0b00011111
            or   temp1, temp2         ; 11100000(temp1) und 00011111(temp2) = 11111111(temp1)

               and  temp1, tast_neu
               brne haupt

                 
             



         
ausgabe:
com temp1
               
               sbrc temp1, 0         ; Wenn aktuelles Bit=0  springe zur Sprungmarke schleife_1
               rjmp pruefen_0
               rjmp schleife_1

pruefen_0:
               sbis PORTD, 2         ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist
               rjmp an_0               ; Wenn es 0 ist tu das(Einschalten)
               rjmp aus_0               ; Wenn es 1 ist tu das(Ausschalten)

an_0:
               sbi PORTD, 2         ; Einschalten Tongue
               rjmp schleife_1
      
aus_0:
               cbi PORTD, 2         ; Ausschalten Tongue



schleife_1:
               sbrc temp1, 0         ; Wenn aktuelles Bit=0  springe zur Sprungmarke weiter_D
               rjmp pruefen_1
               rjmp schleife_2

pruefen_1:
               sbis PORTD, 3         ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist
               rjmp an_1               ; Wenn es 0 ist tu das(Einschalten)
               rjmp aus_1               ; Wenn es 1 ist tu das(Ausschalten)

an_1:
               sbi PORTD, 3         ; Einschalten Tongue
               rjmp schleife_2
      
aus_1:
               cbi PORTD, 3         ; Ausschalten Tongue


schleife_2:
               sbrc temp1, 2         ; Wenn aktuelles Bit=0  springe zur Sprungmarke weiter_D
               rjmp pruefen_2
               rjmp schleife_3

pruefen_2:
               sbis PORTC, 0         ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist
               rjmp an_2               ; Wenn es 0 ist tu das(Einschalten)
               rjmp aus_2               ; Wenn es 1 ist tu das(Ausschalten)

an_2:
               sbi PORTC, 0         ; Einschalten Tongue
               rjmp schleife_3
      
aus_2:
               cbi PORTC, 0         ; Ausschalten Tongue



schleife_3:
               sbrc temp1, 3         ; Wenn aktuelles Bit=0  springe zur Sprungmarke weiter_D
               rjmp pruefen_3
               rjmp schleife_4

pruefen_3:
               sbis PORTC, 1         ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist
               rjmp an_3               ; Wenn es 0 ist tu das(Einschalten)
               rjmp aus_3               ; Wenn es 1 ist tu das(Ausschalten)

an_3:
               sbi PORTC, 1         ; Einschalten Tongue
               rjmp schleife_4
      
aus_3:
               cbi PORTC, 1         ; Ausschalten Tongue

schleife_4:
               sbrc temp1, 4         ; Wenn aktuelles Bit=0  springe zur Sprungmarke weiter_D
               rjmp pruefen_4
               rjmp schleife_5

pruefen_4:
               sbis PORTC, 2         ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist
               rjmp an_4               ; Wenn es 0 ist tu das(Einschalten)
               rjmp aus_4               ; Wenn es 1 ist tu das(Ausschalten)

an_4:
               sbi PORTC, 2         ; Einschalten Tongue
               rjmp schleife_5
      
aus_4:
               cbi PORTC, 2         ; Ausschalten Tongue

schleife_5:
               sbrc temp1, 5         ; Wenn aktuelles Bit=0  springe zur Sprungmarke weiter_D
               rjmp pruefen_5
               rjmp schleife_6

pruefen_5:
               sbis PORTC, 3         ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist
               rjmp an_5               ; Wenn es 0 ist tu das(Einschalten)
               rjmp aus_5               ; Wenn es 1 ist tu das(Ausschalten)

an_5:
               sbi PORTC, 3         ; Einschalten Tongue
               rjmp schleife_6
      
aus_5:
               cbi PORTC, 3         ; Ausschalten Tongue

schleife_6:
               sbrc temp1, 6         ; Wenn aktuelles Bit=0  springe zur Sprungmarke weiter_D
               rjmp pruefen_6
               rjmp schleife_7

pruefen_6:
               sbis PORTC, 4         ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist
               rjmp an_6               ; Wenn es 0 ist tu das(Einschalten)
               rjmp aus_6               ; Wenn es 1 ist tu das(Ausschalten)

an_6:
               sbi PORTC, 4         ; Einschalten Tongue
               rjmp schleife_7
      
aus_6:
               cbi PORTC, 4         ; Ausschalten Tongue

schleife_7:
               sbrc temp1, 7         ; Wenn aktuelles Bit=0  springe zur Sprungmarke weiter_D
               rjmp pruefen_7
               rjmp haupt

pruefen_7:
               sbis PORTC, 5         ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist
               rjmp an_7               ; Wenn es 0 ist tu das(Einschalten)
               rjmp aus_7               ; Wenn es 1 ist tu das(Ausschalten)

an_7:
               sbi PORTC, 5         ; Einschalten Tongue
               rjmp haupt
      
aus_7:
               cbi PORTC, 5         ; Ausschalten Tongue




         rjmp  haupt

Guckt mal bitte ob ich einen Fehler mache:
in     tast_neu, PIND
Einlesen der Werte von PortD. Relevant sind nur die ersten drei Bits bzw. die Bits 5,6 und 7 weil nur diese mit tastern verbunden sind.

andi   Â   tast_neu, 0b11100000
And vergleich damit die nicht relevanten Bits beim Or vergleich "ignoriert" werden.

in     temp1, PINB             
Das selbe wie oben. Nun sind aber die letzten fünf Bits relevant. Das heist Bit 0,1,2,3 und 4

andi   Â   temp1, 0b00011111
Wieder das selbe wie oben

or   temp1, tast_neu
Or vergleich der beiden eingangsregister. temp1 müsste wenn keine taster gedrückt wurde nun den Wert 0b00000000 haben da die Pull Up Widerstände die Pins auf Spannung ziehen. Wenn ein taster gedrückt wurde müste am betreffenden Bit der Wert 0 sein.

mov  tast_neu, temp1
Speichern des tasterzustandes in tast_neu

eor  tast_neu, tast_alt
XOR der beiden register tast_neu und tast_alt. Wenn kein taster gedrückt wurde hat tast_neu den wert 0b11111111
 
mov  tast_alt, temp1
Den aktuellen Tasterzuständ für den nächsten durchlauf sichern
 
breq haupt 
                 
             
and  temp1, tast_neu         
                                 
brne haupt     
            
....
...
..
.

Irgendwo hierhin muss meiner Meinung nach der Fehler sein?
Kann mir jemand sagen ob ich da was falsch verstanden habe?

Ich glaube ich verwerfe den ganzen quatsch echt und versuche es mit interrupts... Dann hab ich es direkt richtig und so kriege ich das glaueb ich eh nicht hin! Cheesy

EDIT:
kann es sein das ich um das mit interrupts zu machen noch jeden einzelnen taster an int0 oder int1 bzw. pd2 bzw. pd3 anschließen muss? Sonst wird ja kein Interrupt ausgelöst wenn ein Taster gedrückt wird oder?
« Letzte Änderung: November 9, 2007, 18:50:24 von Fabeulous » Gespeichert
PoWl
Dremelfreund

*

Karma: +0/-0
Offline Offline
Beiträge: 140


Atmel AVR Mikrocontroller


Profil anzeigen
Re: Taster als Schalter via AVR
« Antwort #155 am: November 10, 2007, 01:37:33 »

dann vegiss aber die dioden nicht sonst lösen alle taster aus ;-) verstehe den sinn von interrupts hier auch nicht so.

braucht ma doch nich solange man die taster erkennungsroutine oft genug ansteuert. Ja, dein Programm sieht ziemlich verwirrend aus ;-)

mfg PoWl
Gespeichert
Reisi
Lötkolbenfreak

*

Karma: +2/-0
Offline Offline
Beiträge: 190



Profil anzeigen
Re: Taster als Schalter via AVR
« Antwort #156 am: November 10, 2007, 09:09:01 »

kann es sein das ich um das mit interrupts zu machen noch jeden einzelnen taster an int0 oder int1 bzw. pd2 bzw. pd3 anschließen muss? Sonst wird ja kein Interrupt ausgelöst wenn ein Taster gedrückt wird oder?
Nein, da hast du mich missverstanden. Es geht nicht um die Tasterabfrage selbst, sondern um die Warteschleife. Die löst man normalerweise über einen Timer-Interrupt, damit der µC in der Zeit nicht lahmgelegt wird.
Gespeichert
Fabeulous
Gast


E-Mail
Re: Taster als Schalter via AVR
« Antwort #157 am: November 10, 2007, 14:51:45 »

Okay dann hab ich das missverstanden. na ja ich weis jetzt nicht was ich tun soll! Ich bin nächste woche aufm Zivi Lehrgang dann werde ich mir mal alles in Papierform mitnehmen und mich damit in eine einsame ecke verziehen... Mal gucken ob ich das dann hinbekomme.

Sonst habe ich auch überlegt ob ich mir C beibringe und es in einer Hochsprache versuche. Irgendwie fühlt man sich da wohler! Cheesy

EDIT:
ldi      temp1, 1<<CS00 | 1<<CS02

Was kann in der oberen zeile das Zeichen"<" bzw "<<" ?
Danke!
« Letzte Änderung: November 10, 2007, 15:18:19 von Fabeulous » Gespeichert
OlafSt
Global Moderator

*

Karma: +13/-0
Offline Offline
Geschlecht: Männlich
Beiträge: 2138


Master of STLCD and LISA III


Profil anzeigen
Re: Taster als Schalter via AVR
« Antwort #158 am: November 10, 2007, 23:15:49 »

"<<" im Atmel-Assembler (und fast alle anderen Assembler, außerdem in C) steht für "Shift Right".

Ergo wird eine 1 (Binär 00000001) nach rechts geshiftet. Wenn du in den Include-Dateien nach "CS00" suchst, wirst du feststellen, das das eine Konstante zwischen 0 und 7 ist... Wenn wir mal eine 3 annehmen, wird also aus dem Zeug:

1 << 3, ergo eine 1 dreimal nach rechts geshiftet: 00000001 -->00001000

das "|" ist im Atmel-Assembler (und in C) das binäre "Oder". Nehmen wir also für CS00 wieder die drei und für CS02 die 4, dann wird aus dem

ldi temp1, 1<<CS00|1<<CS02 folgendes:

ldi temp1, 1<<3 OR 1<<4  -->
ldi temp1, 00001000 or 00010000 -->
ldi temp1, 00011000 (was Hexadezimal 18 entspricht)

Das ganze soll dir erleichtern, einzelne Bits gezielt zu setzen. Es erhöht außerdem die Lesbarkeit des Codes und obendrein massiv die Kompatibilität zu anderen Atmel's  - manchmal kommt es vor, das in neuen µC's die Bits in Registern verschoben werden. Arbeitest du nun mit absoluten Werten wie dem 18h da oben, wird dies auf neueres Atmels evtl nicht funktionieren.
Arbeitest du mit den symbolischen Konstanten, genügt das passende Include UND ein Neuassemblieren un der Code läuft auf dem brandneuen ATmega8192XXP des Jahres 2019 Wink
Gespeichert

Erstens: Lies was da steht. Zweitens: Denk drüber nach. Drittens: Dann erst fragen
Fabeulous
Gast


E-Mail
Re: Taster als Schalter via AVR
« Antwort #159 am: November 11, 2007, 00:24:33 »

Okay auf den ersten Blick ist das für mich viel komplizierter aber das muss man wahrschienlich ein paar mal benutzen damit man es drin hat...

Ich hab jetzt übrigens mein Problem gelöst! Also die Tasterabfrage funktioniert jetzt!
Ich hab es jetzt so gelöst das nur auf einen tastendruck reagiert wird und nicht auf einen Flankenwechsel. Nach jedem tastendruck wird dann etwas gewartet. In dieser zeit kann kein tastedruck erkannt werden(Quasi eine "entprellun") Ich weis das das nicht die eleganteste Methode ist aber für meine Zwecke reicht es in jedem Fall...
Ich poste euch morgen mal den Code(bin gerade nicht an meinem Rechner)
Gute Nacht!
Gespeichert
PoWl
Dremelfreund

*

Karma: +0/-0
Offline Offline
Beiträge: 140


Atmel AVR Mikrocontroller


Profil anzeigen
Re: Taster als Schalter via AVR
« Antwort #160 am: November 11, 2007, 00:37:09 »

Taster kann man gut mit parallelgeschalteten 10nF Kerkos entprellen :-)
Gespeichert
Fabeulous
Gast


E-Mail
Re: Taster als Schalter via AVR
« Antwort #161 am: November 11, 2007, 23:29:41 »

Yoa das geht auch aber dann müsste ich ja wieder was neues einbauen...

Hier erstmal mein Code! Ich mache jetzt noch eine Version die auf einen Flankenwechsel reagiert...

Code:
.include "m8def.inc"
.def temp1      = r16
.def temp2  = r17
.def tast_neu  = r18
.def tast_alt  = r19
.def temp3  = r20
.def temp4  = r21
.def temp5  = r22
.def temp6  = r23


.equ F_CPU = 8000000        ; Systemtakt in Hz
.equ BAUD  = 9600           ; Baudrate

; Berechnungen
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))      ; Reale Baudrate
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille

.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ; max. +/-10 Promille Fehler
  .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
.endif



ldi    temp1, 0b00111111  ;PORTC -> Ausgang
out    DDRC, temp1

ldi    temp1, 0b00011111 ;PORTB -> Pull-Up Widerstände ein
out    PORTB, temp1

ldi    temp1, 0b00001100 ;PORTD -> Ausgang und Eingang
out    DDRD, temp1

ldi    temp1, 0b11000000 ;PORTD -> Pull-Up Widerstände ein
out    PORTD, temp1


ldi    tast_alt, 0b11111111

warten:

ldi  temp1, $FF             ; ein bisschen warten ...
wait1:
      ldi  temp2, $FF
wait2:
      dec  temp2
      brne wait2
      dec  temp1
      brne wait1


haupt:


sbis PIND, 7 ; Wenn aktuelles Bit=0  springe zur Sprungmarke schleife_1
rjmp pruefen_0
rjmp schleife_1

pruefen_0:
sbis PORTD, 2 ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist
rjmp an_0 ; Wenn es 0 ist tu das(Einschalten)
rjmp aus_0 ; Wenn es 1 ist tu das(Ausschalten)

an_0:
sbi PORTD, 2 ; Einschalten :P
rjmp warten

aus_0:
cbi PORTD, 2 ; Ausschalten :P
rjmp warten


schleife_1:
sbis PIND, 6 ; Wenn aktuelles Bit=0  springe zur Sprungmarke weiter_D
rjmp pruefen_1
rjmp schleife_2

pruefen_1:
sbis PORTD, 3 ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist
rjmp an_1 ; Wenn es 0 ist tu das(Einschalten)
rjmp aus_1 ; Wenn es 1 ist tu das(Ausschalten)

an_1:
sbi PORTD, 3 ; Einschalten :P
rjmp warten

aus_1:
cbi PORTD, 3 ; Ausschalten :P
rjmp warten

schleife_2:
sbis PIND, 5 ; Wenn aktuelles Bit=0  springe zur Sprungmarke weiter_D
rjmp pruefen_2
rjmp schleife_3

pruefen_2:
sbis PORTC, 0 ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist
rjmp an_2 ; Wenn es 0 ist tu das(Einschalten)
rjmp aus_2 ; Wenn es 1 ist tu das(Ausschalten)

an_2:
sbi PORTC, 0 ; Einschalten :P
rjmp warten

aus_2:
cbi PORTC, 0 ; Ausschalten :P
rjmp warten


schleife_3:
sbis PINB, 4 ; Wenn aktuelles Bit=0  springe zur Sprungmarke weiter_D
rjmp pruefen_3
rjmp schleife_4

pruefen_3:
sbis PORTC, 1 ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist
rjmp an_3 ; Wenn es 0 ist tu das(Einschalten)
rjmp aus_3 ; Wenn es 1 ist tu das(Ausschalten)

an_3:
sbi PORTC, 1 ; Einschalten :P
rjmp warten

aus_3:
cbi PORTC, 1 ; Ausschalten :P
rjmp warten


schleife_4:
sbis PINB, 3 ; Wenn aktuelles Bit=0  springe zur Sprungmarke weiter_D
rjmp pruefen_4
rjmp schleife_5

pruefen_4:
sbis PORTC, 2 ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist
rjmp an_4 ; Wenn es 0 ist tu das(Einschalten)
rjmp aus_4 ; Wenn es 1 ist tu das(Ausschalten)

an_4:
sbi PORTC, 2 ; Einschalten :P
rjmp warten

aus_4:
cbi PORTC, 2 ; Ausschalten :P
rjmp warten


schleife_5:
sbis PINB, 2 ; Wenn aktuelles Bit=0  springe zur Sprungmarke weiter_D
rjmp pruefen_5
rjmp schleife_6

pruefen_5:
sbis PORTC, 3 ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist
rjmp an_5 ; Wenn es 0 ist tu das(Einschalten)
rjmp aus_5 ; Wenn es 1 ist tu das(Ausschalten)

an_5:
sbi PORTC, 3 ; Einschalten :P
rjmp warten

aus_5:
cbi PORTC, 3 ; Ausschalten :P
rjmp warten


schleife_6:
sbis PINB, 1 ; Wenn aktuelles Bit=0  springe zur Sprungmarke weiter_D
rjmp pruefen_6
rjmp schleife_7

pruefen_6:
sbis PORTC, 4 ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist
rjmp an_6 ; Wenn es 0 ist tu das(Einschalten)
rjmp aus_6 ; Wenn es 1 ist tu das(Ausschalten)

an_6:
sbi PORTC, 4 ; Einschalten :P
rjmp warten

aus_6:
cbi PORTC, 4 ; Ausschalten :P
rjmp warten


schleife_7:
sbis PINB, 0 ; Wenn aktuelles Bit=0  springe zur Sprungmarke weiter_D
rjmp pruefen_7
rjmp haupt

pruefen_7:
sbis PORTC, 5 ; Prüfe ob das aktuelle(index=zaehler) Bit am PORTD 1 ist
rjmp an_7 ; Wenn es 0 ist tu das(Einschalten)
rjmp aus_7 ; Wenn es 1 ist tu das(Ausschalten)

an_7:
sbi PORTC, 5 ; Einschalten :P
rjmp haupt

aus_7:
cbi PORTC, 5 ; Ausschalten :P




      rjmp  haupt

Noch ne andere Sache. Als ich "damals"(so ums eite 1-6 des Threades) Den Schaltplan entworfen habe kam letztenldich das heir raus!-->
http://fabeulousde.h198298.ser...Schaltplan3.png
Damals wollte ich die Taster welche an den selben Pins wie der ISP hängen mit einer Diode "sichern". Mir wurde gesagt das man dazu eigentlich einen widerstand nimmt. Nun habe ich das so gemacht aber genau die drei Taster funktionieren an meiner Schaltung nicht! Hat jemand eine Ahnung warum? Wären Dioden vlt. doch besser?
Danke schonmal für die vielen tipps und ratschläge!
Gespeichert
OlafSt
Global Moderator

*

Karma: +13/-0
Offline Offline
Geschlecht: Männlich
Beiträge: 2138


Master of STLCD and LISA III


Profil anzeigen
Re: Taster als Schalter via AVR
« Antwort #162 am: November 11, 2007, 23:47:36 »

Eigentlich werden solche Kettenanweisungen kürzer formuliert, indem man die gegenteilige Abfrage wählt. Anstelle von
Code:

sbis PIND, 7 ; Wenn aktuelles Bit=0  springe zur Sprungmarke schleife_1
rjmp pruefen_0
rjmp schleife_1

pruefen_0:

schreibt man

Code:
sbic PIND, 7 ; Wenn aktuelles Bit=0  springe zur Sprungmarke schleife_1
rjmp schleife_1

pruefen_0:

Spart ne Menge Flashspeicher und Taktzyklen.
Gespeichert

Erstens: Lies was da steht. Zweitens: Denk drüber nach. Drittens: Dann erst fragen
Fabeulous
Gast


E-Mail
Re: Taster als Schalter via AVR
« Antwort #163 am: November 12, 2007, 07:57:21 »

Okay das stimmt natürlich! Ich war da wahrscheinlich zu sehr an die gute alte If elseif Abfrage gewöhnt Tongue

Mal ne andere Sache. Die LED die bei mir auf den Pin PD5(T!) reagiert wechselt den Zustand nicht richtig! Stattdessen bliknt sie Drei mal und bleibt dannn bei einem willkürlichem Zustand stehen...
LIegt das an dem T!? Kann ja sein das das irgendwas mit Timern bedeutet. Habe nur leider nix dazu gefunden!

EDIT:
Ach und sobald ich an den Pin einen Taster klemm blinkt die LED durchgehend obwohl ich den Taster garnicht drücke!
Vlt. liegt es am Quarz? Das liegt nämlich direkt neben der Leitung von diesem Pin?
« Letzte Änderung: November 12, 2007, 07:59:52 von Fabeulous » Gespeichert
Reisi
Lötkolbenfreak

*

Karma: +2/-0
Offline Offline
Beiträge: 190



Profil anzeigen
Re: Taster als Schalter via AVR
« Antwort #164 am: November 12, 2007, 09:27:28 »

Noch ne andere Sache. Als ich "damals"(so ums eite 1-6 des Threades) Den Schaltplan entworfen habe kam letztenldich das heir raus!-->
http://fabeulousde.h198298.ser...Schaltplan3.png
Damals wollte ich die Taster welche an den selben Pins wie der ISP hängen mit einer Diode "sichern". Mir wurde gesagt das man dazu eigentlich einen widerstand nimmt. Nun habe ich das so gemacht aber genau die drei Taster funktionieren an meiner Schaltung nicht! Hat jemand eine Ahnung warum? Wären Dioden vlt. doch besser?
Danke schonmal für die vielen tipps und ratschläge!
Ich vermute mal stark, dass dein ISP Programmer nach dem Flashen nicht in den Tristate Zustand wechselt, sondern hier feste High oder Low Pegel anlegt. In dem Fall kann eine Tastenbetätigung natürlich nicht erfasst werden. Tritt das auch auf, wenn du den ISP Programmer absteckst?
Mal ne andere Sache. Die LED die bei mir auf den Pin PD5(T!) reagiert wechselt den Zustand nicht richtig! Stattdessen bliknt sie Drei mal und bleibt dannn bei einem willkürlichem Zustand stehen...
LIegt das an dem T!? Kann ja sein das das irgendwas mit Timern bedeutet. Habe nur leider nix dazu gefunden!

EDIT:
Ach und sobald ich an den Pin einen Taster klemm blinkt die LED durchgehend obwohl ich den Taster garnicht drücke!
Vlt. liegt es am Quarz? Das liegt nämlich direkt neben der Leitung von diesem Pin?
T1 ist der Timer-Eingang des Timers 1 (das steht aber alles im Datenblatt), da du aber den Timer nicht initialisiert hast passiert da gar nichts. Es wäre aber von Vorteil den Pull-Up Widerstand von PIND5 zu aktivieren.
Gespeichert
Seiten: 1 ... 6 7 8 9 10 [11] 12 13 14 15 16 17 nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Einloggen mit Benutzername, Passwort und Sitzungslänge      

Powered by MySQL Powered by PHP
eXTReMe Tracker
Seite erstellt in 0.073 Sekunden mit 20 Zugriffen.
© 2001-2022 MODDING-FAQ FORUM | SMF
Alle Rechte vorbehalten.
Prüfe XHTML 1.0! Prüfe CSS!