;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 "m8515def.inc" ;vereinbarte Namen verwenden (lt. Datasheet) .list ;Programm listen .listmac ;Makros listen .equ clock = 8000000 ;Taktfrequenz 8Mhz .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 ruck = 4 ;Taste zurück (braucht kein Mensch...) .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) cp pwz, soll7 ;Sollwert erreicht? (Ergebnis im Carry) rol temp ;Carry-Bits "einsammeln", dieses wird bis Bit7 durchgeschoben cp pwz, soll6 rol temp ;Bit 6 cp pwz, soll5 rol temp ;Bit 5 cp pwz, soll4 rol temp ;Bit 4 cp pwz, soll3 rol temp ;Bit 3 cp pwz, soll2 rol temp ;Bit 2 cp pwz, soll1 rol temp ;Bit 1 cp pwz, soll0 rol temp ;Bit 0 ;com temp ;invertieren da low-aktive LED im STK500 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... ;******************************************************************************************************************* anzeione: inc kanal ;kanal erhöhen =inc lds wh,ZEILE ;zeile aus dem SRAM holen inc wh ;zeile erhöhen sts ZEILE,wh ;zurück ins SRAM cpi wh,8 ;Überlauf? brne ausgabe lds wh,ZEILE ;zeile aus dem SRAM holen DEC wh ;verringern sts ZEILE,wh ;zurück ins SRAM cpi wh,8 ;Überlauf? clr wh ;von 0 beginnen tabeleneintrag zeile1 sts ZEILE,wh ;Korrektur zurück ins SRAM brne ausgabe ;zurück RET anzeitwo: DEC kanal ;kanal verringern = dec lds wh,ZEILE ;zeile aus dem SRAM holen DEC wh ;zeile verringern sts ZEILE,wh ;zurück ins SRAM cpi wh,8 ;Überlauf? brne ausgabe lds wh,ZEILE ;zeile aus dem SRAM holen INC wh ;erhöhen sts ZEILE ,wh ;zurück ins SRAM cpi wh,8 ;Überlauf?, clr wh ;von 0 beginnen tabeleneintrag zeile1 sts ZEILE,wh ;Korrektur zurück ins SRAM brne ausgabe ret ;zurück ausgabe: locate 0,28 ;Ausgabeposition zeile0 posi.28 printts Tabelle,zeile ;Text aus Tabelle zeile mit Index im SRAM-Zelle zeile 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 Tabelle: .dw kanal1,kanal2,kanal3,kanal4,kanal5,kanal6,kanal7,kanal8 kanal1: .db "kanal1",0,0 kanal2: .db "kanal2",0,0 kanal3: .db "kanal3",0,0 kanal4: .db "kanal4",0,0 kanal5: .db "kanal5",0,0 kanal6: .db "kanal6",0,0 kanal7: .db "kanal7",0,0 kanal8: .db "kanal8",0,0