;Demoprogramm für 8-fach-PWM mit Tastensteuerung Up-Down. ;8 LEDs gegen Vcc an PortB (STK500) ;8 entprellte Tasten gegen GND für die einzelnen PWM-Kanäle an PortD ;1 "Shift-Taste" an PA6 gegen GND zum Wählen der Stellrichtung der Kanaltasten. ;Shift offen -> Kanaltasten zählen hoch, ;Shift betätigt -> Kanaltasten zählen runter. ;Der Zählumfang wird nach oben und unten begrenzt. .include "m8515def.inc" .equ clock = 8000000 ;Taktfrequenz .equ pwu = 99 ;PWM-Zählumfang .equ timerwert = -100 ;Timer-Startwert (Reload) .equ step=6 ;Schrittweite für Änderung pro Tastendruck .equ lep=portb ;Port für LEDs .equ tap=pinc ;Tastenport .equ ship=pind ;Port für Shift-Taste .equ shib=6 ;Bit für Shift-Taste .equ avt0=25 ;Startwert Anzeige-Vorteiler .def soll0 = r0 ;Sollwert Kanal 1 .def soll1 = r1 ;Sollwert Kanal 2 .def soll2 = r2 ;Sollwert Kanal 3 .def soll3 = r3 ;Sollwert Kanal 4 .def soll4 = r4 ;Sollwert Kanal 5 .def soll5 = r5 ;Sollwert Kanal 6 .def soll6 = r6 ;Sollwert Kanal 7 .def soll7 = r7 ;Sollwert Kanal 8 .def tsw = r8 ;Timer-Startwert .def sregtemp = r9 ;Sicherheitskopie SREG .def scan=r10 ;Scannwert Tastenport .def tz0=r11 ;Tasten-Prellzähler Bit0 .def tz1=r12 ;Tasten-Prellzähler Bit1 .def tas=r13 ;Tastenstatus (gültig) .def null=r14 ;immer 0 .def temp = r16 .def tfl=r17 ;Flags für Tasten, die gedrückt wurden .def pwz = r18 ;PWM-Zähler .def task=r19 ;Taskscheibe für diverse Aufgaben .def ri=r20 ;Richtung der Änderung .def max=r21 ;Maximum .def avt=r22 ;Anzeige-Vorteiler .def flags=r23 ;Steuerflags .equ aktuLCD=7 ;LCD aktualisieren .def wl=r24 ;Working L .def wh=r25 ;Working H .cseg .org 0 ;Reset- und Interrupt-Vektoren Mega 8535 .org 0 ;Reset- und Interrupt-Vektoren AT-Mega 8515 rjmp RESET ;Reset Handler rjmp nix;EXT_INT0 ;IRQ0 Handler rjmp nix;EXT_INT1 ;IRQ1 Handler rjmp nix;TIM1_CAPT ;Timer1 Capture Handler rjmp nix;TIM1_COMPA ;Timer1 Compare A Handler rjmp nix;TIM1_COMPB ;Timer1 Compare B Handler rjmp nix;TIM1_OVF ;Timer1 Overflow Handler rjmp TIM0_OVF ;Timer0 Overflow Handler rjmp nix;SPI_STC ;SPI Transfer Complete Handler rjmp nix;USART_RXC ;USART RX Complete Handler rjmp nix;USART_UDRE ;UDR0 Empty Handler rjmp nix;USART_TXC ;USART TX Complete Handler rjmp nix;ANA_COMP ;Analog Comparator Handler rjmp nix;EXT_INT2 ;IRQ2 Handler rjmp nix;TIM0_COMP ;Timer0 Compare Handler rjmp nix;EE_RDY ;EEPROM Ready Handler rjmp nix;SPM_RDY ;Store Program memory Ready Handler nix: ;unbenutzte Interrupts reti ;zurück... .include"LCDprint.inc" ;LCD-Ausgabefunktionen .include"LCD_4x40.inc" ;LCD-Routinen für 2-Zeilen-LCDs mit HD44780 Reset: ldi wl,low(ramend) ;Stackpointer initialisieren out SPL,wl ldi wl,high(ramend) out SPH,wl clr null ;immer 0 ldi wl, 0xFF ;Port A = Ausgang out DDRA, wl ldi temp, 0xff out lep-1,temp ;Ports B = Ausgang (DDRx=PORTx-1) ;out lep,temp ;LED aus out tap+2,temp ;Pull-Ups für Tasten einschalten (PORTx=PINx+2) ldi temp, 0x00 out tap+1,temp ;Ports d = Eingang (DDRx=PINx+1) cbi ship+1,shib ;Shift-Tastenanschluss als Eingang sbi ship+2,shib ;Shift-PullUp einschalten clr soll0 clr soll1 clr soll2 clr soll3 clr soll4 clr soll5 clr soll6 clr soll7 clr tz0 ;Definierte Startbedingung clr tz1 ;für Tastenentprellung clr tas clr tfl ldi temp, 0x01 out tccr0, temp ;Timertakt = 1:1 ldi temp, 1<1, 1,3,->0 eor tz1,tz0 ;H-Bit zählen 0,2,->tz1 toggeln and scan,tz0 ;Änderungen nur dann erhalten, wenn im Prellzähler and scan,tz1 ;beide Bits gesetzt sind (Zählerstand 3) eor tas,scan ;erhaltene Änderungen toggeln alten (gültigen) Tastenstatus and scan,tas ;nur (neu) gedrückte Tastenbits bleiben erhalten or tfl,scan ;und zugehörige Bits setzen (gelöscht wird nach Abarbeitung) ;in "tas" steht jetzt der gültige Tastenzustand, ;in "tfl" die Flags der neu gedrückten, noch nicht abgearbeiteten Tasten... timertasks: cpi task,2 ;Beispiel für Verzweigung nach Taskscheibe brne timerfertig ;bei falscher Tasknummer Überspringen... dec avt ;Anzeige-Vorteiler runter brne timerfertig ;unten? nein, weg hier... ldi avt,avt0 ;ja, Startwert laden sbr flags,1<