loetstelle.net
Lötstelle Userforum
 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

PWM -> ATMega8 auf Pb.3 mit Timer2?
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    loetstelle.net Foren-Übersicht -> Microcontroller und DSP
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
pcprofi



Anmeldungsdatum: 17.02.2008
Beiträge: 1459
Wohnort: Düren

BeitragVerfasst am: Mo 09.Feb 2009 15:06:51    Titel: PWM -> ATMega8 auf Pb.3 mit Timer2? Bauteile finden Antworten mit Zitat

Hallo Jungens,

weiß einer von euch, wie ich das hinbekomme? Ich hab diversese im Internet gefunden - aber keine Lösung die funktioniert gefunden.

Ich programmiere übrigens mit Basom...

Gruß Rainer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
gerold



Anmeldungsdatum: 27.07.2007
Beiträge: 927
Wohnort: Oberhofen im Inntal (Tirol)

BeitragVerfasst am: Mo 09.Feb 2009 15:24:51    Titel: Re: PWM -> ATMega8 auf Pb.3 mit Timer2? Bauteile finden Antworten mit Zitat

Hallo Rainer!

Irgendwann mal habe ich dieses Beispiel gestrickt:
Code:
$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 100
$swstack = 100
$framesize = 100

'PWM-Ausgänge
Config Portb.1 = Output       'OC1A
Config Portb.2 = Output       'OC1B
Config Portb.3 = Output       'OC2

'PWM aktivieren (244 Hz)
Config Timer1 = Pwm , Prescale = 8 , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up
Config Timer2 = Pwm , Compare Pwm = Clear Down , Prescale = 8

'Tastverhältnisse einstellen
Compare1a = 125
Compare1b = 125
Ocr2 = 125

'Hauptschleife (die nichts tut)
Do
   !nop
Loop

End

Suche dir das raus was du brauchst.

lg
Gerold
Smile

_________________
http://halvar.at | http://sw3.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
pcprofi



Anmeldungsdatum: 17.02.2008
Beiträge: 1459
Wohnort: Düren

BeitragVerfasst am: Mo 09.Feb 2009 16:13:38    Titel: Bauteile finden Antworten mit Zitat

Danke Gerold - Es tuts mit genau der Zeile von Timer2 - ich habe meinen Fehler gefunedn...

Ich hab irrtümlich angenommen, je kleiner ocr2 ist desto kürzer die Intervalle - es ist aber genau umgekehrt...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
meka8



Anmeldungsdatum: 31.12.2010
Beiträge: 7

BeitragVerfasst am: Fr 31.Dez 2010 18:03:24    Titel: Bauteile finden Antworten mit Zitat

Hallo Gerold,

habe mich gerade als neuer Forennutzer registriert und bin noch ein blutiger Anfänger im Umgang mit µPs und Bascom, der sich aber von den Tücken und Geheimnissen des Programmierens noch oftmals recht beeindruckt zeigt.

Deinen "Kleinen Bascom AVR Kurs" habe ich studiert und hoffe, dass einiges hängen geblieben ist. Diesen Kurs hast Du so verständlich und übersichtlich gestaltet, dass man danach leicht glauben könnte, nun mal loslegen zu können! So hatte ich mich nun intensiver mit den Timern befasst, die sehr vielfältig genutzt werden können.

So hatte ich mich nun aktuell mit dem Timer 2 des Atmega 8 intensiver befasst, um mal verschiedene PWM-Möglichkeiten ausprobieren zu wollen. Beim Durchstöbern des Forums bin ich dann auf Deinen Code gestoßen.

Deinen Code versuche ich nun so zu ändern, dass bei Betätigung eines Tasters sich der OCR2-Wert so ändern soll, dass eine an B.3 angeschlossene LED einmal heller oder dunkler leuchtet. Ich stelle mal den von mir geänderten Code ein, der in dieser Form leider noch nicht das macht, was ich mir so ausgedacht hatte. Sad

Für Tipps wäre ich sehr dankbar. Bleibt mir noch, allen einen guten Rutsch und einen ebenso guten wie erfolgreichen Start ins Neue Jahr zu wünschen.




Code:

$regfile = "M8def.dat"
$crystal = 1000000
$hwstack = 100
$framesize = 100
$swstack = 100

Config Pinc.1 = Input

Config Pind.3 = Input
'Portd.3 = 0

Config Pind.1 = Input
Portd.1 = 0

Config Portb.3 = Output
Portb.3 = 1

Config Pind.0 = Input
Portd.0 = 0



Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

Config Timer2 = Pwm , Compare Pwm = Clear Down , Prescale = 8
Enable Timer2
Timer2 = 0
Start Timer2

Dim M As Byte
M = 0

Dim N As Byte
N = 200

Do

Debounce Pind.3 , 0 , Wechsel , Sub

Loop

Wechsel:
If Portd.3 = 0 Then
Ocr2 = M
Else
Ocr2 = N
End If

Return


Very Happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
gerold



Anmeldungsdatum: 27.07.2007
Beiträge: 927
Wohnort: Oberhofen im Inntal (Tirol)

