PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RN-Control - PWM ich verstehe es nicht



MueThoS
03.04.2008, 21:02
Hallo zusammen!
Ich suche schon seit Tagen im INet und auch speziell hier im Forum nach Beispielen die mich verstehen lassen wie das funzt.
Irgendwie finde ich da nichts was mich weiter bringt.
Deshalb möchte ich hier mal meinen Speziellen Fall ansprechen:

Ich habe die RN-Control mit dem Atmega32.
Durch die DCF77 Steuerung fällt Timer1 raus (steht zumindest so in der Doku).
Heißt doch das ich nur Timer0 nehmen kann, oder?
Und Ports sollten PD4 und PD5 sein. Wobei PD4 B ist und PD5 A

Ich möchte nun mit einem Ausgang die Led-Beleuchtung des Displays und mit dem anderen den Kontrast regeln.
Kontrast ist erstmal zweitrangig!

Also muß ich:
1. Die Ports als Ausgang einrichten
2. Den Timer0 als PWM mit predingsbums und so
3. Werte raus geben
oder sehe ich das falsch?




Config Pind.4 = Output
Config Pind.5 = Output
Config Timer0 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Pwm1a = 0
Pwm1b = 0

Da kommt nur leider immer invalid parameter

Gültige Werte sind von 0 bis 255, richtig?


Hilfe, bitte....
Wenn ich das verstanden habe kanns wieder weiter gehen!
Im mom hänge ich da total fest.

Dirk
03.04.2008, 21:15
Hallo MueThoS,

Timer0 und PWM gehen nicht zusammen.
Du must Timer1 (OC1x) oder Timer2 (OC2) nehmen.

Gruß Dirk

MueThoS
04.04.2008, 06:38
Achsooo,
hmmm.

Wie gesagt Timer 1 fällt wohl aus oder?
Weil der für die DCF77-Auswertung schon in Benutzung ist.

Bleibt Timer2, richtig.
Mit Timer2 kann ich aber nur einen PWM erzeugen. oder? (PD7)

Böse Falle!

Gibts alternativen?

Dirk
04.04.2008, 20:12
Gibts alternativen?

Such 'mal nach "Software-PWM".

Z.B. hier:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=38460

Gruß Dirk

MueThoS
05.04.2008, 17:43
Ok, habe mal ein wenig experimentier!

Habe folgenden (gekürzten) Code:


' PortD 1 PWM für Beleuchtung
' PortD 2 PWM für Kontrast

' Chip-Settings
$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 128
$swstack = 128
$framesize = 128
$baud = 19200

Config Timer0 = Timer , Prescale = 256
Dim Timercounter As Byte
Config Portd.0 = Output
Config Portd.1 = Output

' Zählvariable für die PWM
On Timer0 Pwm_isr
Enable Timer0 ' timer0 interrupt ein
Enable Interrupts ' Global Interrupt ein

.....
.....


Pwm_isr:
If Timercounter < Dimmer Then
Set Portd.0
Else
Reset Portd.0
End If
If Timercounter < Kontrast Then
Set Portd.1
Else
Reset Portd.1
End If
Timercounter = Timercounter + 1
If Timercounter = 255 Then Timercounter = 0

Return

Grundlage ist ja die RN-Control mit dem 16mHz Quarz
Nur habe ich irgendwie das gefühl das das nicht klappen wird.
Ich habe Testweise 2 LEDs angeschlossen.
Und entweder flackern die oder wenn ich den prescale runter setze scheint der rest meines Programms nicht mehr richtig zu laufen.

Deshalb frage ich nochmal generell nach.
An und für sich ist das so eine richtiger Software-PWM oder?

linux_80
05.04.2008, 22:23
Hallo,

also ich würde ja sagen diese Zeilen überschneiden sich in der Funktion, wobei die Erste Vorrang hat !


$baud = 19200
....
Config Portd.0 = Output
Config Portd.1 = Output

Lass mal $baud weg, und stelle sicher, das kein Print im Programm vorkommt !

MueThoS
05.04.2008, 23:02
Ups, das habe ich hier vergessen zu ändern!

Mir ist beim überprüfen der Ports dann auch aufgefallen das diese ja für die Serielle Schnittstelle in Benutzung sind.
Ich habe die Ports dann geändert auf D2 imd D3 aber ist das selbe Problem.
Sobald ich auf sagen wir mal halben Wert gehe flackert es.

