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
Ah ja richtig, der Programmcode ... $regfile = "m16def.dat" 'ATmega16 $crystal = 1000000 'Quarz: 1 MHz ' ------------------------------------------------------------------------ ----- ' Definition des AD Wandlers $hwstack = 32 $swstack = 10 $framesize = 40 '$framesize = 50 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 Ocr2 = 254 'Displaybeleuchtung 100% . . . Z = Getadc(5) Bei Ocr2=20 liefert getadc(5) andere Werte !?
Kann ich zu 99% ausschließen. Ich habe die selbe Platine mit einem Mega8, da funktioniert es einwandfrei. Der Mega 16 sitzt an der selben Stelle ...
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
Ich habe inzwischen andere Werte für ocr2 ausprobiert. Bei ocr2=50 zeigt die Anzeige wahllos Werte zwischen 0 und 16 an ...
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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.