Forum: Mikrocontroller und Digitale Elektronik RGB Fader Anfänger-Problem


von Luis (Gast)


Lesenswert?

Als Mikrocontrollerneuling wollte ich zum Einstig einen einfachen RGB 
Fader Programmieren. Das Programm sollte eigentlich Deppen sicher 
aufgebaut sein nur es macht nicht so wie es soll.

Habe an meinen Atmega8 Entwicklungsboard von myAVR über Vorwiederstände 
eine RGB-LED angehängt. Die Led sollte einen fließenden Farbverlauf 
durchlaufen. Beginnend mit Blau über Violett, Rot usw.
Aus unerklärlichen Gründen leuchtet Grün schon von Beginn und geht 
später sprunghaft aus. Auch andere Farbwechsel passieren Sprunghaft.

Ich kann einfach keinen Fehler im Code finden, aber vielleicht kann 
einer von Euch meinen Denkfehler aufdecken. Würde mich über jede Hilfe 
Freuen!!!!


1
 ;+-----------------------------------------------------------------------------
2
;| Title                            : 
3
;+-----------------------------------------------------------------------------
4
;| Funktion                         : RGB-Fader
5
;| Schaltung                        : RGB LED Anode auf PORTC.0
6
;|                    Kathoden über Vorwiederstände (alle 150Ohm)
7
;|                    Auf PORTB 0-2
8
;+-----------------------------------------------------------------------------
9
;| Prozessor                        : ATmega8
10
;| Takt                             : 3,6864 MHz
11
;| Sprache                          : Assembler
12
;| Datum                            : ...
13
;| Version                          : ...
14
;| Autor                            : ...
15
;+-----------------------------------------------------------------------------
16
.include        "AVR.H"
17
;------------------------------------------------------------------------------
18
begin:    rjmp  main      ;  RESET External Pin, Power-on Reset, Brown-out Reset and Watchdog Reset
19
      reti          ;  INT0 External Interrupt Request 0
20
      reti          ;  INT1 External Interrupt Request 1
21
      reti          ;  TIMER2 COMP Timer/Counter2 Compare Match
22
      reti          ;  TIMER2 OVF Timer/Counter2 Overflow
23
      reti          ;  TIMER1 CAPT Timer/Counter1 Capture Event
24
      reti          ;  TIMER1 COMPA Timer/Counter1 Compare Match A
25
      reti          ;  TIMER1 COMPB Timer/Counter1 Compare Match B
26
      reti          ;  TIMER1 OVF Timer/Counter1 Overflow
27
      reti          ;  TIMER0 OVF Timer/Counter0 Overflow
28
      reti          ;  SPI, STC Serial Transfer Complete
29
      reti          ;  USART, RXC USART, Rx Complete
30
      reti          ;  USART, UDRE USART Data Register Empty
31
      reti          ;  USART, TXC USART, Tx Complete
32
      reti          ;  ADC ADC Conversion Complete
33
      reti          ;  EE_RDY EEPROM Ready
34
      reti          ;  ANA_COMP Analog Comparator
35
      reti          ;  TWI 2-wire Serial Interface
36
      reti          ;  SPM_RDY Store Program Memory Ready
37
;------------------------------------------------------------------------------
38
main:    ldi    r16,hi8(RAMEND)  ; Main program start
39
      out    SPH,r16      ; Set Stack Pointer to top of RAM
40
      ldi    r16,lo8(RAMEND)
41
      out    SPL,r16
42
      ldi    r16,0b00000111  
43
      out    DDRB,r16    
44
      out    DDRC,r16    ; PortB und C auf Ausgang
45
      out    PORTB,r16
46
      ldi    r16,0b0000001   ; Anode der LEDs
47
      out    PORTC,r16
48
      
49
      ldi    r16,0      ; ROT  Startwerte Laden
50
      ldi    r19,0      ; GRÜN
51
      ldi    r18,255      ; BLAU
52
53
;------------------------------------------------------------------------------
54
mainloop:  wdr
55
      
56
rot_up:    inc    r16        ; Rot bis 255 zählen
57
      rcall  light      ; nach jeden durchlauf in die "light" Outputroutine
58
      cpi    r16,255      ; Wenn Rot = 255 weiter zur nächsten
59
      brne  rot_up
60
      
61
blau_dn:  dec    r18        ; Blau herunterzählen
62
      rcall  light      ; Licht ausgeben
63
      cpi    r18,0      ; Wenn Blau = 0 weiter zur nächsten
64
      brne  blau_dn
65
      
66
grün_up:  inc    r17        ; Grün hinauf zählen
67
      rcall  light
68
      cpi    r17,255
69
      brne  grün_up
70
      
71
rot_dn:    dec    r16        ; Rot hinunter zählen
72
      rcall  light
73
      cpi    r16,0
74
      brne  rot_dn
75
      
76
blau_up:  inc    r18        ; Blau hinauf zählen
77
      rcall  light
78
      cpi    r18,255
79
      brne  blau_up
80
      
81
grün_dn:  dec    r17        ; Grün hinunter zählen
82
      rcall  light
83
      cpi    r17,0
84
      brne  grün_dn
85
      
86
      rjmp  mainloop
87
;------------------------------------------------------------------------------
88
89
light:                ; Leucht Routine
90
       
91
       ldi    r21,20      ; Lade Wert für Schleife Daurchlaufdauer
92
loopL:       
93
      mov    r20,r16      ; Setze Rot für für die Schleife ein
94
       cbi    PORTB,0      ; Rote LED auf LOW, damit sie Leuchtet
95
loopR:    dec    r20        ; Schleife für Leuchtdauer ROT
96
          brne   loopR
97
          sbi    PORTB,0      ; Ausgang Rot wieder auf High
98
          
99
          mov    r20,r17
100
          cbi    PORTB,1
101
loopG:    dec    r20
102
          brne   loopG
103
          sbi    PORTB,1
104
105
      mov    r20,r18          
106
          cbi    PORTB,2
107
loopB:    dec    r20
108
          brne   loopB
109
          sbi    PORTB,2
110
      
111
      dec    r21        ; Schleife für Wiederholungen um die 
112
      brne  loopL      ; Duchalaufdauer einzustellen
113
  
114
      ret

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.