Forum: Mikrocontroller und Digitale Elektronik Vorsicht Anfängerfrage LED Blinker.


von Andreas (Gast)


Lesenswert?

Guten morgen,
ich habe die Zeitschleife eines kleine LED Blinker Programmes geändert.
Assambler sagt OK, PonyProng macht kein Ärger, doch LED blinkt 
nicht.Frequenz bei ca.75 hz.

Falls jemand Zeit und Lust hat.
Danke.

include "tn13def.inc"

;-----
Main:
  ldi  r16,  $1f    ; Pb0 ... Pb4 Alle Pins als Ausgänge
  out  DDRB,r16
  ldi  r16,  $00    ; Pb0 ... Pb4 Alle Ausgänge sind
;gleich 00000
  out  PORTB,r16

;-----
Loop:
  sbi  PORTB, 0    ; Pb0 = Level 1

  rcall  Warte      ; VerzögerungsSchleife Subroutine

  cbi  PORTB, 0    ; Pb0 = Level 0

  rcall  Warte      ; VerzögerungsSchleife Subroutine


  rjmp  Loop      ; Und zurück zum Loop ad infinitum

;-----
Warte:; =============================
;   Warteschleifen-Generator
;     51613 Zyklen:
; -----------------------------
; warte 51612 Zyklen:
          ldi  R17, $44
WGLOOP0:  ldi  R18, $FC
WGLOOP1:  dec  R18
          brne WGLOOP1
          dec  R17
          brne WGLOOP0
; -----------------------------
; warte 1 Zyklus:
          nop
; =============================

von Peter (Gast)


Lesenswert?

Wo ist das ret(urn) in Deiner "Warte"-Funktion?

von Peter (Gast)


Lesenswert?

>Frequenz bei ca.75 hz

Und wie kommst Du auf diese Frequenz? 75 Hz siehst Du definitiv nicht 
blinken!

von Gast (Gast)


Lesenswert?

Codesammlung
Wenn ihr eigene Programme oder Anleitungen geschrieben habt könnt ihr 
sie hier posten. Fragen werden gelöscht!

von Benedikt K. (benedikt)


Lesenswert?

Genau, daher habe ich das mal hierher verschoben.

von Andreas (Gast)


Lesenswert?

Ich habe eine return Funktion eingebaut.
Trotzdem funzt es nicht.
LED leuchtet nicht und lt.Messgerät fließt auch kein Strom.
Der tiny ist ok und auch die Schaltung funzt.

Also kann es doch nur am Programm liegen, oder ?

von Philipp B. (philipp_burch)


Lesenswert?

Andreas schrieb:
> Ich habe eine return Funktion eingebaut.

Und damit sieht das Programm nun wie aus?

von Netzwanze (Gast)


Lesenswert?

Ich weiß es jetzt gerade nicht so genau (also schlagt mich nicht):

