Forum: Mikrocontroller und Digitale Elektronik ATmega8: LED blinken lassen


von Schoaschi (Gast)


Lesenswert?

Hi

Ich entschuldige mich hier gleich einmal für diese "einfache" frage.

Mein bruder ist leicht beim verzweifeln und ich weiss schon langsam
auch nicht mehr weiter. ansich steckt nicht viel dahinter. wir wollen
eigentlich nur ein LED mittels eines Atmega8 blinken lassen. Das
Problem bei der ganzen geschichte ist nur, dass er einsteiger ist und
dies sein erster versuch mit µC ist.
Nun, die frage: hätte vl von euch jemand ein asm-file, c-file bzw
basic-file, mit hilfreichen kommentaren, was ein LED blinken lässt und
den internen quarz benutzt?
bzw wie aktiviert man den internen quarz?

ach und gleich im voraus... das tutorial kenne ich schon und habe es
mir auch angesehen, aber nachdem mein bruder weiter entfernt lebt und
ich ihm nur per e-mail helfen kann und ich das ganze nur theoretisch
betreibe, wäre es mir eben lieber wenn jemand ein funkionsfähiges
programm hätte.

danke für eure hilfe

mfg schoasch

von dave (Gast)


Angehängte Dateien:

Lesenswert?

Ich hab leider grad nur nen m32 auffem Steckbrett, aber der Code ist ja
portabel.

Interner Quarz ist standardmäßig eingeschaltet, wenn er nicht grad
rumgespielt hat.

dave

von Markus (Gast)


Angehängte Dateien:

Lesenswert?

Der interne Takt ist kein Quarz, aber das ist im Prinzip erst mal egal.
Aktivieren braucht man ihn nicht, er ist schon ab Werk eingestellt.
Basic-Code ist anbei, muß aber natürlich noch für den entsprechnenden
IO-port angepaßt werden.

Habt Ihr die Checkliste schon angeschaut?
http://www.mikrocontroller.net/articles/AVR_Checkliste

von Schoaschi (Gast)


Lesenswert?

Ich danke euch recht herzlich.

@dave
wozu brauche ich folgende zeilen?
.cseg           ; codesegment fängt jetzt hier an
.org 0          ; und zwar bei 0

PS.: was noch zu erwähnen ist...ich kann noch kein assambler sondern
eher nur C ;-) was das ganze eben schwierig macht

von Condor (Gast)


Lesenswert?

Hallo

.cseg     sagt dem assembler das er das folgende in den flash screiben
soll
.org 0    sagt dem assembler ab welcher adresse - $0000

von Richard Spatschinski (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Schoaschi, hier hast du einen kommentierten Assembler-Code zum
Thema Blinken und Int.Oszillator (Hab grad extra für dich geschrieben
und laufen lassen).

von Schoaschi (Gast)


Lesenswert?

ich danke euch

schön langsam aber sicher wird mir assambler immer klarer.

ein paar kleine fragen hätte ich noch.

habe ich das richtig verstanden:
mit "out PORTB, temp" schreibe ich die daten temp aufs port b ?

sbis PORTB,0 --> kann ich das mit einer if abfrage in C vergleich?

was bewirkt "reti"?

und welche werte werden in das register OSCCAL geschrieben? 2 für
2Mhz?

mfg

von Richard Spatschinski (Gast)


Lesenswert?

""mit "out PORTB, temp" schreibe ich die daten temp aufs port b
?""
   ->korrekt. Die Daten des Arbeitsregisters "temp" werden am PortB
ausgegeben.

""sbis PORTB,0 --> kann ich das mit einer if abfrage in C
vergleich?""
  -> "sbis" bedeutet Skip if this Bit in I/O-Register is Set und
überspringt einfach den nachfolgenden Befehl, falls dieser Bit (hier
Bit 0) in einem IO-Register (hier PORTB) gesetzt ist (oder wenn
gelöscht im Falle des Befels "sbic"). Einen Analogon in C gibt es
nicht.

""was bewirkt "reti"?""
 -> "reti" bedeutet "RETurn from Interrupt routine".
Es lässt die Interrupt-Abarbeitung beenden und wieder zu der Stelle im
Programm springen, an der sich der Interrupt ereignet hatte.
Ein gewöhnliches Unterprogramm wird mit einem "ret" verlassen

""welche werte werden in das register OSCCAL geschrieben? 2 für
2Mhz?""
 ->OSCCAL ist nur für die Feineinstellung des internen Oszillators da.
Die Eigentliche Frequenzeinstellung wird in der Bedienungsoberfläche
des Programmer-Tools vorgenommen (Ich und wohl die meisten hier haben
einen STK500-Board in Verbindung mit AVRStudio (freeware)).
Und so macht man das:
Du gehst unter AVRStudio oben in die "Tools", dann "STK500", dort
auf "Advanced" und klickst auf "Calibrate for frequency", wo die
Auswahl möglicher Frequenzen steht und eingestellt wird.
Dann auf "Read Calib. Byte". Dieser Wert ist vom Werk aus im
Controller gespeichert und wird nun ausgelesen und Dir gezeigt.
Diese Zahl trägst Du dann IM PROGRAMM ins OSCCAL ein, wie ich es
gemacht habe. Dann wird dein µC mit exakt der gewählten Frequenz laufen
(z.B 4MHz).
Nun folgt die Antwort auf deine nächste Frage :)
"Warum erst umständlich auslesen, um gleich darauf wieder
reinzuschreiben?!"
Aus einem einfachen Grund, mein Freund: durch die Variation des
OSCCAL-Wertes kannst du deine Frequenz fast beliebig einstellen!
Je kleiner diese Zahl, umso langsamer wird dein interner Oszi und
umgekehrt.

