;Demoprogramm für 8-fach-PWM mit Tastensteuerung und Pollin-LCD 4x27. ;8 LEDs gegen Vcc an Port B (STK500) ;4 entprellte Tasten gegen GND für die einzelnen PWM-Kanäle an Port C ;Davon 2 Tasten (Dimm-Tasten) mit Repeat-Funktion bei Dauerdruck. ;LCD 4x27 an Port D .nolist ;List der Include-Datei unterdrücken .include "m162def.inc" ;vereinbarte Namen verwenden (lt. Datasheet) .list ;Programm listen .listmac ;Makros listen .equ clock = 8000000 ;Taktfrequenz 8Mhz .equ teilfaktor=100 ;Zählumfang des Teilers .equ pwu = 100 ;PWM-Zählumfang (sollte 100 sein wegen %) .equ timerwert = -100 ;Timer-Startwert (Reload)-100 .equ step=1 ;Schrittweite für Änderung pro Tastendruck .equ lep=portb ;Port für LEDs .equ tap=pinc ;Tastenport .equ save = 5 ;Taste zum Speichern im EEP .equ load = 4 ;Taste zu, Lesen aus EEP .equ dimplus = 3 ;Taste Dimmen plus .equ dimminus = 2 ;Taste Dimmen minus .equ chanplus = 1 ;Taste Kanal hoch .equ chanminus = 0 ;Taste Kanal runter .equ dimtast=(1<1, 1,3,->0 eor tz1,tz0 ;H-Bit zählen 0,2,->tz1 toggeln and temp,tz0 ;Änderungen nur dann erhalten, wenn im Prellzähler and temp,tz1 ;beide Bits gesetzt sind (Zählerstand 3) eor tas,temp ;erhaltene Änderungen toggeln alten (gültigen) Tastenstatus and temp,tas ;nur (neu) gedrückte Tastenbits bleiben erhalten or tfl,temp ;und zugehörige Bits setzen (gelöscht wird nach Abarbeitung) ;tmp ist wieder frei, tas enthält den entprellten Tastenstatus, ;tfl die neu gerückten Tasten Tastendauer: mov temp,tas ;Tastenzustand kopieren andi temp,dimtast ;nur Dimm-Tasten mit Wiederholfunktion stehen lassen tst temp ;ist eine Taste betätigt? breq Tastendauer0 ;nein, Dauer auf Startwert... dec twz ;ja, Zähler runter brne Tastenabfrage_e ;Dauer abgelaufen? - nein... or tfl,temp ;ja, noch aktive Tasten übernehmen ldi twz,twz1 ;und Zähler auf Wiederholwert setzen Tastenabfrage_e: ;in "tfl" stehen jetzt wieder die Flags der länger betätigten Tasten ;sie werden nach Abarbeitung gelöscht ;************************************************************* Time0_a: ;Vergleich der einzelnen PWM-Werte mit dem PWM-Treppenzähler ;(Idee geklaut bei Peter Dannegger) lds wl, SOLL7 ;soll7 aus sram holen cp pwz, temp ;Sollwert erreicht? (Ergebnis im Carry) rol temp ;Carry-Bits "einsammeln", dieses wird bis Bit7 durchgeschoben lds wl, soll6 cp pwz, temp rol temp ;Bit 6 lds wl, soll5 cp pwz, temp rol temp ;Bit 5 lds wl, soll4 cp pwz, temp rol temp ;Bit 4 lds wl, soll3 cp pwz, temp rol temp ;Bit 3 lds wl, soll2 cp pwz, temp rol temp ;Bit 2 lds wl, soll1 cp pwz, temp rol temp ;Bit 1 lds wl, soll0 cp pwz, temp rol temp ;Bit 0 sts PWMsoll, WL ; die sollwerte wieder zurück ins sram com temp ;invertieren da low-aktive Mosfet-treiber out lep, temp ;Ausgabe out sreg, sregtemp ;Sreg wiederherstellen reti ;ISR fertig... Tastendauer0: ;Reset Dauerzähler ldi twz,twz0 ;Tastendauerzähler auf Startwert rjmp Tastenabfrage_e ;fertig... DISPLAYON: sbi lcdHintergrundstromport,lcdHintergrundstrompin ;lcdHintergrundstromport sbi lcdHintergrundstromport-1,lcdHintergrundstrompin ; nach tastendruck wieder einschalten RET txt_zeile0: .db "Kanal 1 % Kanal 5 %",0 txt_zeile1: .db "Kanal 2 % Kanal 6 %",0 txt_zeile2: .db "Kanal 3 % Kanal 7 %",0 txt_zeile3: .db "Kanal 4 % Kanal 8 %",0 .ESEG .db 10,100,23,30,45,55,78,90