Adresse 0x0000 ist doch der Sprungvektor für Reset. Gehört da ein jmp 
hinein oder nicht? Wenn nein, fehlt die passende Angabe in den Vektoren 
(also in Deinem Fall ein "jmp Main".

Mit "Return Funktion" meinst Du doch "ret" und keine zusätzliche 
Funktion.

von Netzwanze (Gast)


Lesenswert?

Quatsch.... sorry.
Wenn in die Vektorliste ein jmp mit hineingehört, sollte es so laufen. 
Wenn nicht, fehlt die Adresse von Main im Vektor.

von Andreas (Gast)


Lesenswert?

Du meinst "jmp main" zum Abschluß ?

von Karl H. (kbuchegg)


Lesenswert?

Netzwanze schrieb:
> Ich weiß es jetzt gerade nicht so genau (also schlagt mich nicht):
>
> Adresse 0x0000 ist doch der Sprungvektor für Reset. Gehört da ein jmp
> hinein oder nicht? Wenn nein, fehlt die passende Angabe in den Vektoren
> (also in Deinem Fall ein "jmp Main".
>
> Mit "Return Funktion" meinst Du doch "ret" und keine zusätzliche
> Funktion.

Solange keine anderen Interrupt Vektoren im Spiel sind, ist das 
belanglos.

Ob der µC nach einem Reset als erstes auf einen rjmp stösst, oder ob 
dort das Programm direkt losgeht, spielt keine Rolle.

von Karl H. (kbuchegg)


Lesenswert?

Andreas schrieb:
> Du meinst "jmp main" zum Abschluß ?

Welcher Abschluss.

Zeig doch bitte das komplette Programm.
Du hast Änderungen gemacht und wir wissen nicht welche.

von Rene H. (Gast)


Lesenswert?

Vielleicht kannst Du auch gleich die Beschaltung noch zeigen? Hängt das 
LED wirklich an PB0?

von Andreas (Gast)


Lesenswert?

include "tn13def.inc"

;-----
Main:
  ldi  r16,  $1f    ; Pb0 ... Pb4 Alle Pins als Ausgänge
  out  DDRB,r16
  ldi  r16,  $00    ; Pb0 ... Pb4 Alle Ausgänge sind
;gleich 00000
  out  PORTB,r16

;-----
Loop:
  sbi  PORTB, 0    ; Pb0 = Level 1

  rcall  Warte      ; VerzögerungsSchleife Subroutine

  cbi  PORTB, 0    ; Pb0 = Level 0

  rcall  Warte      ; VerzögerungsSchleife Subroutine


  rjmp  Loop      ; Und zurück zum Loop ad infinitum

;-----
Warte:; =============================
;   Warteschleifen-Generator
;     51613 Zyklen:
; -----------------------------
; warte 51612 Zyklen:
          ldi  R17, $44
WGLOOP0:  ldi  R18, $FC
WGLOOP1:  dec  R18
          brne WGLOOP1
          dec  R17
          brne WGLOOP0
; -----------------------------
; warte 1 Zyklus:
          nop
; =============================

jmp main


*****

Es tut sich aber nichts...

von Karl H. (kbuchegg)


Lesenswert?

Andreas schrieb:

Dachte ichs mir doch.

> ; -----------------------------
> ; warte 1 Zyklus:
>           nop
> ; =============================
>
> jmp main


Nein.
Bei main ist dein Programmanfang. Wenn du nach main hüpfst beginnt das 
Programm wieder von vorne. Und das bedeutet: alles wird initialisiert 
und die Ports wieder auf 0 gestellt.


 ; -----------------------------
 ; warte 1 Zyklus:
           nop
 ; =============================
           ret


Mit rcall wird ein Unterprogramm aufgerufen. Zurück geht aus aus dem 
Unterprogramm zur Stelle des Aufrufs mit einem ret

(Darf ich dir das AVR-Tutorial nahelegen?)

von Andreas (Gast)


Lesenswert?

Danke.Ich meine das ich das auch schon versucht hatte.
Ich werd es aber noch mal probieren.

von iCarly (Gast)


Lesenswert?

Bei der angegebenen Schleife und 4MHz Takt dauert ein schleifendurchlauf 
0,01290325s = etwa 12,9ms.
Ob er das sieht?

von iCarly (Gast)


Lesenswert?

;****Time Delay Subroutine for LED flash*************
delay:
 ldi coarse,5    ;triple nested FOR loop

cagain:
 ldi medium,255  ;giving about 1/4 second

magain:
 ldi fine,255    ;delay on 4 MHz clock

fagain:
 dec  fine
 brne fagain
 dec  medium
 brne magain
 dec  coarse
 brne cagain
 ret

von Andreas (Gast)


Lesenswert?

Ich habe es jetzt mit "ret" probiert.Kein Erfolg.
Auch bei 1 hz. funzt es nicht.

Lt.Messgerät fließt auch kein Strom.
Tiny und Schaltung sind aber OK.

Es muss wohl am Programm liegen.

Ich vermute es könnte an den Aus- und Eingängen liegen.
Pbo und Pb3 sind Ausgänge.
 Pb1 ist ein Taster.In diesem Fall aber wohl unbedeutend,oder ?

von iCarly (Gast)


Lesenswert?

Wie hast du die LED angeschlossen?

von iCarly (Gast)


Lesenswert?

Mit was Proggrammierst du?

von Eddy C. (chrisi)


Lesenswert?

Zu meiner Zeit mußte man den Stack initialisieren, bevor man 
Unterprogramme aufrufen wollte. Kann sein, dass der Prozessor mit einem 
sinnvollen Wert hochfährt. Bitte prüfen.

von iCarly (Gast)


Lesenswert?

.include "tn13def.inc"

.def  temp   = r16 ;general scratch space
.def  fine   = r18 ;loop delay counters
.def  medium = r19
.def  coarse = r20
;-----

Main:
  ldi temp, RAMEND  ; Stackpointer initialisieren
  out SPL, temp

  ldi  r16,  $1f    ; Pb0 ... Pb4 Alle Pins als Ausgänge
  out  DDRB,r16
  ldi  r16,  $00    ; Pb0 ... Pb4 Alle Ausgänge sind
;gleich 00000
  out  PORTB,r16

;-----
Loop:
  sbi  PORTB, 0    ; Pb0 = Level 1

  rcall  Warte      ; VerzögerungsSchleife Subroutine

  cbi  PORTB, 0    ; Pb0 = Level 0

  rcall  Warte      ; VerzögerungsSchleife Subroutine


  rjmp  Loop      ; Und zurück zum Loop ad infinitum

;-----
/*
Warte:; =============================
;   Warteschleifen-Generator
;     51613 Zyklen:
; -----------------------------
; warte 51612 Zyklen:
          ldi  R17, $44
WGLOOP0:  ldi  R18, $FC
WGLOOP1:  dec  R18
          brne WGLOOP1
          dec  R17
          brne WGLOOP0
; -----------------------------
; warte 1 Zyklus:
          nop
          ret
; =============================
*/

;****Time Delay Subroutine for LED flash*******************
warte:
  ldi coarse,5   ;triple nested FOR loop

cagain:
  ldi medium,255 ;giving about 1/4 second

magain:
  ldi fine,255   ;delay on 4 MHz clock

fagain:
  dec  fine
  brne fagain
  dec  medium
  brne magain
  dec  coarse
  brne cagain
  ret

rjmp main

Sollte so funktionieren.

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.