;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 EEWRITE = 5 .equ EEREAD = 4 ;Taste zurück (braucht kein Mensch...) ; .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... 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 EEPROM_read: ; Wait for completion of previous write sbic EECR,EEWE rjmp EEPROM_read ; Set up address (r18:r17) in address register out EEARH, SOLL0 ;r0 out EEARL, r15 ; Start eeprom read by writing EERE sbi EECR,EERE ; Read data from data register in SOLL0,EEDR ret EEPROM_write: ; Wait for completion of previous write sbic EECR,EEWE rjmp EEPROM_write ; Set up address (r18:r17) in address register out EEARH, SOLL0 ; R0 out EEARL, R15 ; Write data (r16) to data register out EEDR,SOLL0 ; Write logical one to EEMWE sbi EECR,EEMWE ; Start eeprom write by setting EEWE sbi EECR,EEWE ret