Forum: Mikrocontroller und Digitale Elektronik blinkende led


von Birgit (Gast)


Angehängte Dateien:

Lesenswert?

hallo ihr lieben,

kann mir vll einer von euch weiter helfen?
Ich grad abissal an denk fehler und komm nicht weiter, habe versucht 
meine LED zum blicken zu bringen. mit dem on_reset und der main_loop hab 
ich geschafft sie mal zum leuchten zu bringen aba der zeit blinkt sie 
nich so schnell dass ma des mit freiem auge nicht sieht, jetz hab ich 
versucht mit den delay_loops da einbisschen herum zu spielen. was aber 
leider nicht funktioniert :( freu mich über jeden Tipp danke

im anhang hab ich den code von mir.

von Karl H. (kbuchegg)


Lesenswert?

Du hast Glück, dass ich zu spät gesehen habe, dass du ein Word File 
hochgeladen hast, Da hatte ich schon draufgedrückt.

WElcher Teufel hat dich geritten, dein Programm in ein Word-File zu 
stellen?
Lade das Assembler-File hoch, so wie du es auf dem Rechner hast! Mehr 
braucht es nicht. Das ist für dich am wenigsten Arbeit und für uns auch.
Und die Chancen, dass sich wer das Machwerk ansieht steigen enorm, weil 
an und für sich niemand leichtfertig ein Word-File aus dem Web aufmacht.

: Bearbeitet durch User
von Conny G. (conny_g)


Lesenswert?

Müsste das rjmp nicht rcall heissen?

Der Unterschied ist: rcall kehrt zurück beim ret, dafür wird dabei die 
Rücksprungadresse auf dem Stack gespeichert.
rjmp kehrt (eigentlich) nicht zurück, deshalb wird die Retouradresse 
nicht gespeichert.
Da da aber trotzdem ein RET steht, wird etwas undefinierbares gelesen 
und der Prozessor crasht.

von Karl H. (kbuchegg)


Lesenswert?

Hier das original
1
.device attiny2313                 ; Set device to ATTiny2313
2
 .include "tn2313def.inc"          ; Include file for ATTiny2313
3
 .list                ; Turn listfile generation ON
4
5
 .def temp = R16
6
7
 .equ Tx = PB4
8
9
 .cseg
10
11
 .org 0x00
12
13
 rjmp on_reset            ; Relative jump to "on_reset"
14
15
 
16
 on_reset:
17
18
   ldi temp, ( 1 << Tx)    ; Load immediate temp with Tx as 1
19
     out DDRB, temp        ; Configure Port B with Tx as output using temp
20
  
21
   ldi temp, ( 0 << Tx)    ; Load immediate temp with Tx as 0
22
   out PORTB, temp      ; Output temp on Tx
23
  
24
25
26
 main_loop:
27
28
   ldi temp, (1 << Tx)      ; Load immediate temp with Tx as 1
29
   out PORTB, temp      ; Output temp on Tx
30
31
   //rjmp delay1
32
33
   ldi temp, ( 0 << Tx)    ; Load immediate temp with Tx as 0
34
   out PORTB, temp      ; Output temp on Tx
35
36
   rjmp delay2
37
 
38
  rjmp main_loop      ; Relative jump back to beginning of main loop
39
40
  delay1:
41
42
  ldi temp, 230
43
  delay1_loop: 
44
      dec temp
45
      brne delay1_loop
46
   ret
47
48
  delay2:
49
50
  ldi temp, 1
51
  delay2_loop:
52
      dec temp
53
      brne delay2_loop
54
 ret

von oszi40 (Gast)


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

Birgit schrieb:

Conny hat ja schon was dazu gesagt

> versucht mit den delay_loops da einbisschen herum zu spielen.

Du brauchst auf jeden Fall 2 Delays. Denn es muss ja 2 mal gewartet 
werden! EInmal nach dem Einschalten, einmal nach dem Ausschalten

> was aber
> leider nicht funktioniert :( freu mich über jeden Tipp *danke*

Der Tipp lautet:
Überleg mal ein bischen, wie schnell deine Delay Loops abgearbeitet 
werden. Dein µC macht (wenn er noch mit den Standardmässigen 1Mhz 
arbeitet) rund 900-tausend Befehle in der Sekunde. Was denkst du, wie 
lange es dauert, bis der von 1 auf 0 (oder von 230 auf 0) 
heruntergezählt hat? Tip: Das kann man berechnen, weil man weiß, 
wieviele Takte für jeden einzelnen Befehl benötigt werden und die 
Befehle kennt man ja.

Fazit: Es gibt Dinge, die kann man durch 'spielen' rausfinden bzw. 
adaptieren. Es gibt aber auch Dinge, die werden einfach mal knallhart 
ausgerechnet bzw. bestimmt und dann zieht man seine Schlüsse.

: Bearbeitet durch User
von Birgit (Gast)


Lesenswert?

oh sorry... des mit dem Word war nicht bös gemeint :)
haha is mein erster eintrag in so ein forum, man lernt ja nie aus :)

wenn ich nicht alles täuscht arbeitet er mit 4 MHz.

Danke für die Tipps ich werd sie gleich mal aus probieren!!

von Oliver B. (zee)


Angehängte Dateien:

Lesenswert?

Ist zwar nicht blink sondern Blitz artig, funktioniert aber auch, indem 
du den Kondensator vergrösserst, verkleinerst

von Hilfe (Gast)


Lesenswert?

Tip:
ein Register von 0xFF runter zu zählen reicht nicht.
Das geht so schnell, dass du kein blinken erkennen wirst.
Das Register mus mehrfach runtergezählt werden. Das erreicht man durch 
eine Art Verschachtelung zweier Zählschleifen.


Delay:
1-Lade Zähler_1
 2-Lade Zähler_2
  3-Verringere Zähler_2 bis auf 0
 4-Wenn Zähler_2 Null ist, DEC Zähler 1 und beginne wieder bei 2
5-Wenn Zähler_1 dann endlich auch Null ist, simmer fertisch.
6-Ret


Andere Frage: Wird so etwas heutzutage in der Schule gelehrt? In 
welcher?

von Oliver B. (zee)


Lesenswert?

Hilfe schrieb:
> Andere Frage: Wird so etwas heutzutage in der Schule gelehrt? In
> welcher?

Also In der berufsschule als Automatiker Elektroniker lernt man dass, 
wenn auch nur kurz, und ich nicht aufgepasst habe-.- leider..

von Manuel (Gast)


Lesenswert?

Wir habens erst beim Techniker gelernt. Aber auch nur kurz angeschnitten 
das Thema. Dann weiter mit C.

von Birgit (Gast)


Lesenswert?

ich studieren eig medizintechnick. aber ich mach grad ein internship im 
department of electronic and computer engineering. In da FH zuhause hab 
ich hochsprachen programmiert und hier wollen sie dass ich mit assembler 
arbeite. Jetz versuch ich mir des irgendwie selbst bei zu bringen.Und da 
dacht ich dass es nicht so schwer sein kann eine LED zum blinken zu 
bekommen...hahaha abissal verdacht :P

von Bernd B. (Gast)


Lesenswert?

Hallo Birgit,

vielleicht kannst Du mit einem Oszilloskop während Deiner 
Programmiererei die Takte an der Led verfolgen. Das Auge kann nur bis 
etwa 20 Hz auflösen.

Eventuell kannst Du kapazitiv (über 100nF oder 10nF) ein Headset 
ankoppeln und dann einen Schaltton hören.

... kleiner Tip zum debuggen.

Gruß

Bernd

von Helmut L. (helmi1)


Lesenswert?

Oliver Bucher schrieb:
> Ist zwar nicht blink sondern Blitz artig, funktioniert aber auch, indem
> du den Kondensator vergrösserst, verkleinerst

Oliver Bucher schrieb:
> Also In der berufsschule als Automatiker Elektroniker lernt man dass,
> wenn auch nur kurz, und ich nicht aufgepasst habe-.- leider..

Den Sinn von LED-Vorwiderstaenden scheint man dort aber nicht zu 
lehren..

von Karl H. (kbuchegg)


Lesenswert?

Birgit schrieb:
> ich studieren eig medizintechnick. aber ich mach grad ein internship im
> department of electronic and computer engineering. In da FH zuhause hab
> ich hochsprachen programmiert und hier wollen sie dass ich mit assembler
> arbeite. Jetz versuch ich mir des irgendwie selbst bei zu bringen.Und da
> dacht ich dass es nicht so schwer sein kann eine LED zum blinken zu
> bekommen...hahaha abissal verdacht :P

Wenn du Hochsprachen schon kannst:
ein Funktionsaufruf ist nichts anderes als ein RCALL. Zurück gehts aus 
der Funktion mit einem RET.

