Ein absolut deutlicher Unterschied in der Helligkeit.
Wobei immer noch eine LED fehlt
ahhh okey du machst das 2 stöckig ?! *g*
jetzt bin ich verwirrt, geht dir durch den oberen Aufbau nicht zuviel von deinen Bergkristallen Optisch"verloren"?
Wo willst Du da eigentlich noch den voice-recognition-IC + Beschaltung unterbringen?
' #############################################################################
' ##### Magierstab v2 mit Mega32 ##############################################
' #############################################################################
' (c) 27.06.2010 by Dino
' BASCOM 2.0.7.5
'
'
' Prozessor ATmega32
$regfile = "m32def.dat"
' 16MHz Quarztakt (Baudraten-Quarz)
$crystal = 16000000
$hwstack = 32
$swstack = 32
$framesize = 32
' ATMEL AVR ATmega32
' 32kByte Flash (16kx16)
' 1kByte EEPROM
' 32 Register + 2kByte RAM
'
' ATmega32
' +-------------------------------+
' PWM rt1 ----------| 1 PB0(XCK/T0) (ADC0)PA0 40|---------- PWM bl1
' PWM rt2 ----------| 2 PB1(T1) (ADC1)PA1 39|---------- PWM bl2
' PWM gn1 ----------| 3 PB2(INT2/AIN0) (ADC2)PA2 38|---------- PWM bl3
' PWM gn2 ----------| 4 PB3(OC0/AIN1) (ADC3)PA3 37|---------- PWM ws1
' Enable ----------| 5 PB4(SS) (ADC4)PA4 36|---------- PWM ws2
' Taster1 --- (ISP) MOSI --| 6 PB5(MOSI) (ADC5)PA5 35|---------- PWM ws3
' Taster2 --- (ISP) MISO --| 7 PB6(MISO) (ADC6)PA6 34|
' Taster3 ---- (ISP) SCK --| 8 PB7(SCK) (ADC7)PA7 33|---------- Akkuspannung
' Reset-Taster -- (ISP) RESET --| 9 RESET AREF 32|--(*)
' +Vcc --|10 VCC GND 31|-- GND
' GND --|11 GND AVCC 30|-- +Vcc (gesiebt)
' XTAL --|12 XTAL2 (TOSC2)PC7 29|
' XTAL --|13 XTAL1 (TOSC1)PC6 28|
' MAX232 ||----------|14 PD0(RXD) (TDI)PC5 27|
' Debug ||----------|15 PD1(TXD) (TDO)PC4 26|
' INT0-Taster ----------|16 PD2(INT0) (TMS)PC3 25|
' INT1-Taster ----------|17 PD3(INT1) (TCK)PC2 24|
' |18 PD4(OC1B) (SDA)PC1 23|----------|| 2x LM75 (Akku + Treiber/LEDs)
' |19 PD5(OC1A) (SCL)PC0 22|----------|| PCF8574 für LCD Servicedisplay
' |20 PD6(ICP1) (OC2)PD7 21|
' +-------------------------------+
' (*) 100nF nach GND
' #############################################################################
' ##### DEFINITION DER VARIABLEN ##############################################
' #############################################################################
'
Dim R As Byte
R = 0
Dim G As Byte
G = 0
Dim B As Byte
B = 0
Dim W As Byte
W = 0
' #############################################################################
' ##### DEFINITION DER PORTS ##################################################
' #############################################################################
'
' =============================================================================
' ===== PortA (digital) =======================================================
' =============================================================================
' PA0 ---->-- blau1
' PA1 ---->-- blau2
' PA2 ---->-- blau3
' PA3 ---->-- weiss1
' PA4 ---->-- weiss2
' PA5 ---->-- weiss3
' PA6 ---->--
' PA7 ---->-- VBat-ADC
'
' A=7= I=6= I=5= O=4= O=3= O=2= O=1= O=0= => 11110111 => DDRB
' VBat ---- ws3 ws2 ws1 bl3 bl2 bl1 => 00001000 => PORTB (init)
' | | | | | | | |
'
Ddra = &B0011_1111
Porta = &B0000_0000
' =============================================================================
' ===== PortB =================================================================
' =============================================================================
' PB0 ---->-- rot1
' PB1 ---->-- rot2
' PB2 ---->-- gruen1
' PB3 ---->-- gruen2
' PB4 ---->-- PWM-Enable
' PB5 ---->-- Taster1 (MOSI)
' PB6 ---->-- Taster2 (MISO)
' PB7 ---->-- Taster3 (SCK)
'
' I=7= I=6= I=5= O=4= O=3= O=2= O=1= O=0= => 11110111 => DDRB
' SCK MISO MOSI PWME gn2 gn1 rt2 rt1 => 00001000 => PORTB (init)
' | | | | | | | |
'
Ddrb = &B0001_1111
Portb = &B1110_0000
' =============================================================================
' ===== PortC (digital) =======================================================
' =============================================================================
' PC0 ---->-- SCL
' PC1 --<->-- SDA
' PC2 ---->--
' PC3 ---->--
' PC4 ---->--
' PC5 ---->--
' PC6 ---->--
' PC7 ---->--
'
' I=7= I=6= I=5= I=4= I=3= I=2= I=1= I=0= => 11110111 => DDRB
' ---- ---- ---- ---- ---- ---- SDA SCL => 00001000 => PORTB (init)
' | | | | | | | |
'
Ddrc = &B0000_0000
Portc = &B1111_1111
' =============================================================================
' ===== PortD =================================================================
' =============================================================================
' PD0 --<---- RxD | UART1
' PD1 ---->-- TxD | TTL-Pegel
' PD2 --<---- INT0
' PD3 --<---- INT1
' PD4 --<----
' PD5 --<----
' PD6 --<----
' PD7 --<----
'
' I=7= I=6= I=5= I=4= O=3= I=2= O=1= I=0= => 00001001 => DDRD
' T4 T3 T2 T1 TxD1 RxD1 TxD RxD => 11110110 => PORTD (init)
' | | | | | | | |
'
Ddrd = &B0000_0010
Portd = &B1111_1111
' =============================================================================
' ===== I2C/TWI initialisieren ================================================
' =============================================================================
$lib "i2c_twi.lbx" ' Bibliothek fuer Hardware-TWI einbinden
Config Scl = Portc.0
Config Sda = Portc.1
I2cinit
Config Twi = 300000 ' Taktfrequenz 300 kBit/s
' TWI gleich einschalten, das macht BASCOM ansonsten erst beim I2CStart
'Twcr = &B00000100 ' nur TWEN setzen
' Optionale Einstellungen für TWI Kommunikation die nicht zwingend erforderliche sind
' Twsr = 0 ' Status und Prescaler Register
' Twbr = 152 ' Bit Rate Register, 72 = 100kHz 152 = 50kHz(0 bis 255)
' Config I2cdelay = 40
I2cstart
I2cstop
' =============================================================================
' ===== UART1 (TTL) initialisieren ============================================
' =============================================================================
Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Serialin = Buffered , Size = 8
Open "com1:" For Binary As #1
Waitms 100
$asm
sbi portb,0
$end Asm
Waitms 100
$asm
Cbi portb,0
Sbi portb,1
$end Asm
Waitms 100
$asm
Cbi portb,1
Sbi portb,2
$end Asm
Waitms 100
$asm
Cbi portb,2
Sbi portb,3
$end Asm
Waitms 100
$asm
Cbi portb,3
Sbi portA,0
$end Asm
Waitms 100
$asm
Cbi portA,0
Sbi portA,1
$end Asm
Waitms 100
$asm
Cbi portA,1
Sbi portA,2
$end Asm
Waitms 100
$asm
Cbi portA,2
Sbi portA,3
$end Asm
Waitms 100
$asm
Cbi portA,3
Sbi portA,4
$end Asm
Waitms 100
$asm
Cbi portA,4
Sbi portA,5
$end Asm
Waitms 100
$asm
Cbi portA,5
$end Asm
Dim Loopcount As Word
Loopcount = 0
' #############################################################################
' ##### Hauptschleife Start ###################################################
' #############################################################################
Do
If Pinc.4 = 0 Then
R = 1
' ROT
$asm
sbi portb,0
sbi portb,1
$end Asm
Else
R = 0
' Nicht ROT
$asm
Cbi portb,0
Cbi portb,1
$end Asm
End If
If Pinc.5 = 0 Then
G = 1
' GRUEN
$asm
sbi portb,2
sbi portb,3
$end Asm
Else
G = 0
' Nicht GRUEN
$asm
Cbi portb,2
Cbi portb,3
$end Asm
End If
If Pinc.6 = 0 Then
B = 1
' BLAU
$asm
sbi portA,0
sbi portA,1
Sbi portA,2
$end Asm
Else
B = 0
' Nicht BLAU
$asm
Cbi portA,0
Cbi portA,1
Cbi portA,2
$end Asm
End If
W = R + G
W = W + B
If W = 3 Then
' WEISS
$asm
sbi portA,3
sbi portA,4
Sbi portA,5
$end Asm
Else
' Nicht WEISS
$asm
Cbi portA,3
Cbi portA,4
Cbi portA,5
$end Asm
End If
Incr Loopcount
Loop
' #############################################################################
' ##### Hauptschleife Ende ####################################################
' #############################################################################
' #############################################################################
Close #1
End
' #############################################################################
' ##### Magierstab v2 mit Mega32 ##############################################
' #############################################################################
' (c) 27.06.2010 by Dino
' BASCOM 2.0.7.5
'
'
' Prozessor ATmega32
$regfile = "m32def.dat"
' 16MHz Quarztakt (Baudraten-Quarz)
$crystal = 16000000
$hwstack = 64
$swstack = 64
$framesize = 64
' ATMEL AVR ATmega32
' 32kByte Flash (16kx16)
' 1kByte EEPROM
' 32 Register + 2kByte RAM
'
' ATmega32
' +-------------------------------+
' PWM rt1 ----------| 1 PB0(XCK/T0) (ADC0)PA0 40|---------- PWM bl1
' PWM rt2 ----------| 2 PB1(T1) (ADC1)PA1 39|---------- PWM bl2
' PWM gn1 ----------| 3 PB2(INT2/AIN0) (ADC2)PA2 38|---------- PWM bl3
' PWM gn2 ----------| 4 PB3(OC0/AIN1) (ADC3)PA3 37|---------- PWM ws1
' Tast0 / LCD D4 -<---------------| 5 PB4(SS) (ADC4)PA4 36|---------- PWM ws2
' Tast1 / LCD D5 -<- (ISP) MOSI --| 6 PB5(MOSI) (ADC5)PA5 35|---------- PWM ws3
' Tast2 / LCD D6 -<- (ISP) MISO --| 7 PB6(MISO) (ADC6)PA6 34|---------- Enable
' Tast3 / LCD D7 -<-- (ISP) SCK --| 8 PB7(SCK) (ADC7)PA7 33|---------- Akkuspannung
' Reset-Taster -- (ISP) RESET --| 9 RESET AREF 32|--(*)
' +Vcc --|10 VCC GND 31|-- GND
' GND --|11 GND AVCC 30|-- +Vcc (gesiebt)
' XTAL --|12 XTAL2 (TOSC2)PC7 29|
' XTAL --|13 XTAL1 (TOSC1)PC6 28|
' TastC MAX232 ||----------->-----|14 PD0(RXD) (TDI)PC5 27|
' Debug ||-----------<-----|15 PD1(TXD) (TDO)PC4 26|
' INT0-Taster ----------->-----|16 PD2(INT0) (TMS)PC3 25|
' |17 PD3(INT1) (TCK)PC2 24|
' LCD CD -----------<-----|18 PD4(OC1B) (SDA)PC1 23|----------|| 2x LM75 Temperatursensor
' LCD E -----------<-----|19 PD5(OC1A) (SCL)PC0 22|----------|| (Akku + Treiber/LEDs)
' |20 PD6(ICP1) (OC2)PD7 21|
' +-------------------------------+
' (*) 100nF nach GND
' ----- FUSES -----
'
' * SUT1 und SUT0 (Zustand=11): Start-up Time 65ms nach Reset,
' Einstellung für Quarzoszillator und langsam ansteigende
' Betriebsspannung (Tabelle 5 des Datenblattes)
' * CKSEL3-CKSEL0 (Zustand=1111): Quarzoszillator im Bereich 3-8MHz
' (Tabelle 4 des Datenblattes)
' * CKOPT (Zustand=1): schneller Quarzoszillator (Tabelle 4 des Datenblattes)
' * BODEN (Zustand=0): Brown-out einschalten
' * BODLEVEL (Zustand=1): Brown-out Schwelle auf 2,7V setzen
'
' Unter Beachtung der invertierten Logik der Fuse-Bits sollte man
' also die Fuses so setzen wie im folgenden Bild:
'
' ( )7 ( )6 [ ]BootLock12 [ ]BootLock11 [ ]BootLock02 [ ]BootLock01 [ ]Lock2 [ ]Lock1
'
' [ ]OCDEN [ ]JTAGEN (X)SPIEN [ ]CKOPT [ ]EESAVE [X]BOOTSZ1 [X]BOOTSZ0 [ ]BOOTRST
'
' [ ]BODLEVEL [X]BODEN [ ]SUT1 [ ]SUT0 [ ]CKSEL3 [ ]CKSEL2 [ ]CKSEL1 [ ]CKSEL0
' ______________________
' | |
' | [X] Bit=0 [ ] Bit=1 | ( ) -> Nicht anwaehlbar [ ] -> Anwaehlbar
' | progr. unprogr. |
' |______________________|
' #############################################################################
' ##### DEFINITION DER VARIABLEN ##############################################
' #############################################################################
'
' Byte-Variablen fuer Assembler !!!ACHTUNG!!! Als erstes definieren !!!
' Mit der String-Variable wird der lineare Speicher zur Verfuegung gestellt der dann
' ueber die Overlays einzeln als Transfer zwischen Bascom und Assembler verwendet wird.
'
Dim Asm_vars As String * 31 At $60 ' Definition ab SRAM-Start
'
Dim Pwm_ramp As Byte At $60 Overlay '01 PWM-Rampenzaehler
Dim Ramp_tmp As Byte At $61 Overlay '02 PWM-Rampenzaehler Arbeitswert
'
Dim Pwm_rt1 As Byte At $62 Overlay '03 Dimmwert Kanal Rot1
Dim Pwm_rt2 As Byte At $63 Overlay '04 Dimmwert Kanal Rot2
Dim Pwm_gn1 As Byte At $64 Overlay '05 Dimmwert Kanal Gruen1
Dim Pwm_gn2 As Byte At $65 Overlay '06 Dimmwert Kanal Gruen2
Dim Pwm_bl1 As Byte At $66 Overlay '07 Dimmwert Kanal Blau1
Dim Pwm_bl2 As Byte At $67 Overlay '08 Dimmwert Kanal Blau2
Dim Pwm_bl3 As Byte At $68 Overlay '09 Dimmwert Kanal Blau3
Dim Pwm_ws1 As Byte At $69 Overlay '10 Dimmwert Kanal Weiss1
Dim Pwm_ws2 As Byte At $6a Overlay '11 Dimmwert Kanal Weiss2
Dim Pwm_ws3 As Byte At $6b Overlay '12 Dimmwert Kanal Weiss3
'
Dim Max_rt As Byte At $6c Overlay '13 Maximalwert Kanal Rot
Dim Max_gn As Byte At $6d Overlay '14 Maximalwert Kanal Gruen
Dim Max_bl As Byte At $6e Overlay '15 Maximalwert Kanal Blau
Dim Max_ws As Byte At $6f Overlay '16 Maximalwert Kanal Weiss
Dim Xxxxxx As Byte At $70 Overlay '17 Maximalwert Kanal Weiss
'Dim xxxxxx As Byte At $71 Overlay '18 Maximalwert Kanal Weiss
'Dim xxxxxx As Byte At $72 Overlay '19 Maximalwert Kanal Weiss
'Dim xxxxxx As Byte At $73 Overlay '20 Maximalwert Kanal Weiss
'Dim xxxxxx As Byte At $74 Overlay '21 Maximalwert Kanal Weiss
'Dim xxxxxx As Byte At $75 Overlay '22 Maximalwert Kanal Weiss
'Dim xxxxxx As Byte At $76 Overlay '23 Maximalwert Kanal Weiss
'Dim xxxxxx As Byte At $77 Overlay '24 Maximalwert Kanal Weiss
'Dim xxxxxx As Byte At $78 Overlay '25 Maximalwert Kanal Weiss
'Dim xxxxxx As Byte At $79 Overlay '26 Maximalwert Kanal Weiss
'Dim xxxxxx As Byte At $7a Overlay '27 Maximalwert Kanal Weiss
'Dim xxxxxx As Byte At $7b Overlay '28 Maximalwert Kanal Weiss
'Dim xxxxxx As Byte At $7c Overlay '29 Maximalwert Kanal Weiss
'Dim xxxxxx As Byte At $7d Overlay '30 Maximalwert Kanal Weiss
'Dim xxxxxx As Byte At $7e Overlay '31 Maximalwert Kanal Weiss
Dim R As Byte
R = 0
Dim G As Byte
G = 0
Dim B As Byte
B = 0
Dim W As Byte
W = 0
Dim Pwm_r As Byte
Pwm_r = 0
Dim Pwm_g As Byte
Pwm_g = 0
Dim Pwm_b As Byte
Pwm_b = 0
Dim Pwm_w As Byte
Pwm_w = 0
' #############################################################################
' ##### DEFINITION DER PORTS ##################################################
' #############################################################################
'
' =============================================================================
' ===== PortA (digital) =======================================================
' =============================================================================
' PA0 ---->-- blau1
' PA1 ---->-- blau2
' PA2 ---->-- blau3
' PA3 ---->-- weiss1
' PA4 ---->-- weiss2
' PA5 ---->-- weiss3
' PA6 ---->-- /PWM-Enable
' PA7 ---->-- VBat-ADC
'
' A=7= O=6= O=5= O=4= O=3= O=2= O=1= O=0= => 01111111 => DDRB
' VBat PWME ws3 ws2 ws1 bl3 bl2 bl1 => 00000000 => PORTB (init)
' | | | | | | | |
'
Ddra = &B0111_1111
Porta = &B0100_0000
' =============================================================================
' ===== PortB =================================================================
' =============================================================================
' PB0 ---->-- rot1
' PB1 ---->-- rot2
' PB2 ---->-- gruen1
' PB3 ---->-- gruen2
' PB4 ---->-- (SS) ---- LCD D4
' PB5 ---->-- (MOSI) -- LCD D5
' PB6 ---->-- (MISO) -- LCD D6
' PB7 ---->-- (SCK) --- LCD D7
'
' I=7= I=6= I=5= O=4= O=3= O=2= O=1= O=0= => 11110111 => DDRB
' SCK MISO MOSI PWME gn2 gn1 rt2 rt1 => 00001000 => PORTB (init)
' | | | | | | | |
'
Ddrb = &B0001_1111
Portb = &B1110_0000
' =============================================================================
' ===== PortC (digital) =======================================================
' =============================================================================
' PC0 ---->-- SCL
' PC1 --<->-- SDA
' PC2 ---->--
' PC3 ---->--
' PC4 ---->--
' PC5 ---->--
' PC6 ---->--
' PC7 ---->-- Index ISR
'
' I=7= I=6= I=5= I=4= I=3= I=2= I=1= I=0= => 11110111 => DDRB
' ---- ---- ---- ---- ---- ---- SDA SCL => 00001000 => PORTB (init)
' | | | | | | | |
'
Ddrc = &B0000_0000
Portc = &B1111_1111
' =============================================================================
' ===== PortD =================================================================
' =============================================================================
' PD0 --<---- RxD | UART1
' PD1 ---->-- TxD | TTL-Pegel
' PD2 --<---- INT0 --- Taster
' PD3 --<---- INT1
' PD4 ---->-- LCD CD
' PD5 ---->-- LCD E
' PD6 --<----
' PD7 ---->-- Index ISR
'
' O=7= I=6= O=5= O=4= I=3= I=2= O=1= I=0= => 00001001 => DDRD
' ---- ---- LCDE LCDC INT1 INT0 TxD RxD => 11110110 => PORTD (init)
' | | | | | | | |
'
Ddrd = &B1011_0010
Portd = &B0100_1111
' =============================================================================
' ===== TIMER0 Initialisieren =================================================
' =============================================================================
' Timer0 liefert die Basiszeit (20us)
' Er läuft im Modus 2 (CTC) mit Vorteiler /8 und ohne angeschlossenem OC0-Pin
Config Timer0 = Ctc , Prescale = 8 , Clear Timer = 1 , Compare = Disconnect
On Compare0 Tim0_isr ' Interrupt-Vektor einstellen
Enable Compare0 ' Compare0-Interrupt aktivieren
'
'===== Timer/Counter Control Register =====
'Bit --7-- --6-- --5-- --4-- --3-- --2-- --1-- --0-- TCCR0
' FOC0 WGM00 COM01 COM00 WGM01 CS02 CS01 CS00
' W R/W R/W R/W R/W R/W R/W R/W
' --- --------- --- ---------------
' \ || / |||
' \ 00 Normal Port Oper. 000 No Clock (Stopped)
' \ / 001 Clk no Prescaling
' WGM00\ /WGM01 010 Clk/8
' || 011 Clk/64
' 0 00 Normal 100 Clk/256
' 1 10 PWM, Phase Correct 101 Clk/1024
' 2 01 CTC 110 Ext T0, Clock on falling edge.
' 3 11 Fast PWM 111 Ext T0, Clock on rising edge.
'
' In Clear Timer on Compare or CTC mode (WGM01:0 = 2), the OCR0 Register is used to
' manipulate the counter resolution. In CTC mode the counter is cleared to zero when
' the counter value (TCNT0) matches the OCR0. The OCR0 defines the top value for the
' counter, hence also its resolution.
' An interrupt can be generated each time the counter value reaches the TOP value by
' using the OCF0 Flag.
'
' Mode2, Prescaler /8, NormalPortOperation
' FWCC WSSS
'Tccr0 = &B0000_1010
'===== Timer/Counter Register =====
'Bit -7- -6- -5- -4- -3- -2- -1- -0- TCNT0
' -----------TCNT0[7:0]----------
' R/W R/W R/W R/W R/W R/W R/W R/W
'===== Output Compare Register =====
'Bit -7- -6- -5- -4- -3- -2- -1- -0- OCR0
' -----------OCR0[7:0]-----------
' R/W R/W R/W R/W R/W R/W R/W R/W
Ocr0 = 155 ' Compare-Wert einstellen
'===== Timer/Counter Interrupt Mask Register =====
'Bit --7-- --6-- --5--- --4--- --3--- --2-- --1-- --0-- TIMSK
' OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0 TOIE0
' R/W R/W R/W R/W R/W R/W R/W R/W
'
'OCIEx: Timer/Counter Output Compare Match Interrupt Enable
'TOIEx: Timer/Counter Overflow Interrupt Enable
'Enable Compare0
'Timsk = &B0000_0010
'===== Timer/Counter Interrupt Flag Register =====
'Bit --7-- --6-- --5-- --4-- --3-- --2-- --1-- --0-- TIFR
' OCF2 TOV2 ICF1 OCF1A OCF1B TOV1 OCF0 TOV0
' R/W R/W R/W R/W R/W R/W R/W R/W
' 200Hz PWM * 8Bit = 51,2kHz | 100Hz | 50Hz <=== das reicht und entlastet
' 1 / 51,2kHz = 19,5us | 39us | 78us den Prozessor
' Compare | |
' Prescaler Compare | Presc Comp | Presc Comp
' 8 39 | 8 77 | 8 155
' 64 4 | 64 9 | 64 19
Enable Interrupts ' Interrupts global aktivieren
Dim Loopcount As Word
Loopcount = 0
' #############################################################################
' ##### Hauptschleife Start ###################################################
' #############################################################################
Do
If Loopcount > 3000 Then
' ### Index Dimm ### Anschalten fuer LA8
' $asm
' sbi portb,2
' sbi portb,3
' $end Asm
' #################
If Pinc.7 = 0 Then ' Taste gedrueckt
If Pwm_ws1 < 255 Then ' wenn Ende nicht erreich dann hochdimmen
Incr Pwm_ws1
End If
Else ' Taste nicht gedrueckt
If Pwm_ws1 > 0 Then ' wenn Null nicht erreich dann runterdimmen
Decr Pwm_ws1
End If
End If
Pwm_rt1 = Pwm_ws1
Pwm_rt2 = Pwm_ws1
Pwm_gn1 = Pwm_ws1
Pwm_gn2 = Pwm_ws1
Pwm_ws2 = Pwm_ws1
Pwm_ws3 = Pwm_ws1
Pwm_bl1 = Pwm_ws1
Pwm_bl2 = Pwm_ws1
Pwm_bl3 = Pwm_ws1
Loopcount = 0
' ### Ende Dimm ### Ausschalten fuer LA8
' $asm
' Cbi portb,2
' Cbi portb,3
' $end Asm
' #################
End If
Incr Loopcount
Loop
' #############################################################################
' ##### Hauptschleife Ende ####################################################
' #############################################################################
' ================================================
' ===== ISR fuer Timer0 Overflow =================
' ================================================
' Timer0 ist der Impulsgeber fuer den PWM-Rampenzaehler
Tim0_isr:
' ### Index ISR ### Anschalten fuer LA8
$asm
sbi portD,7
$end Asm
' #################
Incr Pwm_ramp ' Ueberlauf vom 8Bit-Timer bearbeiten
' Startpunkt der PWM-Rampen relativ zum Masterzähler
'
' ========== PWM-Phasendiagramm ===============================
' 1 1 2 2 3 3 -H|
' 4 9 3 8 2 7 1 6 -Z|- 360°Kreis
' 0 5 0 5 0 5 0 5 0 -E|
' |.:.:.|.:.:.|.:.:.|.:.:.|.:.:.|.:.:.|.:.:.|.:.:.|
' R1 R2 R1 - 180° +0
' G1 G2 - 180° +90
' B1 B2 B3 - 120° +15
' W1 W2 W3 - 120° +75
' |.:.:.|.:.:.|.:.:.|.:.:.|.:.:.|.:.:.|.:.:.|.:.:.|
' 1 1 1 1 2 2 -H|
' 1 5 6 8 2 3 8 9 2 5 -Z|- 1Byte
' 0 1 3 4 5 8 9 1 2 4 6 -E|
'
' R1 1° = 0,71111111
' B1 15° = 10,6666 (11=15,5°)
' W1 75° = 53,3333 (53=74,5°)
' G1 90° = 64
' 120° = 85,3333 (85=119,5°)
' B2 135° = 95,9999 (96=135°)
' R2 180° = 128
' W2 195° = 138,6666 (139=195,5°)
' B3 255° = 181,3333 (181=254,5°)
' G2 270° = 192
' W3 315° = 223,9999 (224=315°)
Ramp_tmp = Pwm_ramp ' Rot-Start um 0deg verschieben
' ========== ROT 1 ==========
If Pwm_rt1 < 1 Then Goto Dim_rt1_aus ' Bei PWM=0 Ausgang abschalten
If Pwm_rt1 < Ramp_tmp Then Goto Dim_rt1_aus ' Bei PWM kleiner Rampe also Ausgang abschalten
' PWM-Wert ist gleich oder groesser Rampe also Ausgang anschalten
' WEISS
$asm
sbi portb,0
$end Asm
Goto Dim_rt1_end ' zum Ende um den Ausgang anzulassen
Dim_rt1_aus: ' Ab hier den Ausgang abschalten
' Nicht WEISS
$asm
Cbi portb,0
$end Asm
Dim_rt1_end:
Ramp_tmp = Ramp_tmp + 128 ' Eine Phase weiter (+180deg)
' ========== ROT 2 ==========
If Pwm_rt2 < 1 Then Goto Dim_rt2_aus ' Bei PWM=0 Ausgang abschalten
If Pwm_rt2 < Ramp_tmp Then Goto Dim_rt2_aus ' Bei PWM kleiner Rampe also Ausgang abschalten
' PWM-Wert ist gleich oder groesser Rampe also Ausgang anschalten
' WEISS
$asm
sbi portb,1
$end Asm
Goto Dim_rt2_end ' zum Ende um den Ausgang anzulassen
Dim_rt2_aus: ' Ab hier den Ausgang abschalten
' Nicht WEISS
$asm
Cbi portb,1
$end Asm
Dim_rt2_end:
Ramp_tmp = Pwm_ramp + 64 ' Gruen-Start um 90deg verschieben
' ========== GRUEN 1 ==========
If Pwm_gn1 < 1 Then Goto Dim_gn1_aus ' Bei PWM=0 Ausgang abschalten
If Pwm_gn1 < Ramp_tmp Then Goto Dim_gn1_aus ' Bei PWM kleiner Rampe also Ausgang abschalten
' PWM-Wert ist gleich oder groesser Rampe also Ausgang anschalten
' WEISS
$asm
sbi portb,2
$end Asm
Goto Dim_gn1_end ' zum Ende um den Ausgang anzulassen
Dim_gn1_aus: ' Ab hier den Ausgang abschalten
' Nicht WEISS
$asm
Cbi portb,2
$end Asm
Dim_gn1_end:
Ramp_tmp = Ramp_tmp + 128 ' Eine Phase weiter (+180deg)
' ========== GRUEN 2 ==========
If Pwm_gn2 < 1 Then Goto Dim_gn2_aus ' Bei PWM=0 Ausgang abschalten
If Pwm_gn2 < Ramp_tmp Then Goto Dim_gn2_aus ' Bei PWM kleiner Rampe also Ausgang abschalten
' PWM-Wert ist gleich oder groesser Rampe also Ausgang anschalten
' WEISS
$asm
sbi portb,3
$end Asm
Goto Dim_gn2_end ' zum Ende um den Ausgang anzulassen
Dim_gn2_aus: ' Ab hier den Ausgang abschalten
' Nicht WEISS
$asm
Cbi portb,3
$end Asm
Dim_gn2_end:
Ramp_tmp = Pwm_ramp + 11 ' Blau-Start um 15deg verschieben
' ========== BLAU 1 ==========
If Pwm_bl1 < 1 Then Goto Dim_bl1_aus ' Bei PWM=0 Ausgang abschalten
If Pwm_bl1 < Ramp_tmp Then Goto Dim_bl1_aus ' Bei PWM kleiner Rampe also Ausgang abschalten
' PWM-Wert ist gleich oder groesser Rampe also Ausgang anschalten
' WEISS
$asm
sbi portA,0
$end Asm
Goto Dim_bl1_end ' zum Ende um den Ausgang anzulassen
Dim_bl1_aus: ' Ab hier den Ausgang abschalten
' Nicht WEISS
$asm
Cbi portA,0
$end Asm
Dim_bl1_end:
Ramp_tmp = Ramp_tmp + 85 ' Eine Phase weiter
' ========== BLAU 2 ==========
If Pwm_bl2 < 1 Then Goto Dim_bl2_aus ' Bei PWM=0 Ausgang abschalten
If Pwm_bl2 < Ramp_tmp Then Goto Dim_bl2_aus ' Bei PWM kleiner Rampe also Ausgang abschalten
' PWM-Wert ist gleich oder groesser Rampe also Ausgang anschalten
' WEISS
$asm
sbi portA,1
$end Asm
Goto Dim_bl2_end ' zum Ende um den Ausgang anzulassen
Dim_bl2_aus: ' Ab hier den Ausgang abschalten
' Nicht WEISS
$asm
Cbi portA,1
$end Asm
Dim_bl2_end:
Ramp_tmp = Ramp_tmp + 85 ' Eine Phase weiter
' ========== BLAU 3 ==========
If Pwm_bl3 < 1 Then Goto Dim_bl3_aus ' Bei PWM=0 Ausgang abschalten
If Pwm_bl3 < Ramp_tmp Then Goto Dim_bl3_aus ' Bei PWM kleiner Rampe also Ausgang abschalten
' PWM-Wert ist gleich oder groesser Rampe also Ausgang anschalten
' WEISS
$asm
Sbi portA,2
$end Asm
Goto Dim_bl3_end ' zum Ende um den Ausgang anzulassen
Dim_bl3_aus: ' Ab hier den Ausgang abschalten
' Nicht WEISS
$asm
Cbi portA,2
$end Asm
Dim_bl3_end:
Ramp_tmp = Pwm_ramp + 53 ' Weiss-Start um 75deg verschieben
' ========== WEISS 1 ==========
If Pwm_ws1 < 1 Then Goto Dim_ws1_aus ' Bei PWM=0 Ausgang abschalten
If Pwm_ws1 < Ramp_tmp Then Goto Dim_ws1_aus ' Bei PWM kleiner Rampe also Ausgang abschalten
' PWM-Wert ist gleich oder groesser Rampe also Ausgang anschalten
' WEISS
$asm
sbi portA,3
$end Asm
Goto Dim_ws1_end ' zum Ende um den Ausgang anzulassen
Dim_ws1_aus: ' Ab hier den Ausgang abschalten
' Nicht WEISS
$asm
Cbi portA,3
$end Asm
Dim_ws1_end:
Ramp_tmp = Ramp_tmp + 85 ' Eine Phase weiter
' ========== WEISS 2 ==========
If Pwm_ws2 < 1 Then Goto Dim_ws2_aus ' Bei PWM=0 Ausgang abschalten
If Pwm_ws2 < Ramp_tmp Then Goto Dim_ws2_aus ' Bei PWM kleiner Rampe also Ausgang abschalten
' PWM-Wert ist gleich oder groesser Rampe also Ausgang anschalten
' WEISS
$asm
sbi portA,4
$end Asm
Goto Dim_ws2_end ' zum Ende um den Ausgang anzulassen
Dim_ws2_aus: ' Ab hier den Ausgang abschalten
' Nicht WEISS
$asm
Cbi portA,4
$end Asm
Dim_ws2_end:
Ramp_tmp = Ramp_tmp + 85 ' Eine Phase weiter
' ========== WEISS 3 ==========
If Pwm_ws3 < 1 Then Goto Dim_ws3_aus ' Bei PWM=0 Ausgang abschalten
If Pwm_ws3 < Ramp_tmp Then Goto Dim_ws3_aus ' Bei PWM kleiner Rampe also Ausgang abschalten
' PWM-Wert ist gleich oder groesser Rampe also Ausgang anschalten
' WEISS
$asm
Sbi portA,5
$end Asm
Goto Dim_ws3_end ' zum Ende um den Ausgang anzulassen
Dim_ws3_aus: ' Ab hier den Ausgang abschalten
' Nicht WEISS
$asm
Cbi portA,5
$end Asm
Dim_ws3_end:
' ### Ende ISR ### Ausschalten fuer LA8
$asm
Cbi portD,7
$end Asm
' #################
Return
' #############################################################################
End
DIM name AS typ AT adresse ist Dir sicherlich bereits ein Begriff?...Die Stringvariable MUSS als allererste deklariert werden damit sie ganz am Anfang des SRAM liegt und nichts dazwischenkommen kann. Bascom würde sie sonst eventuell trotzdem verschieben und dann passen die verwendeten Speicherstellen nicht mehr...
' #############################################################################
' ##### Magierstab v2 mit Mega32 ##############################################
' #############################################################################
' (c) 27.06.2010 by Dino
' BASCOM 2.0.7.5
'
'
' Prozessor ATmega32
$regfile = "m32def.dat"
' 16MHz Quarztakt (Baudraten-Quarz)
$crystal = 16000000
$hwstack = 64
$swstack = 64
$framesize = 64
' ATMEL AVR ATmega32
' 32kByte Flash (16kx16)
' 1kByte EEPROM
' 32 Register + 2kByte RAM
'
' ATmega32
' +-------------------------------+
' PWM rt1 ----------| 1 PB0(XCK/T0) (ADC0)PA0 40|---------- PWM bl1
' PWM rt2 ----------| 2 PB1(T1) (ADC1)PA1 39|---------- PWM bl2
' PWM gn1 ----------| 3 PB2(INT2/AIN0) (ADC2)PA2 38|---------- PWM bl3
' PWM gn2 ----------| 4 PB3(OC0/AIN1) (ADC3)PA3 37|---------- PWM ws1
' Tast0 / LCD D4 -<---------------| 5 PB4(SS) (ADC4)PA4 36|---------- PWM ws2
' Tast1 / LCD D5 -<- (ISP) MOSI --| 6 PB5(MOSI) (ADC5)PA5 35|---------- PWM ws3
' Tast2 / LCD D6 -<- (ISP) MISO --| 7 PB6(MISO) (ADC6)PA6 34|
' Tast3 / LCD D7 -<-- (ISP) SCK --| 8 PB7(SCK) (ADC7)PA7 33|---------- Akkuspannung
' Reset-Taster -- (ISP) RESET --| 9 RESET AREF 32|--(*)
' +Vcc --|10 VCC GND 31|-- GND
' GND --|11 GND AVCC 30|-- +Vcc (gesiebt)
' XTAL --|12 XTAL2 (TOSC2)PC7 29|
' XTAL --|13 XTAL1 (TOSC1)PC6 28|
' TastC MAX232 ||----------->-----|14 PD0(RXD) (TDI)PC5 27|
' Debug ||-----------<-----|15 PD1(TXD) (TDO)PC4 26|
' INT0-Taster ----------->-----|16 PD2(INT0) (TMS)PC3 25|
' |17 PD3(INT1) (TCK)PC2 24|---------- /PWM-Enable
' LCD CD -----------<-----|18 PD4(OC1B) (SDA)PC1 23|----------|| 2x LM75 Temperatursensor
' LCD EX -----------<-----|19 PD5(OC1A) (SCL)PC0 22|----------|| (Akku + Treiber/LEDs)
' |20 PD6(ICP1) (OC2)PD7 21|---- ISR-Index fuer LA8
' +-------------------------------+
' (*) 100nF nach GND
'
'
' ===== Kabel 1,27mm Raster ===== ===== Kabel 2,54mm Raster =====
' 1 sw --- ISP1 (MISO) -- LCD D6 (7) 1 |sw -- ISP6 (GND) -- Schirm -- GND
' 2 bn --- ISP3 (SCK) --- LCD D7 (8) 2 |sw
' 3 rt --- ISP4 (MOSI) -- LCD D5 (6) 3 ge --- ISP2 (VTG) ------------ Vcc/+5V
' 4 rs --- ISP5 (RES) --- Reset (9) Tast 4 |or
' 5 ge ------------------ LCD D4 (5) 5 |or -------------------------- VBat
' 6 gn ------------------ LCD CD (18)
' 7 bl ------------------ LCD EX (19)
' 8 vi ------------------ INT0 (16) Tast
' 9 gr ------------------ RxD (14)
' 10 ws ------------------ TxD (15)
'
' ----- FUSES -----
'
' * SUT1 und SUT0 (Zustand=11): Start-up Time 65ms nach Reset,
' Einstellung für Quarzoszillator und langsam ansteigende
' Betriebsspannung (Tabelle 5 des Datenblattes)
' * CKSEL3-CKSEL0 (Zustand=1111): Quarzoszillator im Bereich 3-8MHz
' (Tabelle 4 des Datenblattes)
' * CKOPT (Zustand=1): schneller Quarzoszillator (Tabelle 4 des Datenblattes)
' * BODEN (Zustand=0): Brown-out einschalten
' * BODLEVEL (Zustand=1): Brown-out Schwelle auf 2,7V setzen
'
' Unter Beachtung der invertierten Logik der Fuse-Bits sollte man
' also die Fuses so setzen wie im folgenden Bild:
'
' ( )7 ( )6 [ ]BootLock12 [ ]BootLock11 [ ]BootLock02 [ ]BootLock01 [ ]Lock2 [ ]Lock1
'
' [ ]OCDEN [ ]JTAGEN (X)SPIEN [ ]CKOPT [ ]EESAVE [X]BOOTSZ1 [X]BOOTSZ0 [ ]BOOTRST
'
' [ ]BODLEVEL [X]BODEN [ ]SUT1 [ ]SUT0 [ ]CKSEL3 [ ]CKSEL2 [ ]CKSEL1 [ ]CKSEL0
' ______________________
' | |
' | [X] Bit=0 [ ] Bit=1 | ( ) -> Nicht anwaehlbar [ ] -> Anwaehlbar
' | progr. unprogr. |
' |______________________|
' #############################################################################
' ##### DEFINITION DER VARIABLEN ##############################################
' #############################################################################
'
' Byte-Variablen fuer Assembler !!!ACHTUNG!!! Als erstes definieren !!!
' Mit der String-Variable wird der lineare Speicher zur Verfuegung gestellt der dann
' ueber die Overlays einzeln als Transfer zwischen Bascom und Assembler verwendet wird.
'
Dim Asm_vars As String * 31 At $60 ' Definition ab SRAM-Start
'
Dim Pwm_ramp As Byte At $60 Overlay '01 PWM-Rampenzaehler
Dim Ramp_tmp As Byte At $61 Overlay '02 PWM-Rampenzaehler Arbeitswert
'
Dim Pwm_rt1 As Byte At $62 Overlay '03 Dimmwert Kanal Rot1
Dim Pwm_rt2 As Byte At $63 Overlay '04 Dimmwert Kanal Rot2
Dim Pwm_gn1 As Byte At $64 Overlay '05 Dimmwert Kanal Gruen1
Dim Pwm_gn2 As Byte At $65 Overlay '06 Dimmwert Kanal Gruen2
Dim Pwm_bl1 As Byte At $66 Overlay '07 Dimmwert Kanal Blau1
Dim Pwm_bl2 As Byte At $67 Overlay '08 Dimmwert Kanal Blau2
Dim Pwm_bl3 As Byte At $68 Overlay '09 Dimmwert Kanal Blau3
Dim Pwm_ws1 As Byte At $69 Overlay '10 Dimmwert Kanal Weiss1
Dim Pwm_ws2 As Byte At $6a Overlay '11 Dimmwert Kanal Weiss2
Dim Pwm_ws3 As Byte At $6b Overlay '12 Dimmwert Kanal Weiss3
'
Dim Max_rt As Byte At $6c Overlay '13 Maximalwert Kanal Rot
Dim Max_gn As Byte At $6d Overlay '14 Maximalwert Kanal Gruen
Dim Max_bl As Byte At $6e Overlay '15 Maximalwert Kanal Blau
Dim Max_ws As Byte At $6f Overlay '16 Maximalwert Kanal Weiss
'Dim Xxxxxx As Byte At $70 Overlay '17 Maximalwert Kanal Weiss
'Dim xxxxxx As Byte At $71 Overlay '18 Maximalwert Kanal Weiss
'Dim xxxxxx As Byte At $72 Overlay '19 Maximalwert Kanal Weiss
'Dim xxxxxx As Byte At $73 Overlay '20 Maximalwert Kanal Weiss
'Dim xxxxxx As Byte At $74 Overlay '21 Maximalwert Kanal Weiss
'Dim xxxxxx As Byte At $75 Overlay '22 Maximalwert Kanal Weiss
'Dim xxxxxx As Byte At $76 Overlay '23 Maximalwert Kanal Weiss
'Dim xxxxxx As Byte At $77 Overlay '24 Maximalwert Kanal Weiss
'Dim xxxxxx As Byte At $78 Overlay '25 Maximalwert Kanal Weiss
'Dim xxxxxx As Byte At $79 Overlay '26 Maximalwert Kanal Weiss
'Dim xxxxxx As Byte At $7a Overlay '27 Maximalwert Kanal Weiss
'Dim xxxxxx As Byte At $7b Overlay '28 Maximalwert Kanal Weiss
'Dim xxxxxx As Byte At $7c Overlay '29 Maximalwert Kanal Weiss
'Dim xxxxxx As Byte At $7d Overlay '30 Maximalwert Kanal Weiss
'Dim xxxxxx As Byte At $7e Overlay '31 Maximalwert Kanal Weiss
'Dim R As Byte
'R = 0
'Dim G As Byte
'G = 0
'Dim B As Byte
'B = 0
'Dim W As Byte
'W = 0
'Dim Pwm_r As Byte
'Pwm_r = 0
'Dim Pwm_g As Byte
'Pwm_g = 0
'Dim Pwm_b As Byte
'Pwm_b = 0
'Dim Pwm_w As Byte
'Pwm_w = 0
' #############################################################################
' ##### DEFINITION DER PORTS ##################################################
' #############################################################################
'
' =============================================================================
' ===== PortA (digital) =======================================================
' =============================================================================
' PA0 ---->-- blau1
' PA1 ---->-- blau2
' PA2 ---->-- blau3
' PA3 ---->-- weiss1
' PA4 ---->-- weiss2
' PA5 ---->-- weiss3
' PA6 -------
' PA7 ------- VBat-ADC
'
' A=7= A=6= O=5= O=4= O=3= O=2= O=1= O=0= => 01111111 => DDRB
' VBat ---- ws3 ws2 ws1 bl3 bl2 bl1 => 00000000 => PORTB (init)
' | | | | | | | |
'
Ddra = &B0011_1111
Porta = &B0100_0000
' =============================================================================
' ===== PortB =================================================================
' =============================================================================
' PB0 ---->-- rot1
' PB1 ---->-- rot2
' PB2 ---->-- gruen1
' PB3 ---->-- gruen2
' PB4 ---->-- (SS) ---- LCD D4
' PB5 ---->-- (MOSI) -- LCD D5
' PB6 ---->-- (MISO) -- LCD D6
' PB7 ---->-- (SCK) --- LCD D7
'
' O=7= O=6= O=5= O=4= O=3= O=2= O=1= O=0= => 11110111 => DDRB
' SCK MISO MOSI SS gn2 gn1 rt2 rt1 => 00001000 => PORTB (init)
' | | | | | | | |
'
Ddrb = &B1111_1111
Portb = &B1110_0000
' =============================================================================
' ===== PortC (digital) =======================================================
' =============================================================================
' PC0 ---->-- SCL
' PC1 --<->-- SDA
' PC2 ---->-- /PWM-Enable
' PC3 ---->--
' PC4 ---->--
' PC5 ---->--
' PC6 ---->--
' PC7 ---->--
'
' I=7= I=6= I=5= I=4= I=3= O=2= I=1= I=0= => 11110111 => DDRB
' ---- ---- ---- ---- ---- PWME SDA SCL => 00001000 => PORTB (init)
' | | | | | | | |
'
Ddrc = &B0000_0100
Portc = &B1111_1111
' =============================================================================
' ===== PortD =================================================================
' =============================================================================
' PD0 --<---- RxD | UART1
' PD1 ---->-- TxD | TTL-Pegel
' PD2 --<---- INT0 --- Taster
' PD3 --<---- INT1
' PD4 ---->-- LCD CD
' PD5 ---->-- LCD EX
' PD6 --<----
' PD7 ---->-- Index ISR
'
' O=7= I=6= O=5= O=4= I=3= I=2= O=1= I=0= => 00001001 => DDRD
' ISRx ---- LCDE LCDC INT1 INT0 TxD RxD => 11110110 => PORTD (init)
' | | | | | | | |
'
Ddrd = &B1011_0010
Portd = &B0100_1111
' =============================================================================
' ===== I2C/TWI initialisieren ================================================
' =============================================================================
$lib "i2c_twi.lbx" ' Bibliothek fuer Hardware-TWI einbinden
Config Scl = Portc.0
Config Sda = Portc.1
I2cinit
Config Twi = 300000 ' Taktfrequenz 300 kBit/s
' TWI gleich einschalten, das macht BASCOM ansonsten erst beim I2CStart
'Twcr = &B00000100 ' nur TWEN setzen
' Optionale Einstellungen für TWI Kommunikation die nicht zwingend erforderliche sind
' Twsr = 0 ' Status und Prescaler Register
' Twbr = 152 ' Bit Rate Register, 72 = 100kHz 152 = 50kHz(0 bis 255)
' Config I2cdelay = 40
I2cstart
I2cstop
' =============================================================================
' ===== UART1 (TTL) initialisieren ============================================
' =============================================================================
Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Serialin = Buffered , Size = 8
Open "com1:" For Binary As #1
' =============================================================================
' ===== LCD initialisieren ====================================================
' =============================================================================
Config Lcd = 16 * 4
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portd.5 , Rs = Portd.4
' Config Lcdbus = 4
Initlcd
Cursor Off
Cls
' =============================================================================
' ===== TIMER0 Initialisieren =================================================
' =============================================================================
' Timer0 liefert die Basiszeit (20us)
' Er läuft im Modus 2 (CTC) mit Vorteiler /8 und ohne angeschlossenem OC0-Pin
Config Timer0 = Ctc , Prescale = 8 , Clear Timer = 1 , Compare = Disconnect
On Compare0 Tim0_isr ' Interrupt-Vektor einstellen
Enable Compare0 ' Compare0-Interrupt aktivieren
'
'===== Timer/Counter Control Register =====
'Bit --7-- --6-- --5-- --4-- --3-- --2-- --1-- --0-- TCCR0
' FOC0 WGM00 COM01 COM00 WGM01 CS02 CS01 CS00
' W R/W R/W R/W R/W R/W R/W R/W
' --- --------- --- ---------------
' \ || / |||
' \ 00 Normal Port Oper. 000 No Clock (Stopped)
' \ / 001 Clk no Prescaling
' WGM00\ /WGM01 010 Clk/8
' || 011 Clk/64
' 0 00 Normal 100 Clk/256
' 1 10 PWM, Phase Correct 101 Clk/1024
' 2 01 CTC 110 Ext T0, Clock on falling edge.
' 3 11 Fast PWM 111 Ext T0, Clock on rising edge.
'
' In Clear Timer on Compare or CTC mode (WGM01:0 = 2), the OCR0 Register is used to
' manipulate the counter resolution. In CTC mode the counter is cleared to zero when
' the counter value (TCNT0) matches the OCR0. The OCR0 defines the top value for the
' counter, hence also its resolution.
' An interrupt can be generated each time the counter value reaches the TOP value by
' using the OCF0 Flag.
'
' Mode2, Prescaler /8, NormalPortOperation
' FWCC WSSS
'Tccr0 = &B0000_1010
'===== Timer/Counter Register =====
'Bit -7- -6- -5- -4- -3- -2- -1- -0- TCNT0
' -----------TCNT0[7:0]----------
' R/W R/W R/W R/W R/W R/W R/W R/W
'===== Output Compare Register =====
'Bit -7- -6- -5- -4- -3- -2- -1- -0- OCR0
' -----------OCR0[7:0]-----------
' R/W R/W R/W R/W R/W R/W R/W R/W
Ocr0 = 155 ' Compare-Wert einstellen
'===== Timer/Counter Interrupt Mask Register =====
'Bit --7-- --6-- --5--- --4--- --3--- --2-- --1-- --0-- TIMSK
' OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0 TOIE0
' R/W R/W R/W R/W R/W R/W R/W R/W
'
'OCIEx: Timer/Counter Output Compare Match Interrupt Enable
'TOIEx: Timer/Counter Overflow Interrupt Enable
'Enable Compare0
'Timsk = &B0000_0010
'===== Timer/Counter Interrupt Flag Register =====
'Bit --7-- --6-- --5-- --4-- --3-- --2-- --1-- --0-- TIFR
' OCF2 TOV2 ICF1 OCF1A OCF1B TOV1 OCF0 TOV0
' R/W R/W R/W R/W R/W R/W R/W R/W
' 200Hz PWM * 8Bit = 51,2kHz | 100Hz | 50Hz <=== das reicht und entlastet
' 1 / 51,2kHz = 19,5us | 39us | 78us den Prozessor
' Compare | |
' Prescaler Compare | Presc Comp | Presc Comp
' 8 39 | 8 77 | 8 155
' 64 4 | 64 9 | 64 19
Enable Interrupts ' Interrupts global aktivieren
Dim Loopcount As Word
Loopcount = 0
' #############################################################################
' ##### Hauptschleife Start ###################################################
' #############################################################################
Do
If Loopcount > 3000 Then
' ### Index Dimm ### Anschalten fuer LA8
' $asm
' sbi portb,2
' sbi portb,3
' $end Asm
' #################
If Pinc.4 = 0 Then ' Taste gedrueckt
If Pwm_rt1 < 255 Then ' wenn Ende nicht erreich dann hochdimmen
Incr Pwm_rt1
End If
Else ' Taste nicht gedrueckt
If Pwm_rt1 > 0 Then ' wenn Null nicht erreich dann runterdimmen
Decr Pwm_rt1
End If
End If
Pwm_rt2 = Pwm_rt1
If Pinc.5 = 0 Then ' Taste gedrueckt
If Pwm_gn1 < 255 Then ' wenn Ende nicht erreich dann hochdimmen
Incr Pwm_gn1
End If
Else ' Taste nicht gedrueckt
If Pwm_gn1 > 0 Then ' wenn Null nicht erreich dann runterdimmen
Decr Pwm_gn1
End If
End If
Pwm_gn2 = Pwm_gn1
If Pinc.6 = 0 Then ' Taste gedrueckt
If Pwm_bl1 < 255 Then ' wenn Ende nicht erreich dann hochdimmen
Incr Pwm_bl1
End If
Else ' Taste nicht gedrueckt
If Pwm_bl1 > 0 Then ' wenn Null nicht erreich dann runterdimmen
Decr Pwm_bl1
End If
End If
Pwm_bl2 = Pwm_bl1
Pwm_bl3 = Pwm_bl1
If Pinc.7 = 0 Then ' Taste gedrueckt
If Pwm_ws1 < 255 Then ' wenn Ende nicht erreich dann hochdimmen
Incr Pwm_ws1
End If
Else ' Taste nicht gedrueckt
If Pwm_ws1 > 0 Then ' wenn Null nicht erreich dann runterdimmen
Decr Pwm_ws1
End If
End If
' Pwm_rt1 = Pwm_ws1
' Pwm_gn1 = Pwm_ws1
' Pwm_bl1 = Pwm_ws1
Pwm_ws2 = Pwm_ws1
Pwm_ws3 = Pwm_ws1
Loopcount = 0
' ### Ende Dimm ### Ausschalten fuer LA8
' $asm
' Cbi portb,2
' Cbi portb,3
' $end Asm
' #################
End If
Incr Loopcount
Loop
' #############################################################################
' ##### Hauptschleife Ende ####################################################
' #############################################################################
' Hier die Timer0-ISR für SoftPWM einfuegen !!!
' #############################################################################
End
' ================================================
' ===== ISR fuer Timer0 Overflow =================
' ================================================
' Timer0 ist der Impulsgeber fuer den PWM-Rampenzaehler
' Compare-Match vom 8Bit-Timer bearbeiten
' Diese Routine wird noch von Bascom in Assembler umgesetzt.
Tim0_isr:
' ### Index ISR ### Anschalten fuer LA8
$asm
sbi portD,7
$end Asm
' #################
Incr Pwm_ramp ' PWM-Rampenzaehler um eins erhoehen
' Startpunkt der PWM-Rampen relativ zum Masterzähler
'
' ========== PWM-Phasendiagramm ===============================
' 1 1 2 2 3 3 -H|
' 4 9 3 8 2 7 1 6 -Z|- 360°Kreis
' 0 5 0 5 0 5 0 5 0 -E|
' |.:.:.|.:.:.|.:.:.|.:.:.|.:.:.|.:.:.|.:.:.|.:.:.|
' R1 R2 R1 - 180° +0
' G1 G2 - 180° +90
' B1 B2 B3 - 120° +15
' W1 W2 W3 - 120° +75
' |.:.:.|.:.:.|.:.:.|.:.:.|.:.:.|.:.:.|.:.:.|.:.:.|
' 1 1 1 1 2 2 -H|
' 1 5 6 8 2 3 8 9 2 5 -Z|- 1Byte
' 0 1 3 4 5 8 9 1 2 4 6 -E|
'
' R1 1° = 0,71111111
' B1 15° = 10,6666 (11=15,5°)
' W1 75° = 53,3333 (53=74,5°)
' G1 90° = 64
' 120° = 85,3333 (85=119,5°)
' B2 135° = 95,9999 (96=135°)
' R2 180° = 128
' W2 195° = 138,6666 (139=195,5°)
' B3 255° = 181,3333 (181=254,5°)
' G2 270° = 192
' W3 315° = 223,9999 (224=315°)
Ramp_tmp = Pwm_ramp ' Rot-Start um 0deg verschieben
' ========== ROT 1 ==========
If Pwm_rt1 < 1 Then Goto Dim_rt1_aus ' Bei PWM=0 Ausgang abschalten
If Pwm_rt1 < Ramp_tmp Then Goto Dim_rt1_aus ' Bei PWM kleiner Rampe also Ausgang abschalten
' PWM-Wert ist gleich oder groesser Rampe also Ausgang anschalten
' WEISS
$asm
sbi portb,0
$end Asm
Goto Dim_rt1_end ' zum Ende um den Ausgang anzulassen
Dim_rt1_aus: ' Ab hier den Ausgang abschalten
' Nicht WEISS
$asm
Cbi portb,0
$end Asm
Dim_rt1_end:
Ramp_tmp = Ramp_tmp + 128 ' Eine Phase weiter (+180deg)
' ========== ROT 2 ==========
If Pwm_rt2 < 1 Then Goto Dim_rt2_aus ' Bei PWM=0 Ausgang abschalten
If Pwm_rt2 < Ramp_tmp Then Goto Dim_rt2_aus ' Bei PWM kleiner Rampe also Ausgang abschalten
' PWM-Wert ist gleich oder groesser Rampe also Ausgang anschalten
' WEISS
$asm
sbi portb,1
$end Asm
Goto Dim_rt2_end ' zum Ende um den Ausgang anzulassen
Dim_rt2_aus: ' Ab hier den Ausgang abschalten
' Nicht WEISS
$asm
Cbi portb,1
$end Asm
Dim_rt2_end:
Ramp_tmp = Pwm_ramp + 64 ' Gruen-Start um 90deg verschieben
' ========== GRUEN 1 ==========
If Pwm_gn1 < 1 Then Goto Dim_gn1_aus ' Bei PWM=0 Ausgang abschalten
If Pwm_gn1 < Ramp_tmp Then Goto Dim_gn1_aus ' Bei PWM kleiner Rampe also Ausgang abschalten
' PWM-Wert ist gleich oder groesser Rampe also Ausgang anschalten
' WEISS
$asm
sbi portb,2
$end Asm
Goto Dim_gn1_end ' zum Ende um den Ausgang anzulassen
Dim_gn1_aus: ' Ab hier den Ausgang abschalten
' Nicht WEISS
$asm
Cbi portb,2
$end Asm
Dim_gn1_end:
Ramp_tmp = Ramp_tmp + 128 ' Eine Phase weiter (+180deg)
' ========== GRUEN 2 ==========
If Pwm_gn2 < 1 Then Goto Dim_gn2_aus ' Bei PWM=0 Ausgang abschalten
If Pwm_gn2 < Ramp_tmp Then Goto Dim_gn2_aus ' Bei PWM kleiner Rampe also Ausgang abschalten
' PWM-Wert ist gleich oder groesser Rampe also Ausgang anschalten
' WEISS
$asm
sbi portb,3
$end Asm
Goto Dim_gn2_end ' zum Ende um den Ausgang anzulassen
Dim_gn2_aus: ' Ab hier den Ausgang abschalten
' Nicht WEISS
$asm
Cbi portb,3
$end Asm
Dim_gn2_end:
Ramp_tmp = Pwm_ramp + 11 ' Blau-Start um 15deg verschieben
' ========== BLAU 1 ==========
If Pwm_bl1 < 1 Then Goto Dim_bl1_aus ' Bei PWM=0 Ausgang abschalten
If Pwm_bl1 < Ramp_tmp Then Goto Dim_bl1_aus ' Bei PWM kleiner Rampe also Ausgang abschalten
' PWM-Wert ist gleich oder groesser Rampe also Ausgang anschalten
' WEISS
$asm
sbi portA,0
$end Asm
Goto Dim_bl1_end ' zum Ende um den Ausgang anzulassen
Dim_bl1_aus: ' Ab hier den Ausgang abschalten
' Nicht WEISS
$asm
Cbi portA,0
$end Asm
Dim_bl1_end:
Ramp_tmp = Ramp_tmp + 85 ' Eine Phase weiter
' ========== BLAU 2 ==========
If Pwm_bl2 < 1 Then Goto Dim_bl2_aus ' Bei PWM=0 Ausgang abschalten
If Pwm_bl2 < Ramp_tmp Then Goto Dim_bl2_aus ' Bei PWM kleiner Rampe also Ausgang abschalten
' PWM-Wert ist gleich oder groesser Rampe also Ausgang anschalten
' WEISS
$asm
sbi portA,1
$end Asm
Goto Dim_bl2_end ' zum Ende um den Ausgang anzulassen
Dim_bl2_aus: ' Ab hier den Ausgang abschalten
' Nicht WEISS
$asm
Cbi portA,1
$end Asm
Dim_bl2_end:
Ramp_tmp = Ramp_tmp + 85 ' Eine Phase weiter
' ========== BLAU 3 ==========
If Pwm_bl3 < 1 Then Goto Dim_bl3_aus ' Bei PWM=0 Ausgang abschalten
If Pwm_bl3 < Ramp_tmp Then Goto Dim_bl3_aus ' Bei PWM kleiner Rampe also Ausgang abschalten
' PWM-Wert ist gleich oder groesser Rampe also Ausgang anschalten
' WEISS
$asm
Sbi portA,2
$end Asm
Goto Dim_bl3_end ' zum Ende um den Ausgang anzulassen
Dim_bl3_aus: ' Ab hier den Ausgang abschalten
' Nicht WEISS
$asm
Cbi portA,2
$end Asm
Dim_bl3_end:
Ramp_tmp = Pwm_ramp + 53 ' Weiss-Start um 75deg verschieben
' ========== WEISS 1 ==========
If Pwm_ws1 < 1 Then Goto Dim_ws1_aus ' Bei PWM=0 Ausgang abschalten
If Pwm_ws1 < Ramp_tmp Then Goto Dim_ws1_aus ' Bei PWM kleiner Rampe also Ausgang abschalten
' PWM-Wert ist gleich oder groesser Rampe also Ausgang anschalten
' WEISS
$asm
sbi portA,3
$end Asm
Goto Dim_ws1_end ' zum Ende um den Ausgang anzulassen
Dim_ws1_aus: ' Ab hier den Ausgang abschalten
' Nicht WEISS
$asm
Cbi portA,3
$end Asm
Dim_ws1_end:
Ramp_tmp = Ramp_tmp + 85 ' Eine Phase weiter
' ========== WEISS 2 ==========
If Pwm_ws2 < 1 Then Goto Dim_ws2_aus ' Bei PWM=0 Ausgang abschalten
If Pwm_ws2 < Ramp_tmp Then Goto Dim_ws2_aus ' Bei PWM kleiner Rampe also Ausgang abschalten
' PWM-Wert ist gleich oder groesser Rampe also Ausgang anschalten
' WEISS
$asm
sbi portA,4
$end Asm
Goto Dim_ws2_end ' zum Ende um den Ausgang anzulassen
Dim_ws2_aus: ' Ab hier den Ausgang abschalten
' Nicht WEISS
$asm
Cbi portA,4
$end Asm
Dim_ws2_end:
Ramp_tmp = Ramp_tmp + 85 ' Eine Phase weiter
' ========== WEISS 3 ==========
If Pwm_ws3 < 1 Then Goto Dim_ws3_aus ' Bei PWM=0 Ausgang abschalten
If Pwm_ws3 < Ramp_tmp Then Goto Dim_ws3_aus ' Bei PWM kleiner Rampe also Ausgang abschalten
' PWM-Wert ist gleich oder groesser Rampe also Ausgang anschalten
' WEISS
$asm
Sbi portA,5
$end Asm
Goto Dim_ws3_end ' zum Ende um den Ausgang anzulassen
Dim_ws3_aus: ' Ab hier den Ausgang abschalten
' Nicht WEISS
$asm
Cbi portA,5
$end Asm
Dim_ws3_end:
' ### Ende ISR ### Ausschalten fuer LA8
$asm
Cbi portD,7
$end Asm
' #################
Return