mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega8: LED blinken lassen


Autor: Schoaschi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: dave (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Markus (Gast)
Datum:
Angehängte Dateien:
  • LED.bas (748 Bytes, 907 Downloads)

Bewertung
0 lesenswert
nicht 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

Autor: Schoaschi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Condor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

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

Autor: Richard Spatschinski (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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).

Autor: Schoaschi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Richard Spatschinski (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Richard Spatschinski (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>"...zusätzlich noch das I-Flag gesetzt wird."

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

Autor: Schoaschi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Richard Spatschinski (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dave, du bist fast ZU nett!!!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn es mit Basic geht ist diese Seite sehr hilfreich.

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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.