BeitragVerfasst am: Fr 31.Dez 2010 19:58:25    Titel: Bauteile finden Antworten mit Zitat

meka8 hat folgendes geschrieben:
Code:
Wechsel:
   If Portd.3 = 0 Then
      Ocr2 = M
   Else
      Ocr2 = N
   End If
Return

Hallo meka8!

Mir fällt im ersten Moment nur das hier auf:
Code:
If Pind.3 = 0 Then

PORT <> PIN

mfg
Gerold
Smile

_________________
http://halvar.at | http://sw3.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
pcprofi



Anmeldungsdatum: 17.02.2008
Beiträge: 1459
Wohnort: Düren

BeitragVerfasst am: Sa 01.Jan 2011 12:24:12    Titel: Bauteile finden Antworten mit Zitat

Das war mir auch aufgefallen...

Zum anderen könnte es sein, dass du die Interrupts noch enablen musst...

Gruß Rainer

_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
meka8



Anmeldungsdatum: 31.12.2010
Beiträge: 7

BeitragVerfasst am: So 02.Jan 2011 00:24:34    Titel: Bauteile finden Antworten mit Zitat

Hallo Gerold, hallo PC Profi,

vielen Dank für Eure Hilfe! Pin<>Port - oh, Gott, schon wieder dieser Kardinalfehler!!! Embarassed Ich hab's geändert, dann funktionierte es! Ich hatte auch den Interrupt "eingebaut", doch es hatte keinen Einfluss.

Nun habe ich mich etwas weiter gewagt, habe zwei Taster an den Pins D.1 und D.3 angeschlossen, habe dann von konstanten OCR-Werten Konstanten subtrahiert oder addiert und habe die unterschiedlichen Möglichkeiten, die sich mit "Compare Pwm = Clear Up bzw. Down durchführen lassen, durchgespielt. Danach habe ich für den konstanten OCR2-Wert einen variablen Wert mit Hilfe eines Potis und des ADCs erzeugt. Das funktioniert soweit auch ganz gut. Verändere ich aber die Potistellung so, dass die an PinB.3 angeschlossene LED immer dunkler wird, so überschreite ich, nachdem die LED ganz dunkel war, den Schwellwert und die LED leuchtet wieder ganz hell. Das verstehe ich nicht, da ich glaubte, mit diesen Befehlen die obere als auch die untere Grenze des OCR-Wertes festgelegt zu haben:

Code:
If Ocr2 > 255 Then
Ocr2 = 255
If Ocr2 < 0 Then
Ocr2 = 0



Unerklärlich ist für mich ebenfalls, weshalb die LED stark flackert, wenn die Potistellung so verändert wird, dass die LED immer dunkler wird. Prescale hatte ich schon von 8 auf 1 reduziert, scheint aber wohl die Taktfrequenz mit 1 MHz wohl noch zu gering zu sein? Hier der aktuelle Code nochmals und ich hoffe, darin nicht nochmals einen so kapitalen Bock geschossen zu haben Embarassed Für jeden Tipp bin ich sehr dankbar.

Code:
$regfile = "M8def.dat"
$crystal = 1000000
$hwstack = 100
$framesize = 100
$swstack = 100




Config Pinc.0 = Input



Config Pind.3 = Input
Portd.3 = 1


Config Pind.1 = Input
Portd.1 = 1

Config Portb.3 = Output
'Portb.3 = 1

Config Pind.0 = Input
Portd.0 = 0



Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

Config Timer2 = Pwm , Compare Pwm = Clear Up , Prescale = 1

Enable Timer2
Timer2 = 0
Start Timer2
Enable Interrupts


Dim Potiwert As Byte
Dim M As Byte
M = 100

Dim N As Byte
N = 50

Do

Potiwert = Getadc(0)
Potiwert = Potiwert / 4
Ocr2 = Potiwert

If Ocr2 > 255 Then
Ocr2 = 255
If Ocr2 <= 0 Then
Ocr2 = 0

End If
End If




If Pind.3 = 0 Then
   Ocr2 = Ocr2 - M
   Else
   Ocr2 = Ocr2
End If


If Pind.1 = 0 Then
   Ocr2 = Ocr2 - N
   Else
   Ocr2 = Ocr2
      End If

Loop


Schöne Grüße
Willi
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
caargoo



Anmeldungsdatum: 27.05.2007
Beiträge: 25
Wohnort: Ö - B

BeitragVerfasst am: So 02.Jan 2011 07:49:29    Titel: Bauteile finden Antworten mit Zitat

Hallo!


Deklarier mal den Potiwert als Word.


MfG
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
meka8



Anmeldungsdatum: 31.12.2010
Beiträge: 7

BeitragVerfasst am: So 02.Jan 2011 14:09:47    Titel: Bauteile finden Antworten mit Zitat

Hallo caargoo,

ja, da hatte ich auch schon dran gedacht, ausprobiert, brachte aber leider keinen Erfolg. Aber vielen Dank für Deinen Tipp!

Schöne Grüße
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
caargoo



Anmeldungsdatum: 27.05.2007
Beiträge: 25
Wohnort: Ö - B

BeitragVerfasst am: So 02.Jan 2011 15:36:46    Titel: Bauteile finden Antworten mit Zitat

Hallo!


If Ocr2 > 255 Then
Ocr2 = 255
If Ocr2 <= 0 Then
Ocr2 = 0

Diese Abfrage ist sinnfrei, da Ocr2 nie größer als 255 und nie kleiner
als 0 werden kann.

Desweiteren wird Dein Ocr2 Wert nie größer als 63.
Und wenn Du jetzt von 63 noch 100 abziehst, was erhälst Du dann?

Geh Dein Programm Zeile für Zeile durch. Überleg dabei welches Ergebnis Du nach jeder Zeile hast. Da geht Dir viel eher ein Licht auf, als andere Leute Deine Fehler suchen zu lassen.

MfG
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sam



Anmeldungsdatum: 13.10.2008
Beiträge: 401

BeitragVerfasst am: So 02.Jan 2011 16:41:40    Titel: Bauteile finden Antworten mit Zitat

Alle diese Probleme wären gelöst, wenn er Potibyte als Integer deklarieren würde.
_________________
„Zwei Dinge sind unendlich, das Universum und
die menschliche Dummheit, aber bei dem
Universum bin ich mir noch nicht ganz sicher.“
Albert Einstein
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
meka8



Anmeldungsdatum: 31.12.2010
Beiträge: 7

BeitragVerfasst am: So 02.Jan 2011 18:12:15    Titel: Bauteile finden Antworten mit Zitat

Hallo caargoo,

ich bin etliche Male alle Zeilen des Codes durchgegangen, habe den offensichtlich vorhandenen Fehler leider noch nicht selbst erkennen können.

Mit der "sinnfreien" Abfrage glaubte, Überläufe des OCR2-Wertes verhindern zu können.

Dafür, das der OCR2_Wert max. nur den Zahlenwert von 63 erreichen kann, leuchtet die LED aber genau so hell, als wäre sie direkt an Vcc angeschlossen!? Auch die gemessene Spannung an B.3 beträgt 5V.

Mit Sicherheit würde ich dieses Problem lieber selbst lösen, als mich an andere wenden zu müssen. Aber Du hast doch die freie Wahl, Dich daran nicht beteiligen zu müssen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
meka8



Anmeldungsdatum: 31.12.2010
Beiträge: 7

BeitragVerfasst am: So 02.Jan 2011 18:23:52    Titel: Bauteile finden Antworten mit Zitat

Hallo Sam,

Dim as Integer ändert leider auch nichts an der "Überlauffreudigkeit".
Ich hatte auch unter vielen anderen Änderungen versucht, den OCR"-Wert in den Grenzen zwischen 0 und 255. Aktuellster Versuch sah so aus, brachte mich aber auch nicht weiter:

Code:
Do

Potiwert = Getadc(1)
Potiwert = Potiwert / 4
Ocr2 = Potiwert

If Ocr2 > 255 Then
Ocr2 = 255
If Ocr2 <= 0 Then
Ocr2 = 0

End If
End If




If Pind.3 = 0 Then
   Ocr2 = Ocr2 - M
   If Ocr2 < 0 Then
   If Ocr2 > 255 Then
   Ocr2 = 0
   Else
   Ocr2 = Ocr2
End If
End If
End If

If Pind.1 = 0 Then
   Ocr2 = Ocr2 - N
   If Ocr2 < 0 Then
   If Ocr2 > 255 Then
   Ocr2 = 0
   Else
   Ocr2 = Ocr2
End If
End If
End If

Loop
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
caargoo



Anmeldungsdatum: 27.05.2007
Beiträge: 25
Wohnort: Ö - B

BeitragVerfasst am: So 02.Jan 2011 19:56:32    Titel: Bauteile finden Antworten mit Zitat

Hallo!

Nochmals zur Verdeutlichung:
Wenn Potiwert als Byte deklariert ist kann es als Maximalwert
255 annehmen. Und 255 dividiert durch 4 ist nunmal 63 Ganze.
Daran führt kein Weg vorbei.

Mit einem Multimeter wirst Du am Pwm-Ausgang immer 5 Volt messen,
außer Du schaltest einen Tiefpass nach.

MfG

P.S.: Laut Simulator funktioniert der obere Code wenn Potiwert als
Word deklariert ist.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sam



Anmeldungsdatum: 13.10.2008
Beiträge: 401

BeitragVerfasst am: So 02.Jan 2011 23:23:15    Titel: Bauteile finden Antworten mit Zitat

OCR2 ist ein reservierter Name. Mal ändern.
_________________
„Zwei Dinge sind unendlich, das Universum und
die menschliche Dummheit, aber bei dem
Universum bin ich mir noch nicht ganz sicher.“
Albert Einstein
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Anzeige






Verfasst am: Heute 06:49:18    Titel: Bauteile finden

Nach oben
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    loetstelle.net Foren-Übersicht -> Microcontroller und DSP Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum nicht herunterladen


Powered by phpBB 2.x © 2001, 2002 phpBB Group

Sie sind Besucher Nr. 1200739
©opyright by Markus Vohburger 2005 All Rights reserved