PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dimmer mit mehreren Kanälen - flackert im Sekundentakt



TobiasBlome
30.07.2011, 18:17
Hallo,
bisher habe ich nur Dimmer für eine Lampe gefunden und mit dem Wait-Befehl programmiert.

Ich benötige aber 16 Kanäle, die ich unabhängig von einander regeln kann.

Das Programm ist nun fertig, aber manchmal blinkt die Lampe(habe erst einen Ausgang drann) d.h. mal wird sie heller als der Sollwert und mal dunkler als der Sollwert - aber nur so als auf blitzen(fast im Sekundentakt). Wenn ich den Timer0 deaktiviere, dann ist das blinken weg!
Zurzeit nutze ich den Timer nur für Ausgaben - aber woran liegt das?

Tobias



'Empfänger für 16 Kanal Dimmer

' V1:
'-

'-------------------------------------------------------------------------------
'Konfiguration µC:
$regfile = "m644def.dat" 'AT-Mega32
$crystal = 18432000 'Quarz:
$baud = 57600 '76800 '38400 'Baudrate definieren
$hwstack = 64 ' default use 32 for the hardware stack
$swstack = 64 ' default use 10 for the SW stack
$framesize = 64

'-------------------------------------------------------------------------------
'Ein- Ausgänge:



Ddra = &B11111111 '1 Ausgang, 0 Eingang
Ddrb = &B00000000 '1 Ausgang, 0 Eingang
Ddrc = &B11111111 '1 Ausgang, 0 Eingang => Pin PC7-0 als Ausgang
Ddrd = &B00000000 '1 Ausgang, 0 Eingang

'PullUP
Portd.2 = 1 'Eingang für Nulldurchgangerkennung



'-------------------------------------------------------------------------------
'8Bit Timer:
Config Timer0 = Timer , Prescale = 1024
On Timer0 Timer0_irq
Const Timervorgabe0 = 31 '80x/sec Bei 18 , 432Mhz
Timer0 = Timervorgabe0
Enable Timer0
Enable Interrupts

'16Bit Timer:
Config Timer1 = Timer , Prescale = 1024
On Timer1 Timer1_irq
Const Timervorgabe1 = 0
Timer1 = Timervorgabe1
Enable Timer1
Enable Interrupts

Config Int0 = Rising ' INT0 so konfiguriert das Trigger bei steigender Flanke
On Int0 Dimmer_null_irq ' Springe zur Interrupt-Routine Dimmer_null_irq
Enable Int0 ' Interrupt0 freigeben
Enable Interrupts
'-------------------------------------------------------------------------------
'Variablen:
'-------------------------------------------------------------------------------

Dim X As Byte
Dim X1 As Byte
Dim T0 As Byte 'Für Timer0
Dim Null As Byte
'Config Watchdog = 1024 '2048 'Timeout = 2 Sekunden
'Start Watchdog
'-------------------------------------------------------------------------------


'================================================= ==============================
'================================================= ==============================
'Hauptprogramm Do...Loop
'================================================= ==============================
'================================================= ==============================
Print "Programmstart"


Do
X = 50 'Helligkeitswert (von 0 - 160)
X1 = 160 - X


'_________________________________________________
'DIMMEN:
If Timer1 > X1 Then
Set Porta.0
Else
Reset Porta.0
End If


'timer1 = 160 max!!!



Loop

End



'################################################# ##############################
'################################################# ##############################
'Interrupt Sub Routine - I.S.R
'################################################# ##############################
'################################################# ##############################

Dimmer_null_irq: 'Nulldurchgangserkennung
Timer1 = 0
Incr Null
Return



'################################################# ##############################
Timer0_irq:
Timer0 = Timervorgabe0
Incr T0

If T0 = 80 Then 'jede Sekunde
T0 = 0
Print "Timer0: " ; Timer0 ; " Null: " ; Null
Null = 0
End If

Return

'################################################# ##############################
Timer1_irq:
Print "FEHLER Timer1 ist übergelaufen!!!"
Return

peterfido
30.07.2011, 23:56
In eine ISR gehört kein Print. Das kann länger dauern, als die Zeit zwischen 2 IRQ. Da wird am besten nur eine Statusvariable gesetzt und diese wird in der Hauptschleife oder einer davon aufgerufenen Sub abgefragt und dementsprechend gehandelt.

TobiasBlome
31.07.2011, 14:02
ja danke - der Printbefehl!