mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Lauflicht (hin und her) 14 LEDs Problem in asm


Autor: Dennis B. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

vorab ich bin ein absoluter Neuling ja habe aber schon seid Wochen 
dieses Forum und auch viele andere durchforstet.

Ich versuche mich gerade so ein bisschen in ASM ein zu finden.


Mein derzeitiges Problem liegt bei dem richtigen shiften.


Im Anhang habe ich eine abgeänderte Rotary.asm ich schalte 14 LED's mit 
einem Atemga8515@ 8mHz davon immer 2 gleichzeitig.

Funktioniert so auch super ja ich weiß Lauflichter ist auch die perfekte 
Übung für einen Anfänger aber irgendwie verstehe ich es anscheinend 
nicht richtig und komme nicht weiter.

Stand:

Im Moment schalte ich nacheinander die LED's von außen nach innen ein
dabei zähle ich jeden shift bin ich bei 7 angekommen schalte ich alle 
aus und es geht in den Bereich um die LED's wieder zurück laufen zu 
lassen nur genau das will nicht funktionieren.

Ist wahrscheinlich für jeden hier total einfach aber ich habe jetzt 2 
Wochen dran gefummelt und immer wieder gelesen und gegoogelt da ich 
nicht nach dem Motto frag ich mal die die Ahnung haben die machen mir 
das handeln wollte.

Wäre nett wenn man mir Tipps geben könnte.


Gruß

  Dennis

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> zähle ich jeden shift
Du musst deine Shifts nicht mitzählen. Du kannst einfach direkt den 
Shiftwert vergleichen. Pseudocode mit 8 LEDs:
init:
led  = 0b00000001
richtung = links

zeit500ms:
wenn richtung==links 
dann
   wenn led != 0b1000000 
   dann led linksschieben
   sonst richtung = rechts
sonst
   wenn led != 0b0000001 
   dann led rechtsschieben
   sonst richtung = links

Autor: Dennis B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja und das ganze dann mit PWM dabei????


Ich möchte auch ungern den Code komplett neu schreiben auch wenn es 
einfacher oder besser geht aber so kann ich nicht lernen mit Problemen 
um zu gehen bzw. sie überhaupt entdecken.

Es muss ja schließlich auch mit meiner Methode gehen.



Gruß

  Dennis

Autor: Dennis B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.include "m8515def.inc"

.def TEMP   = r16
.def STORE  = r17     ; Port Value für die aktive LED
.def STORE2 = r18     ; Port Value für die nächste LED
.def OUTER  = r19     ; Fading counter
.def INNER  = r20     ; PWM counter
.def ZAEHLER = r21    ;led ZAEHLER
.def ZAEHLER2 = r24    ;led ZAEHLER2
.def STORE1 = r22

.equ DELAY = 150

    ; I/O setup
    ; =========
    ldi TEMP, 255     ;Original 31 switch PB0..PB5 to output
    out DDRA, TEMP
  out DDRC, TEMP

    ldi STORE,  255    ; orig 30 load start value (LED0 on)
    ldi STORE2, 29    ; load next value (LED1 on)
    ldi STORE1, 1    ; load next value (LED1 on)

LOOP:
    inc  INNER         ; increment the inner counter
    cpi  INNER, DELAY  ; have we reached the maximum value?
    brne GO_ON         ; if yes, increment the outer one

    clr  INNER         ; reset inner counterDDRA 7 26
    inc  OUTER         ; increment outer counter
    cpi  OUTER, DELAY
    breq NEXT_PHASE    ; if it overflows, go to the next LED

GO_ON:
    cp   INNER, OUTER   ; inner > outer?
    brsh THIS_LED       ; if yes, the current LED needs to be on

    out  PORTA, STORE2  ; else the next one
  out  PORTC, STORE2
    rjmp LOOP           ; and start over

THIS_LED:
    cp   OUTER, INNER
    out  PORTA, STORE   ; switch on current LED
  out  PORTC, STORE
    rjmp LOOP           ; and start over


NEXT_PHASE:
    clr  OUTER          ; reset counter
    mov  STORE, STORE2  ; next LED
    lsr  STORE2         ; shift current value
    ori  STORE2, 1      ; the lsl makes the lsb 0, we need a 1
    sbrs STORE2, 7      ; orig 5 do we need to wrap around?
    ldi  STORE2, 255     ; orig 30 if yes, load the initial value
    andi STORE2, 254     ; orig 31 mask bit 5 to 7
    inc ZAEHLER
    clr ZAEHLER2
    rjmp zeahler_pruefen           ; and start over

zeahler_pruefen:
    CPI ZAEHLER,7     ; springe wenn zeahler kleiner wie 1
    BRGE Storesetzen        ; springe zu loop2 

    rjmp LOOP         ; ansonsten springe zu loop

Storesetzen:
    sbi  PORTA, PB7
    sbi  PORTC, PB7
  ldi  STORE1, 128
    LSR  STORE1
    rjmp test2


test2:
    out PORTA, STORE1
    out PORTC, STORE1
    inc ZAEHLER2
    rjmp test3
  

test3:

    LSR STORE1

  CPI ZAEHLER2, 7
  BRGE zuruck

  rjmp test2

zuruck:

    CLR ZAEHLER
  rjmp LOOP



Was ich nicht verstehe ab LOOP2 leuchten nur die LEDS an PA0 und PC0 
obwohl ich jeweils den Pin 6 aktiviert habe naja denke ich zumindest 
kann mir niemand helfen?

Autor: Ben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
von PWM ist aber bei einem reinen lauflicht nicht die rede. das verlangt 
schon etwas mehr als ein anfänger in seinen ersten schritten versuchen 
sollte. da müßtest du dir mal klar werden was du von dem controller 
willst. und 14 PMW kanäle sind bei 8mhz in software gar nicht soooo 
einfach.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dennis B. schrieb:

>     inc ZAEHLER
>     clr ZAEHLER2
>     rjmp zeahler_pruefen           ; and start over
>
> zeahler_pruefen:
>     CPI ZAEHLER,7     ; springe wenn zeahler kleiner wie 1

Ich vermute bei den englischsprachigen Kommentaren, vereinzelten 
deutschsprachigen Labels und dem Programmierstil, dass du einen 
Quellcode "aus dem Netz" an dein Projekt angepasst hast.

Und dabei den Fehler eingeschleppt hast.

Die Fehlersuche wäre sicher einfacher, wenn man den Originalcode kennen 
würde und was du Abändern willst.

Autor: Dennis B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau das Original war nen recht einfaches Lauflicht bei dem auch imemr 
nur eine LED High war.


Habe es jetzt aber auch fast hin bekommen und komplett von neu 
geschrieben mit einem Code zur Hilfe aus irgendeinem Forum blicke da 
selbst nicht emhr durch.


Dieser ist jetzt fehler frei nur würde ich gerne statt imemr 3 LED's an 
5 LED's an haben muss ich mal weiter fummeln.


Wenn jemand mir helfen kann bei dem eigentlich recht kleinen Problem 
dann kann er sich ja vielleicht noch mal äußern.
;
; Knight Rider 2008 Light
;
; 
;
; Programm von Dennis Bassy Hagen, 01 November 2009
;
;
; 16 LEDs verbunden mit PORTA und PORTC
; Mit jeweils 3 LED's 2 (gedimmt per PWM)
; um einen schleier Effekt zu erzielen 


    .include  "8515def.inc"

    .equ  FADEDELAY=50    
    .equ  MOVETIME=10    
    
    .def  FadeCounter=r11    
    .def  MoveCounter=r9    
    .def  PWM=r10      ; Aktueller PWM Schritt
    .def  LedStep=r12    ; Aktueller LED Schritt
    .def  Dir=r13      

    ;

    .org  $0000      
    rjmp  reset

    .org  INT0addr    
    reti

    .org  INT1addr    
    reti

    .org  ICP1addr     
    reti

    .org  OC1Aaddr     
    reti

    .org  OC1Baddr     
    reti

    .org  OVF1addr     
    reti

    .org  OVF0addr     
    rjmp  timer0

    .org  SPIaddr      
    reti

    .org  URXCaddr    
    reti

    .org  UDREaddr      
    reti

    .org  UTXCaddr    
    reti

    .org  ACIaddr     
    reti



reset:    ldi  r16,high(RAMEND)  
    out  SPH,r16

    ldi  r16,low(RAMEND)
    out  SPL,r16

    ldi  r16,4      
    out  TCCR0,r16

    ldi  r16,1<<TOIE0    
    out  TIMSK,r16

    ldi  r16,255      ; Alle Ports auf Output
    out  DDRA,r16
        out  DDRC,r16

    ldi  r16,14    ;Alle LED's auf High setzen
    mov  r0,r16
    mov  r1,r16
    mov  r2,r16
    mov  r3,r16
    mov  r4,r16
    mov  r5,r16
    mov  r6,r16
    mov  r7,r16

    clr  LedStep      

    ldi  r16,1
    mov  Dir,r16

    ldi  r16,16
    mov  MoveCounter,r16

    ldi  r16,FADEDELAY
    mov  fadeCounter,r16    

    sei        

mainloop:  tst  FadeCounter    
    brne  mainloop    

    ldi  r16,FADEDELAY
    mov  fadeCounter,r16    

    clr  ZL
    clr  ZH
    ldi  r16,8    
mainloop5:  ld  r17,Z    
    cpi  r17,15    
    breq  mainloop6  
    tst  r17
    breq  mainloop6  
    dec  r17
mainloop6:  st  Z+,r17    ; Intensität für nächste LED setzen
    dec  r16
    brne  mainloop5



mainloop1:  dec  MoveCounter  ; Zeit für nächsten schritt
    brne  mainloop  ; Kein LOOP, Zurück

    ldi  r16,MOVETIME
    mov  MoveCounter,r16
    
    mov  ZL,LedStep  ; Aktuelle LED LOW schalten
    clr  ZH
    ldi  r16,10        
    st  Z,r16    
  
    add  LedStep,Dir
    mov  r16,LedStep
    
    cpi  r16,7    
    breq  mainloop3
    cpi  r16,0
    brne  mainloop4

mainloop3:  neg  Dir        

mainloop4:  mov  ZL,LedStep  ; nächste LED an
    clr  ZH
    ldi  r16,15    
    st  Z,r16    

    rjmp  mainloop


timer0:    push  r16
    push  r17
    push  r18  
    push  ZH
    push  ZL

    in  r16,SREG
    push  r16  
  
    ldi  r16,255-10  ; Counter Neu laden
    out  TCNT0,r16

    tst  FadeCounter
    breq  timer0_2
    dec  FadeCounter  

timer0_2:  dec  PWM    
    ldi  r16,15
    and  PWM,r16    ; Nur 16 stufen

    clr  ZL    ; Loop alle LED intensität's stufen
    clr  ZH
    
    ldi  r17,1    ; Bit maske
    clr  r18    ; momentaner status aller LED's

timer0_0:  ld  r16,Z+    ; Setzen der Intensität der LED

    tst  r16
    breq  timer0_1  

    cp  r16,PWM     
    brlo  timer0_1   
    or  r18,r17

timer0_1:  lsl  r17    ; schiebe bit maske
    brne  timer0_0  ; Wenn bit maske eine 0 bekommt, alle LEDs durchgelaufen
    
    com  r18
    out  PORTA,r18  ; Update PORT
    out  PORTC,r18  ; Update PORT

    pop  r16
    out  SREG,r16

    pop  ZL
    pop  ZH    
    pop  r18
    pop  r17
    pop  r16

    reti

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.