|
nubbi
offline
OC God 21 Jahre dabei !
|
über einen monat später gibts das erste update ^^ könnte ja sein, dass irgendjemand über google nach was ähnlichem sucht =) hier der bisherige quellcode in avr-assembler:
Code .include "tn2313def.inc" .def temp = r16 .def temp2 = r17 .def pwm_r = r21 .def pwm_g = r22 .def pwm_b = r23 ; Eigene Flags zur Vereinfachung des Farbübergangs bei Farbänderung .def flags = r24 .equ r_reached = 0 .equ g_reached = 1 .equ b_reached = 2 .equ wait_length = 50; ; Interrupt Vectors .org 0x00; Reset rjmp init; Initroutine aufrufen pwm_activate: ldi temp, (1<<PB2) | (1<<PB3) | (1<<PB4); PB2-4 (OCnx) als out DDRB, temp; Ausgang deklarieren ret; -> PWM-Signal pwm_deactivate: ldi temp, 0x00; PB2-4 (OCnx) als out DDRB, temp; Eingang deklarieren ret; -> Kein PWM-Signal pwm_setvalues: out OCR0A, pwm_r; Compare-Register auf out OCR0B, pwm_g; entsprechende Werte out OCR1AL, pwm_b; setzen ret changecolor: push temp; Temp sichern change_loop: ; ------[rot]------- in temp, OCR0A; OCR0A in temp laden cp temp, pwm_r; temp mit pwm_r vergleichen breq set_r_reached; wenn temp = pwm_r mit gruen weiter brlo inc_r; wenn temp < pwm_r OCR0A erhöhen dec_r: dec temp; temp verringern und in OCR0A speichern out OCR0A, temp rjmp change_g; inc-Routine skippen inc_r: inc temp; temp erhöhen und in OCR0A speichern out OCR0A, temp; ------[/rot]------- change_g:; ------[gruen]------ in temp, OCR0B; OCR0B in temp laden cp temp, pwm_g; temp mit pwm_g vergleichen breq set_g_reached; wenn temp = pwm_g mit blau weiter brlo inc_g; wenn temp < pwm_g OCR0B erhöhen dec_g: dec temp; temp verringern und in OCR0B speichern out OCR0B, temp rjmp change_b; inc-Routine skippen inc_g: inc temp; temp erhöhen und in OCR0B speichern out OCR0B, temp; ------[/gruen]------ change_b:; -------[blau]------- in temp, OCR1AL; OCR1AL in temp laden cp temp, pwm_b; temp mit pwm_b vergleichen breq set_b_reached; wenn temp = pwm_b warten brlo inc_b; wenn temp < pwm_b OCR1AL erhöhen dec_b: dec temp; temp verringern und in OCR1AL speichern out OCR1AL, temp rjmp check_if_all_reached; inc-Routine skippen inc_b: inc temp; temp erhöhen und in OCR1AL speichern out OCR1AL, temp; -------[/blau]------ check_if_all_reached: sbrs flags, r_reached; wenn x_reached = false, check abbrechen rjmp check_negative; und nächsten Durchlauf starten sbrs flags, g_reached rjmp check_negative sbrs flags, b_reached rjmp check_negative ldi flags, 0x00; Statusbits wieder auf false setzen. ret; Routine verlassen check_negative: rjmp wait_long rjmp change_loop init: ldi temp, (1<<CS00); TCNT0 Prescaler = 1 out TCCR0B, temp ldi temp, (1<<CS10) | (1<<WGM12); TCNT1 Prescaler = 1 out TCCR1B, temp; TCNT1 TOP = 0x00FF ldi temp, (1<<COM0A0) | (1<<COM0B0) | (1<<WGM00) | (1<<WGM01); Fast PWM/Set OC0A@Top out TCCR0A, temp; Fast PWM/Set OC0B@Top out TCCR1A, temp; Fast PWM/Set OC1A@Top ldi pwm_r, 0xFF; Alle Farbwerte auf ldi pwm_g, 0xFF; 0xFF setzen ldi pwm_b, 0xFF; -> weiß rjmp pwm_activate; PWM aktivieren infinite_loop:; Endlosschleife, wenn nop; nichts zu tun ist rjmp infinite_loop; NOP damit nichts wegoptimiert wird wait_long: push temp; Temp sichern ldi temp, 0x00; Temp als Zählervariable benutzen wlloop: rjmp wait_short; 2. Warteroutine aufrufen inc temp; Zähler erhöhen cpi temp, wait_length; Checken ob temp < wait_length brlo wlloop; wenn ja, zurück springen pop temp; Temp wiederherstellen ret; Routine verlassen wait_short: push temp; Temp sichern ldi temp, 0x00; Temp als Zählervariable benutzen wsloop: inc temp; Zähler erhöhen cpi temp, wait_length; Checken ob temp < wait_length brlo wsloop; wenn ja, zurück springen pop temp; Temp wiederherstellen ret; Routine verlassen set_r_reached: ldi temp, (1<<r_reached); r_reached-bit in temp laden or flags, temp; flags mit temp verodern rjmp change_g; zur change_g-Routine springen set_g_reached: ldi temp, (1<<r_reached); g_reached-bit in temp laden or flags, temp; flags mit temp verodern rjmp change_b; zur change_b-Routine springen set_b_reached: ldi temp, (1<<b_reached); b_reached-bit in temp laden or flags, temp; flags mit temp verodern rjmp check_if_all_reached; zur Check-Routine springen
| Eine Kommunikation zwischen PC und Controller ist noch nicht implementiert, folgt aber in den nächsten Stunden!
|
Beiträge gesamt: 2820 | Durchschnitt: 0 Postings pro Tag Registrierung: Mai 2003 | Dabei seit: 7876 Tagen | Erstellt: 23:23 am 3. Okt. 2005
|
|
|
|
|
|