Hallo,
ich lese einen AD Wandler aus, lasse das Ergebniss im Display anzeigen
und Dimme die Displaybeleuchtung per PWM.
Beim Mega 8 funktoniert es problemlos.
Beim Mega 16 ändert sich der Wert des AD Wandlers abh. von der
Displayhelligkeit!?
Woran kann das liegen, ich habe keine Idee mehr.
Schon mal Danke für Eure Vorschläge,
Dani
So, hier also der Komplette Bascom Code.
Bei ocr2=254 wird 0 angezeigt
Bei ocr2=20 wird 12 angezeigt
Woran kann das liegen?
'
------------------------------------------------------------------------
-----
' Definition des verwendeten Kontrollers + Taktfrequenz
$regfile = "m16def.dat" 'ATmega16
$crystal = 1000000 'Quarz: 1
MHz
'
------------------------------------------------------------------------
-----
' Definition des AD Wandlers
$hwstack = 32
$swstack = 10
$framesize = 40
Config Adc = Single , Prescaler = Auto , Reference = Internal
Start Adc
'
------------------------------------------------------------------------
-----
' Definition Timer 0 als Timer
On Timer1 Pulse
Config Timer1 = Timer , Prescale = 8
'Timer1,125kHz
Enable Interrupts
Enable Timer1
' Pulse wird jede ms aufgerufen
Timer1 = 65411 '1Mhz
' Definition Timer 2 als PWM (Helligkeit des Displays)
Config Timer2 = Pwm , Pwm = On , Compare Pwm = Clear Up , Prescale = 1
Enable Interrupts
Enable Timer2
'
------------------------------------------------------------------------
-----
' Definition der benötigten Variablen
Dim Z As Integer
Dim W As Byte
Dim X As Single
Dim T1 As Integer
Dim Licht As Bit
'
------------------------------------------------------------------------
-----
' Definition der Ein- und Ausgänge
' Konfiguration Port-a, 8 Bit, Eingänge mit int. PullUp
Porta = &B11111111
Ddra = &B00000001
Portb = &B11111111
Ddrb = &B11111111
Portc = &B11111111
Ddrc = &B00000000
Config Portd = Output
'
------------------------------------------------------------------------
-----
Gosub Dog
Config Lcdpin = Pin , Rs = Portd.5 , E = Portd.4 , Db4 = Portd.0 , Db5 =
Portd.1 , Db6 = Portd.2 , Db7 = Portd.3
Config Lcd = 16 * 2
Display On
Cursor Off
'
************************************************************************
*****
' Hauptschleife
Do
If Pinc.3 = 0 Then
Waitms 5
If Pinc.3 = 0 Then
Gosub Taster_1
End If
End If
' - Aktualisieren der Anzeige
-------------------------------------------------
If T1 > 1000 Then
T1 = 0
Gosub Ausgabe
End If
Loop
'
************************************************************************
****
End
'
------------------------------------------------------------------------
----
Taster_1:
Toggle Licht
If Licht = 0 Then
Ocr2 = 254
Else
Ocr2 = 20
End If
Return
'
------------------------------------------------------------------------
----
Ausgabe:
Z = Getadc(5)
Locate 1 , 1
Lcd " "
Locate 1 , 1
Lcd Z
Return
'
------------------------------------------------------------------------
-----
Pulse:
Timer1 = 65411
T1 = T1 + 1
If T1 > 32100 Then T1 = 32100
Return
' ---------------------- LCD DOG162 Konfigurieren
-----------------------------
Dog:
Restore Da
For X = 1 To 22
Read W
Portd = W : Waitms 2
Set Portd.4
Waitms 1
Reset Portd.4
Next
Return
Da:
' - synchronisations Bits
-----------------------------------------------------
Data &H3 , &H3
Data &H3 , &H2
'
------------------------------------------------------------------------
-----
Data &H2 , &H9
Data &H1 , &HC
Data &H5 , &H2
Data &H6 , &H9
Data &H7 , &H4
Data &H0 , &HF
Data &H0 , &H1
Data &H0 , &H6
Data &H2 , &H8
Das muss in die OCR2 Interruptroutine
>> If T1 > 1000 Then>> T1 = 0>> Gosub Ausgabe>> End If
so misst Du nur dann deinen Wert, wenn der PWM-BLOCK gerade geschaltet
hat.
Wenn deine PWM-Frequenz kleiner ist, als die Wandlerlaufzeit (13Clocks
ADC-CLK), ist der ADC fertig, bevor ein neuer PWM Zyklus gestartet hat.
so in etwa, jedenfalls musst Du den ADC mit der PWM syncronisieren.
Habe ich bei ...HanneS... seinerzeit aufgegriffen.
In seinem Fernsteuersender werden auch die Potis für die einzelnen
Kanäle mit dem ADC abgefragt. Das macht er dort auch in den
Impulspausen. Analog dazu müsstest Du dir eben auch eine Strategie
ausdenken. Da bietet sich der OCR2 Interrupt an.
Allerdings solltest Du dann den Wert "Prescale" in dieser Zeile ändern.
>>Config Timer2 = Pwm , Pwm = On , Compare Pwm = Clear Up , Prescale = 1
So hoch, das die LEDs eben gerade noch nicht flackern.
Viel Spass
XlR.
natürlich im OCR Int keine Ausgabe machen, sondern ein Flag setzen,
welches in der Hauptschleife abgearbeitet wird, klar...
ging ja auch nur um s Prinzip
XlR.
Eine eigene Frage?
Dieser Thread ist über 19 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.