Vorsicht Anfängerfrage LED Blinker.

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren