Forum: Mikrocontroller und Digitale Elektronik Schleife mit Inhalt


von Martin S. (maklin)


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.

von Gast (Gast)


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.

von Martin S. (maklin)


Lesenswert?

Ok erstmal danke.
In diese Richtung hatte ich auch gedacht, doch fehlen mir die
benötigten Befehle, bzw die von denen ich sowas erwartet hatte wollten
nicht. Hast du die richtigen Befehle gerade im Kopf?

von TravelRec. (Gast)


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...

von Sebastian (Gast)


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

von Martin S. (maklin)


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.

von André K. (freakazoid)


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

von Martin S. (maklin)


Lesenswert?

Sorry wegen doppelpost...
Aber das Problem hat sich jetzt gelöst: Man kann etwas nicht mit 5
vergleichen, wenn immer 2 Addiert werden (wegen doppeltem Vorkommen von
CPI...)

von André K. (freakazoid)


Lesenswert?

Argh. Vergiß das mit der Zählreihenfolge.

von André K. (freakazoid)


Lesenswert?

Wohl eher wegen doppeltem 'inc r18'.

von Martin S. (maklin)


Lesenswert?

eh ja falsche Zeile abgeschrieben...;-)

von Hannes L. (hannes)


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. ;-)

...

von Martin S. (maklin)


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.

von Martin S. (maklin)


Lesenswert?

Sorry wegen Doppelpost aber
irgendwie ist das Bild nicht mitgekommen (wird jedenfalls bei mir nicht
angezeigt). Ich habs
hochgeladen:http://www.ewetel.net/~andreas.schwerter/LCD-Problem.JPG

von Martin S. (maklin)


Lesenswert?

Habt ihr da vielleicht eine Idee? Ist so echt ärgerlich.

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