Ich will jetzt nich sagen das ich mit zählen könnte aber es flackert schon extrem.

Dirk
06.04.2008, 10:13
Hallo MueThoS,

An und für sich ist das so eine richtiger Software-PWM oder?

Ja, das geht als Software-PWM durch, funktioniert aber so noch nicht ganz. In der ISR (Pwm_isr) würde ich die Ports nicht gezielt Setzen/Zurücksetzen, sondern Toggeln (Toggle Portd.x), wenn ein bestimmter Wert (Dimmer, Kontrast) erreicht ist. Der Sinn ist ja, dass der Port nicht in jeder ISR getoggelt wird, sondern nur in der Dimmer-tsten oder Kontrast-sten ISR. Wenn dann der Wert erreicht ist, muss der zugehörige Zähler auf 0 gesetzt werden. Letztlich braucht man dann auch 2 Zähler, die man getrennt voneinander in der ISR zurücksetzen kann.

In der jetzigen Version kannst du die Zeile "If Timercounter = 255 Then Timercounter = 0" weglassen, weil bei 255 + 1 wieder 0 erreicht ist.

Gruß Dirk

MueThoS
06.04.2008, 14:26
Achsooo,



' Timer0 für die PWM
Config Timer0 = Timer , Prescale = 256
Dim Dimmercounter As Byte ' Zählvariable für die PWM Dimmer
Dim Kontrastcounter As Byte ' Zählvariable für die PWM Kontrast
Config Portd.2 = Output
Config Portd.3 = Output
....
On Timer0 Pwm_isr
Enable Timer0 ' timer0 interrupt ein
Enable Interrupts ' Global Interrupt ein
....
....
Pwm_isr:
If Dimmercounter = Dimmer Then
Toggle Portd.2
Dimmercounter = 0
Else
Dimmercounter = Dimmercounter + 1
End If
If Kontrastcounter = Kontrast Then
Toggle Portd.3
Kontrastcounter = 0
Else
Kontrastcounter = Kontrastcounter + 1
End If

Return

Dann waähre es so richtig, oder?
Was ich halt so komsich finde ist das das so garnicht funktioniert wie ich das will!
Wenn ich es so mache wie jetzt hier in der Code-Box und stelle einen Wert auf 255 dann Blinkt diese Led ca im Sekundentakt (hab kein Ossi)
Das würde aber doch heißen das er eine Sekunde braucht um bis 255 zu zählen, oder sehe ich das falsch.

Und ich dächte das müßte er schneller können.

Dirk
06.04.2008, 15:53
... stelle einen Wert auf 255 dann Blinkt diese Led ca im Sekundentakt (hab kein Ossi)

Der Vorteiler ist bei dir (16 MHz Takt, Prescaler 256) 62,5 kHz. Wenn in jeder 255. ISR getoggelt wird, dann passiert das ca. 245x pro Sekunde.

Das dürfte nicht mehr zu sehen sein, d.h. die LED sieht man dann nicht blinken.

Gruß Dirk

MueThoS
06.04.2008, 16:41
Ja, das ist ja das was ich meine!
Ich konnte das zwar jetzt auf anhieb nicht so ausrechnen aber grob überschlagen dachte ich mir das das viel schneller sein müßte.

Woran kann es noch liegen?
Vielleicht ist der externe Quarz nicht aktiv?
Aber wenn ich das richtig gelesen habe hat er intern 4mHz oder?
Selbst da müßte es besser gehen.

So initialisiere ich ja den Chip:

' Chip-Settings
$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 128
$swstack = 128
$framesize = 128
$baud = 19200


Könnte es an den fusebits liegen?
Ich habe mal die Einstellung angehängt.

Ah, wo wir gerade dabei sind, wie oft kann ich eigentlich in den uC rein schreiben? Also meinen Code in den Chip schreiben.
Ist doch bestimmt nicht ewig oft, oder?

seankubi
14.05.2008, 11:19
10.000 Schreibzyklen, dürfte reichen :)

MueThoS
18.05.2008, 09:47
Hallo zusammen,
ich nochmal!

Es klappt einfach nicht.
Bei einen Prescane von 64 und einem sehr kleinen Zählwert leuchtet die LED.
Aber sobald ich den Zähler etwas erhöhe blinkt sie schon.

Ich bin echt am verzweifeln!
Irgendwas stimmt nicht.

Was könnte es denn noch sein?

[-o<