von dave (Gast)


Lesenswert?

Die Erklärung zu "RETI" ist naja nicht ganz perfekt.

In der ISR (Interrupt Service Routine (kein Plan über die Schreibung
hehe)) wird beim Beginn erst mal das "I"-Flag gelöscht, damit
standardmäßig keine weitere ISR eintreten kann.
Wenn man es will, setzt man halt gleich wieder mit "SEI" (SEt I).

RETI ist folglich genau das gleiche wie RETurn, nur dass zusätzlich
noch das I-Flag gesetzt wird.

Manchmal lösch ich bei einer Routine das I-Flag und spare damit gleich
nen ganzen Takt (deswegen macht man ja Assembler ;) )

Ist ein kleiner Unterschied, aber so isses halt.
-------
Noch nebenbei zu dem Source von Richard:
Man muss aufpassen, wenn man mal auf einen AVR mit größerem Flash
umsteigt, dass man unbedingt die IRQ Vektoren (die RETI/RJMP am Anfang
des .cseg) umändert. Beim Mega8 liegen sie noch je 1 Word (RJMP/RETI =
1 Word), jedoch mit größerem Flash braucht man für die komplette
Adressierung 2 Word, deswegen sind diese dann 2 Word entfernt.

Am besten finde ich immernoch die Methode jeden IRQ den man benutz mit
einem eigenen .org zu kennzeichnen, am besten statt einer absoluten
Angabe eine aus der .include zu nehmen, z.b. T0OVFADDR (ich denke, die
ist falsch, ich kann die nicht auswendig).
------
Viel Text, etwas mehr als 10 Zeilen, sorry.

dave

von Richard Spatschinski (Gast)


Lesenswert?

>"...zusätzlich noch das I-Flag gesetzt wird."

-> Da hast du absolut Recht, Dave. Ich hab' vergessen, dieses wichtige
Detail zu erwähnen!

von Schoaschi (Gast)


Lesenswert?

Ich danke euch für die antworten :-)

mein bruder klagt noch immer herum... wobei dieser in sachen
elektrotechnik etwas zu kompliziert denkt...
ok das mit dem Calibrieren ist so eine sache ;-) denn ich habe das
stk500 board nicht und er ebenfalls nicht. er benutzt einen programmer
marke eigenbau ;-).. vl hats auch damit was zu tun das das ganze nicht
läuft.
achja... irgendwie sind mir bis jetzt die At89C52 und At89Cx051 am
liebsten  ;-)  bei denen hats bis jetzt immer hingehaut. denn diese
benutzen wir auch in da schule und besitzen eine ziemlich guten C
Compiler (keil uVision).nur hat sich mein bruder eingebildet er muss es
mit einem ATmega8 probieren, da es für diesen einen einfachen Programmer
gibt, denn ein programmiergerät ist nicht so billig ;-)

zb Galep 378€.... die spinnen ;-)

von dave (Gast)


Lesenswert?

@Richard
Also meine Erklärung war keines Falls so gemeint, dass deine schlecht
ist ;) nur könnte ich mir vorstellen, dass er, wenn er sich dann
richtig mit beschäftigt hat, sich denkt: Warum brauch ich für eine ISR
nen andren Rücksprung als für ne Routine. (Und ich hatte Zeit und will
die 10 Zeilen noch ausnutzen G)

dave

von Richard Spatschinski (Gast)


Lesenswert?

Dave, du bist fast ZU nett!!!

von Peter D. (peda)


Lesenswert?

"irgendwie sind mir bis jetzt die At89C52 und At89Cx051 am
liebsten ..."

"...er muss es
mit einem ATmega8 probieren, da es für diesen einen einfachen
Programmer
gibt, denn ein programmiergerät ist nicht so billig ;-)"


Der AT89C52 ist nicht mehr für Neuentwicklungen vorzusehen, sondern der
AT89S52 (Reichelt: 1,60€) und der ist wie die AVRs über SPI
programmierbar.

Daneben gibt es noch die AT89C51ED2 usw. die haben einen Bootloader,
also direkt über die COM programmierbar, kosten aber etwas mehr.

Einfach mal bei Atmel ins Web schauen, was es da alles für Typen gibt.


Peter

von Michael (Gast)


Lesenswert?

Wenn es mit Basic geht ist diese Seite sehr hilfreich.

http://www.rowalt.de/mc/index.htm

von Sebastian (Gast)


Lesenswert?

"Manchmal lösch ich bei einer Routine das I-Flag und spare damit
gleich
nen ganzen Takt (deswegen macht man ja Assembler ;)"

dem versteht ich nicht
ein int wird auslöst und es folgt der sprung auf den vector und dann
die isr. wann löschst du das i flag damit es einen unerschied macht? ob
es der assembler durch reti/ret+sei macht sollte von der anzahl takte
doch eigentlich keinen unterschied machen oder??

von dave (Gast)


Lesenswert?

Nein, nicht in der ISR, sondern einfach während des Programmes, wenn ich
z.B. nicht will, dass ich unterbrochen werde:

routine:
  cli  1
  nop  1
  nop  1
  reti 4
anstatt:
routine
  cli  1
  nop  1
  nop  1
  sei  1
  ret  4

RET und RETI kosten beidesmal 4 Takte. Bei ISR ist eigentlich nur ein
RETI logisch. Ich glaube, das war einfach zu kompliziert fürn Anfang...
war einfach nur so gemeint, dass du später mal beim optimieren nen Takt
sparen kannst ;)

@Richard
Ich wusste nicht, wie du das verstanden hast. Dass kam mir sarkastisch
vor, aber nun gut ;)

dave

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.