www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AD Werte abh. von PWM ?


Autor: Dani (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
könnte an deinem Programm liegen. Ca. Zeile 30.

Autor: Dani (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 !?



Autor: Matthias S. (da_user)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
EMV!?

Autor: Dani (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ...

Autor: Dani (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Dani (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe inzwischen andere Werte für ocr2 ausprobiert.
Bei ocr2=50 zeigt die Anzeige wahllos Werte zwischen 0 und 16 an ...

Autor: axelr.[DG!RTO] (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: axelr.[DG1RTO] (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Dani (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für den tip, werde ich mal ausprobieren ...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.