Aber auch in einer Hochsprache muss dir klar sein, dass ein 'Schalte LED 
ein' 'Schalte LED aus' 'Schalte LED ein' 'Schalte LED aus' ohne 
irgendwelche Pausen dazwischen, viel zu schnell für ein sichtbares 
Blinken ist. Und zwar zischen JEDER Operation und nicht nur zwischen dem 
Einschalten und dem Ausschalten.

in
1
   while( 1 )
2
   {
3
4
      LED ein
5
                 <-----
6
      LED aus
7
                 <-----
8
   }
muss an BEIDEN markierten Stellen eine Wartezeit rein, denn sonst würde 
die jeweils gegenteilige Operation zeitlich unmittelbar auf die 
vorhergehende folgen und das wäre viel zu schnell.

von Birgit (Gast)


Lesenswert?

Dankeschön.
Klingt sehr einleuhtend.

von Oliver B. (zee)


Lesenswert?

Helmut Lenzen schrieb:
> Den Sinn von LED-Vorwiderstaenden scheint man dort aber nicht zu
> lehren..



hehe, lehren schon, nur bei der Anwendung tut s bisschen schwer..:)
Also meiner läuft jetzt schon ca 1 Monat ununterbrochen, mit ca alle 
1-1.5 sec blinkung, und das led hats nicht gehauen..

oli

PS. habs von da, und nicht selber gezeichnet..

: Bearbeitet durch User
von Conny G. (conny_g)


Lesenswert?

Eine LED nimmt ja auch nur Schaden, wenn sie längere Zeit überlastet 
wird.
In jedem LED-Datenblatt gibt's die maximale Impulsbelastung zu sehen.
Wenn das also mehr blitzt als blinkt, dann ist es nur ein Impuls (der 
hoffentlich in den Impuls-Specs liegt) und die LED hat Zeit zum Abkühlen 
und es geschieht ihr nichts.

Also hat Helmut Recht, weil da eigentlich ein Vorwiderstand hingehört.
Und die Schaltung ist trotzdem "tragbar", weil's die LED auf diese Weise 
aushält.

von Udo S. (urschmitt)


Lesenswert?

Conny G. schrieb:
> Also hat Helmut Recht, weil da eigentlich ein Vorwiderstand hingehört.
> Und die Schaltung ist trotzdem "tragbar", weil's die LED auf diese Weise
> aushält.

Was aber nicht durch sorgfältiges Design, sondern sehr "empirisch" 
ermittelt wurde.

Conny G. schrieb:
> dann ist es nur ein Impuls (der hoffentlich in den Impuls-Specs liegt)

Nennt sich auch in Denglisch: "Development by accident"

von Oliver B. (zee)


Lesenswert?

Conny G. schrieb:
> Also hat Helmut Recht, weil da eigentlich ein Vorwiderstand hingehört.
> Und die Schaltung ist trotzdem "tragbar", weil's die LED auf diese Weise
> aushält.

Wie gesagt, Der Plan ist nich von mir:
http://www.elektronik-radio.de/41332.html

und ich habe ja nie gesagt, man solle keine Vorwiderstände nehmen..

von Conny G. (conny_g)


Lesenswert?

Udo Schmitt schrieb:
> Was aber nicht durch sorgfältiges Design, sondern sehr "empirisch"
> ermittelt wurde.

Sorgfältiges Ausprobieren.

Stromquelle.
LED dran.
Fump, Rauchwolke.
"Oh, dann müssen wir sie mal blinken lassen, vielleicht geht's dann.".

Blinkt.
Freut sich.
Minuten später, schmurgel, Rauchwolke.
"Mmmh, kürzer blinken."

Yuhuuh.

von 6A66 (Gast)


Lesenswert?

Conny G. schrieb:
> Also hat Helmut Recht, weil da eigentlich ein Vorwiderstand hingehört.
> Und die Schaltung ist trotzdem "tragbar", weil's die LED auf diese Weise
> aushält.

Ich würd' eher anders vermuten:
Der Output kann bei weitem nicht die 20mA und wenn, geht die 
Ausgangsspannung derart in den Keller dass da wirklich nur roundabout 
20mA fließen (lass es 25mA sein oder 30mA, das haut die LED nicht um 
noch dazu wenn sie blinkt).
Problem dabei ist: "Wieso geht das jetzt nicht mehr, das ist ja vorher 
auch gegangen".

rgds

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.