Vorsicht Anfängerfrage LED Blinker.

Gast #1252382
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
; =============================
Gast #1253165
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 ?
Gast #1253182
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.
#1253204
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.
Gast #1253223
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...
#1253227
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?)
Gast #1253257
;****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
Gast #1253268
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 ?
Gast #1253312
.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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.