www.mikrocontroller.net

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


Autor: Andreas (Gast)
Datum:

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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo ist das ret(urn) in Deiner "Warte"-Funktion?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Frequenz bei ca.75 hz

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

Autor: Gast (Gast)
Datum:

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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau, daher habe ich das mal hierher verschoben.

Autor: Andreas (Gast)
Datum:

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

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas schrieb:
> Ich habe eine return Funktion eingebaut.

Und damit sieht das Programm nun wie aus?

Autor: Netzwanze (Gast)
Datum:

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

Autor: Netzwanze (Gast)
Datum:

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

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du meinst "jmp main" zum Abschluß ?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Rene H. (Gast)
Datum:

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

Autor: Andreas (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Andreas (Gast)
Datum:

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

Autor: iCarly (Gast)
Datum:

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

Autor: iCarly (Gast)
Datum:

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

Autor: Andreas (Gast)
Datum:

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

Autor: iCarly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie hast du die LED angeschlossen?

Autor: iCarly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit was Proggrammierst du?

Autor: Eddy Current (chrisi)
Datum:

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

Autor: iCarly (Gast)
Datum:

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

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.