Schleife mit Inhalt

OP #311184
Lesenswert?

Hallo!
Ich habe mir mal ein Atmega8 gekauft, um ein wenig
rumzuexperimentieren, was möglich ist.
Ich wollte testweise 2 LEDs ansteuern, die eine soll im sekundentackt
an- bzw ausgehen,  die andere beispielsweise alle 10 sec.
Mein eigentliches Problem ist folgendes: Wie komme ich aus dieser
Schleife nach zB 5-fachen Durchlauf (=10sec) einmal raus, um die 2. LED
zu schalten?


sekunda:
         SBR R17,0b00000001
     out PORTD, r17
     rcall delays


         CBR R17,0b00000001
     out PORTD, r17
     rcall delays
     rjmp sekunda

(ich hab mal den Kram davor und danach weggelassen, weil der meiner
Meinung nach hierfür unwichtig ist)

Ich habe schon einiges ausprobiert an Befehlen, doch will es einfach
nicht. delays ist übrigens ein Schleife, die eine Sekunde wartet.
Gast #311185
Lesenswert?

Du mist die Beiden Schleifen verschachteln. Dann zählst du in der ersten
Schleife bis 5, beendest sie erledigst die Aufgabe der Zweitsch Schleife
und springst wieder in die erste Schleife und so weiter.
Gast #311187
Lesenswert?

Davon abgesehen kann der ATMega8 weitaus mehr als nur ´n paar LEDs
blinkern lassen. Wenn Du Dich irgendwann einmal an Interrupts und Timer
herantraust, brauchst Du keine Delay-Schleifen mehr und Dein Prozessor
kann immer fleißig durchrattern und nebenbei noch 1000 andere Aufgaben
erledigen. Im Datenblatt (englisch) findet man viele wertvolle
Hinweise. Vorsicht beim ATMega8 mit den Fuses, besser nicht dran
herumspielen, wenn´s nicht wirklich Absicht ist, sonst hat man sich
schnell einmal ausgesperrt...
Gast #311188
Lesenswert?

Kannste doch schnell mal nachschaun. Dann verinnerlicht man die Befehle
auch besser als wenn man nur das vorgesetzte abschreibt.

Hier gibts das komplette Instruction set.Alle Befehle mit Erklärun und
ne zusammengefasste Kurzversion. Achtung, is auf alle AVRs bezogen, es
sind also nicht alle Befehle im Mega8 verfügbar. Im Datenblatt des
Mega8 steht glaub ich drin welche befehle der genau unterstützt.

http://www.atmel.com/dyn/resources/prod_documents/doc0856.pdf

Und beim AVR Studio in der Hilfe werden auch alle befehle erklärt.

Sebastian
OP #311189
Lesenswert?

Nunja dass deutlich mehr drin steckt als ein paar LEDs ansteuern habe
ich auch erhofft, doch muss es ja eigentlich erstmal bei den LEDs
klappen ehe ich was sinnvolleres damit mache.
Ich habe in dem Dokument reingesehen und etwas entdeckt, was gehen
müsste, doch will es nicht:

         clr r18
sekunda:
         SBR R17,0b00000001 ; Bit 0 setzen
     out PORTD, r17
     rcall delays
     inc r18

         CBR R17,0b00000001 ; Bit 0 löschen
     out PORTD, r17
     rcall delays

     inc r18

     CPI r18,5
     breq stunda
     rjmp sekunda



stunda:  SBR R17,0b00000010 ; Bit 1 setzen
     out PORTD, r17
     clr r18
     rjmp sekunda

Also irgendwas muss ja falsch sein, da immer noch nur meine 1. LED
leuchten will.
#311190
Lesenswert?

Hallo,

SBR und CBR zählen von 0..7. D.h.
ein "SBR R17,0b00000001" mit folgendm "out PORTD, r17"
setzt PORTD.1
und ein "SBR R17,0b00000010" ... PORTD.2

Hast Du Deine LEDs da angeschlossen, oder - eher vermutet - an
PORTD.0 und PORTD.1 Dann wirdst Du nur die LED an PORTD.1 bewundern
können.

BTW:
Benutze nicht "SBR R17,0b00000001". Das sieht so aus, als ob der
Index 8Bit breit ist. Geht aber wie gesagt nur von 0-7. Um ein Register
zu laden benutzt man meistens 'ldi'.

Noch kürzer für Deine Zwecke:

equ LED0 = PD0
...
SBI PORTD, LED0
...

Grüße,
Freakazoid
#311195
Lesenswert?

Drucke dir doch einfach mal die Befehlsliste aus dem Datenblatt aus.
Dann hast du eine Übersicht, in der du mit Bleistift und Textmarker
arbeiten kannst (geht auf dem Bildschirm immer so schlecht). Die
konkrete Erklärung zu jedem Befehl gibt es dann in der
kontextsensitiven Hilfe des AVR-Studios.

Auch das Ausdrucken der Liste der I/O-Adressen schadet nicht...

Aber nicht nur ausdrucken, sondern beim Programmieren auch mal drin
nachschlagen. ;-)

...
OP #311196
Lesenswert?

Noch eine Frage:
Ich habe ein LCD-Display angeschlossen und es zeigt den Text nicht
richtig an. Da ich früher mal LCDs am Rechner angesteuert habe weiß
ich, dass das Problem am Display und nicht am AVR liegt (andere
Displays werden sicher ordentlich gehen, sie gingen ja am Computer
auch).
Also ich will einen Text schreiben der lautet: "Der LCD-Testschirm als
Beispiel für mein LCD!:-)"
Das Display ist 4x20, leider reflektiert es zu sehr beim fotografieren
daher habe ich den Text so wie er tatsächlich angezeigt wird in ein
LCD-Programm geschrieben.
Also hat ja eigentlich nichts mit AVR zu tun, aber ich dachte mir
vielleicht weiß es jemand, weil hier viele Leute mit LCDs
rumexperimentieren.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren