-
 
          
	
		
		
	
	
	
	
		
	
	
		
			
- 
	
	
		
			
			
				Neuer Benutzer
			
			
				Öfters hier
			
			
			
			 
			
				
 
					    
				 
 
			
				
				
				
					Anfängerproblem mit PWM
				
					
						
							Hallo
 
 Bin Anfänger in der ganzen Sache und möchte nun folgendes machen.
 Eine Dimmerschaltung, die wenn zb. Pin PD7 nach Masse gezogen wird
 der Mega8 selbständig die PWM von 0 nach Max innerhalb von 3 sec durchfährt.
 und wenn PD6 nach Masse gezogen wird das ganze natürlich umgekehrt!
 (also von max auf 0 runter) und das wiedrum innerhalb 3 sec.
 
 Nun habe ich folgendes Listing gefunden in der die PWM mit Hilfe der UART eingestellt wird (0-255), das möchte ich aber nicht, den das soll ja ohne PC laufen.
 '0607.BAS:  LED-Helligkeit mit phasenkorrektem Timer1-PWM
 'Hardware:  Pin PB1/OC1A zur LED, Nullmodemkabel zum PC
 '----------------------------------------------------------
 $Regfile="m8def.dat"   'ATmega8-Deklarationen
 $Crystal=3686400       'Verwendeter Quarz: 3,6864 MHz
 $Baud   =9600          '9600 Baud
 '
 DDRB.1=1               'Pin PB1/OC1A ist Ausgang
 '
 TCCR1A=&B10000001      'Pin OC1A nicht invertiert, 8-Bit-
 TCCR1B=&B00000010      '...PWM phasenkorrekt, Timer1 1/8
 '----------------------------------------------------------
 Do 'Hauptschleife
 If UCSRA.RXC=1 Then  'Falls ein Byte im UART-Puffer...
 OCR1AL=UDR         'Neuen Helligkeitswert setzen
 End If
 Loop
 
 wer kann mir helfen, und das Listing so verändern, damit ich was anfangen kann??
 Danke
 
 
 
 
 
 
 
- 
	
	
		
			
			
				Erfahrener Benutzer
			
			
				Begeisterter Techniker
			
			
			
			
			
				  
 
					    
				 
 
			
				
				
						
						
				
					
						
							Dim Dimmen as Byte
 $crystal = 8000000
 
 Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Prescale = 64       ----> entspricht etwa 245 Hz
 Pwm1a = 0
 Enable Timer1
 Enable Interrupts
 
 If Pind.7 = 0 Then
 For Dimmen = 0 to 255         ----------> von dunkel nach hell
 Pwm1a = Pwm1a+1
 waitms 10
 next                        ---------->dauert 255 * 10 ms =  2,55 sek
 end if
 If Pind.6 = 0 Then
 For Dimmen = 255 to 0         ----------> von hell nach dunkel
 Pwm1a = Pwm1a-1
 waitms 10
 next
 end if
 
 Das gilt für 8MHz Quarz. Bei anderem Quarz, Timer1 ändern, damit etwa 245Hz rauskommen
 
 
 
 
 
 
 
- 
	
	
		
			
			
				Neuer Benutzer
			
			
				Öfters hier
			
			
			
			 
			
				
 
					    
				 
 
			
				
				
						
						
				
					
						
							Hallo
 
 danke erstmal, werde das ganze mal testen.
 unterscheidet sich aber gewaltig von meinem listing
 aber meins ist ja auch nur aus einem Buch abgeschrieben
 danke nochmals
 
 
 
 
 
 
 
- 
	
	
		
			
			
				Erfahrener Benutzer
			
			
				Begeisterter Techniker
			
			
			
			
			
				  
 
					    
				 
 
			
				
				
						
						
				
					
						
							Es sind 2 verschiedene Verfahren. In deinem Beispiel wird der Timer über OCR1AL voreingestellt, sodass sich die Frequenz ändert.
 Ich nehme eine feste Frequenz und verändere das Verhältnis zwischen Low und High.
 
 Kannst ja auch dein Beispiel nehmen und dann,
 
 If Pind.7 = 0 Then
 For Dimmen = 0 to 255 ----------> von dunkel nach hell
 OCR1AL=Dimmen
 waitms 10
 next ---------->dauert 255 * 10 ms = 2,55 sek
 End If
 
 If Pind.6 = 0 Then
 For Dimmen = 255 to 0 ----------> von hell nach dunkel
 OCR1AL=Dimmen
 waitms 10
 next
 end if
 
 
 
 
 
 
 
- 
	
	
		
			
			
				Neuer Benutzer
			
			
				Öfters hier
			
			
			
			 
			
				
 
					    
				 
 
			
				
				
						
						
				
					
						
							Hallo
 
 Hmmm
 Habe das Heute mal getestet.
 $regfile = "m8def.dat"                            'ATmega8-Deklarationen
 $crystal = 3686400                                'Verwendeter Quarz: 3,6864 MHz
 Dim Dimmen As Byte
 Config Pind.3 = Input
 Config Pind.4 = Input
 
 Portd.3 = 1
 Portd.4 = 1
 Ddrb.1 = 1                                                  'Pin PB1/OC1A ist Ausgang
 
 Tccr1a = &B10000001                            'Pin OC1A nicht invertiert, 8-Bit-
 Tccr1b = &B00000010                        '...PWM phasenkorrekt,Timer1 1/8
 '----------------------------------------------------------
 
 Do
 
 If Pind.3 = 0 Then
 For Dimmen = 0 To 255                     ' ----------> von dunkel nach hell
 Ocr1al = Dimmen
 Waitms 15
 Next Dimmen                          ' ---------->dauert 255 * 10 ms = 2,55 sek
 End If
 If Pind.4 = 0 Then
 For Dimmen = 255 To 0                     ' ----------> von hell nach dunkel
 Ocr1al = Dimmen
 Waitms 15
 Next Dimmen
 End If
 
 Loop
 
 Ergebniss:
 Bei Pind2 gegen masse passiert garnix.
 bei Pind3 gegen Masse geht die leuchte langsam an bis zur vollen Helligkeit, ist aber der Pin noch gegen Masse, so wird die Lampe schlagartig dunkel und langsam wieder hell.
 Wird Pind3 aber von Masse getrennt so leuchtet die lampe mit voller Helligkeit (das sollte sie auch machen so aber trotz das Pind3 noch gegen Masse ist sollte die Lampe voll weiterleuchten)
 
 Ein Dimmen von Hell nach Dunkel ist nicht möglich.
 Hmmm schade aber irgendwas passt da noch nicht
 reini
 
 
 
 
 
 
 
- 
	
	
		
			
			
				Erfahrener Benutzer
			
			
				Begeisterter Techniker
			
			
			
			
			
				  
 
					    
				 
 
			
				
				
						
						
				
					
						
							>Bei Pind2 gegen masse passiert garnix.
 
 Klar, Pind.2 müßte dafür Eingang sein.
 
 >Config Pind.3 = Input
 >Config Pind.4 = Input
 >Portd.3 = 1
 >Portd.2 = 1
 
 
 >bei Pind3 gegen Masse geht die leuchte langsam an bis zur vollen >Helligkeit, ist aber der Pin noch gegen Masse, so wird die Lampe >schlagartig dunkel und langsam wieder hell.
 
 Das Beispiel war für einen kurzen Impuls an Pind.2 oder 3.
 Versuch das mal.
 
 If Pind.3 = 0 And Dimmen < 255 Then
 For Dimmen = 0 To 255 ' ----------> von dunkel nach hell
 Ocr1al = Dimmen
 Waitms 15
 Next Dimmen ' ---------->dauert 255 * 10 ms = 2,55 sek
 End If
 If Pind.2 = 0 And Dimmen > 0 Then
 For Dimmen = 255 To 0 ' ----------> von hell nach dunkel
 Ocr1al = Dimmen
 Waitms 15
 Next Dimmen
 End If
 
 
 
 
 
 
 
- 
	
	
		
			
			
				Neuer Benutzer
			
			
				Öfters hier
			
			
			
			 
			
				
 
					    
				 
 
			
				
				
						
						
				
					
						
							Hallo
 
 ja schon klar, hab den Fehler mit den Pins auch bemerkt, aber selbst nach den berichtigen war nix mit dem Dimmen nach dunkel!
 der Pin für dunkel ist ohne ledliche Funktion
 
 werde jetzt mal das Listing ändern.
 
 Habe es nun geändert, aber alles beim alten!!
 keinerlei Änderung zum ersten Listing
 
 reini
 
 
 
 
 
 
 
- 
	
	
		
			
			
				Erfahrener Benutzer
			
			
				Begeisterter Techniker
			
			
			
			
			
				  
 
					    
				 
 
			
				
				
						
						
				
					
						
							Ich weis jetzt nicht, welchen pin du wirklich benutzt ?
 Habe es mit pind.3 und 4 probiert und funktioniert jetzt.
 
 If Pind.3 = 0 And Ocr1al < 255 Then
 For Dimmen = 0 To 255
 Ocr1al = Dimmen
 Waitms 15
 Next Dimmen
 End If
 If Pind.4 = 0 And Ocr1al > 0 Then
 For Dimmen = 255 To 0 Step -1
 Ocr1al = Dimmen
 Waitms 15
 Next Dimmen
 End If
 
 Ich hatte in der unteren schleife "Step -1" vergessen, deshalb wurde nicht runtergezählt.
 Außerdem muß bei If ...... Ocr1l und nicht Dimmen rein.
 
 
 
 
 
 
 
- 
	
	
		
			
			
				Neuer Benutzer
			
			
				Öfters hier
			
			
			
			 
			
				
 
					    
				 
 
			
				
				
						
						
				
					
						
							Hallo
 
 Besten Dank albundy
 werde natürlich auch noch Deine Lösung testen,
 aber ich habe es nun auch geschaft mit dieser Lösung:
 Do
 If Pind.3 = 0 And Pwm1a = 0 Then
 Do
 Pwm1a = Pwm1a + 1
 Waitms 20
 Loop Until Pwm1a = 255
 End If
 If Pind.4 = 0 And Pwm1a = 255 Then
 Do
 Pwm1a = Pwm1a - 1
 Waitms 20
 Loop Until Pwm1a = 0
 End If
 Loop
 
 funst jedenfals bestens
 Aber nochmals meinen Dank an albundy ohne seine Vorschläge wäre ich nicht auf diese Lösung gekommen
 reini
 
 
 
 
 
 
 
 
	
	
	
	
	
	
	
	
	
	
	
	
		
		
		
		
			
				 Berechtigungen
				Berechtigungen
			
			
				
	
		- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-  
Foren-Regeln
 
			 
		 
	 
 
  
 
  
 
Lesezeichen