- LiFePO4 Speicher Test         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 23

Thema: PWM mit ATMega8 und Timer2

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    19.04.2011
    Ort
    Aachen
    Alter
    34
    Beiträge
    22

    Frage PWM mit ATMega8 und Timer2

    Anzeige

    Praxistest und DIY Projekte
    Hallo zusammen,

    ich bin ein blutiger Anfänger in diesem Bereich, deshalb entschuldigt bitte, falls ich doof frage und seid geduldig mit euren Erklärungen
    Nachdem ich in einem anderem Forum keine Hilfe mehr bekam (Die letzte Antwort war "Nimm dir das Datenblatt und werd flügge"), habe ich mir zwar das Datenblatt angeguckt (hatte ich auch schon davor :-D), doch so richtig schlau werde ich da leider immer noch nicht draus....

    Nach einigen Googlen habe ich dann dieses Forum hier gefunden und einige Beiträge durchgelesen und ich denke, hier sind viele nette und kompetente Köpfe

    So, nun zu meinem Problem, bei dem ihr mir hoffentlich helfen könnt

    Ich habe eine kleine Schaltung mit einem ATMega8 entworfen, mit der ich die Gartenbeleuchtung meiner Mutter etwas "Pepp" verleihen will (also nicht nur doof leuchten, sondern bisschen dimmen, lauflicht, etc...).
    Dazu benutze ich derzeit 2 Timer. Timer1 wechselt durch die verschiedenen Programme durch (Timer1, weil 16bit-Timer und jedes Beleuchtungs-Programm ja schon etwas andauern sollte...) und Timer0 z.B. für einige Beleuchtungsprogramme selber: Aufsteigende oder Absteigende Reihenfolge des Anschaltens der LEDs.

    Diese 2 Timer sind also schonmal weg und nun wollte ich die LEDs mittels PWM dimmen und im zweiten Schritt die Helligkeit mittels Timer0 variieren lassen.
    Die LEDs benutzen übrigens komplett PORTB und D.

    Ich denke ich muss hier erstmal keinen Code posten, da ich ja die Hardware-PWM benutzen will, falls ich mich irre, sagt Bescheid.

    So, ich hab mir also das Datenblatt durchgelesen und da steht drin, dass Timer2 über eine phasenkorrekte PWM verfügt und die wollte ich dann also benutzen. Ist das allgemeine Vorgehen dafür so?
    1. Im TIMSK die entsprechenden Interrupts "erlauben". Ich denke ich werde die brauchen, siehe (*)
    2. LSB von WGM21 auf 1 setzen, um die phasenkorrekte PWM zu benutzen
    3. Im OC2 die Helligkeit einstellen oder eben wie hoch der Timer zählen soll
    4. (Über eine COM21 kann man eine (nicht)invertierte PWM benutzen)
    5. Nun wird hoffentlich die entsprechende Waveform am OC2-Pin (muss auf output geschaltet sein) erzeugt. Da hier ja nur eine Waveform am OC2-Pin erzeugt wird und ich jedoch PORTB und D brauche, werde ich wohl um die Interrupts nicht herum kommen, oder? (siehe (*))


    Nun einige Fragen, die mir auf der Seele brennen
    1. Ist das Vorgehen oben überhaupt korrekt?
    2. Wird die Waveform am OC2-Pin ohnen irgendwelchen Code im InterruptHandler erzeugt (Vermutung Ja, da ja Hardware PWM)?
    3. Wie kann ich damit meine Ports pulsweitenmodellieren, was ja mein eigentlich Ziel ist. Eine Waveform nur an einem Pin bringt mir nicht sooo viel...


    Ihr würdet mir einen riesigen Gefallen tun, wenn ich ihr euch mal einige Momente Zeit für mich nehmen könntet

    Vielen Dank im Voraus,
    Eroli

  2. #2
    Erfahrener Benutzer Roboter-Spezialist Avatar von Bernd_Stein
    Registriert seit
    19.09.2008
    Ort
    Deutschland : Nordrhein-Westfalen ( NRW )
    Alter
    53
    Beiträge
    407
    [QUOTE=Eroli;509131]Hallo zusammen,
    ...
    So, ich hab mir also das Datenblatt durchgelesen und da steht drin, dass Timer2 über eine phasenkorrekte PWM verfügt und die wollte ich dann also benutzen. Ist das allgemeine Vorgehen dafür so?
    1. Im TIMSK die entsprechenden Interrupts "erlauben". Ich denke ich werde die brauchen, siehe (*)
    2. LSB von WGM21 auf 1 setzen, um die phasenkorrekte PWM zu benutzen
    3. Im OC2 die Helligkeit einstellen oder eben wie hoch der Timer zählen soll
    4. (Über eine COM21 kann man eine (nicht)invertierte PWM benutzen)
    5. Nun wird hoffentlich die entsprechende Waveform am OC2-Pin (muss auf output geschaltet sein) erzeugt. Da hier ja nur eine Waveform am OC2-Pin erzeugt wird und ich jedoch PORTB und D brauche, werde ich wohl um die Interrupts nicht herum kommen, oder? (siehe (*))


    Nun einige Fragen, die mir auf der Seele brennen
    1. Ist das Vorgehen oben überhaupt korrekt?
    2. Wird die Waveform am OC2-Pin ohnen irgendwelchen Code im InterruptHandler erzeugt (Vermutung Ja, da ja Hardware PWM)?
    3. Wie kann ich damit meine Ports pulsweitenmodellieren, was ja mein eigentlich Ziel ist. Eine Waveform nur an einem Pin bringt mir nicht sooo viel...


    > Ihr würdet mir einen riesigen Gefallen tun, wenn ich ihr euch mal einige Momente Zeit
    > für mich nehmen könntet
    >
    Hallo,

    ich befasse mich gerade mit dem Timer0 des ATtiny13. Bin also auch nicht so Sattelfest, aber hoffe trotzdem Dir helfen zu können. Meistens gesellen sich dann auch andere dazu, so das doch etwas vernünftiges dabei herauskommt.
    Für mich reichen leider einige Momente Zeit nicht aus um Dir komplett helfen zu können.
    Aber egal ich will mal anfangen.

    Zu 1 bei deinem allgemeinem Vorgehen.

    Um ein Phase Correct PWM-Signal zu erzeugen bedarf es keines Interrupts. Es wird bei einem Match zwischen TCTN2 und OCR2 der Pin
    OC2 ( Pin 17 => PortB3 ) je nach Konfiguration durch die Bits COM21 und COM20 ( Tabelle 17.5 Seite 122 ) gesteuert.

    Zu 2. korrekt.

    Zu 3. OCR2 enthält den Wert für den MATCH. OC2 ist der Pin. Der Zähler zählt dann trotzem weiter bis MAX und danach bis BOTTOM usw.

    Zu 4. Ja mit den Bits COM21 und COM20 siehe Tabelle 17.5 Seite 122 wird dies eingestellt.

    Zu 5. Ist mir nicht ganz klar wie Du das meinst. Dein PWM-Signal wird ja an PortB3 ausgegeben. Um dies zu vervielfachen, muß extern noch ein Baustein angefügt werden.

    Ich denke hiermit auch die Fragen die Dir auf der Seele brennen wenigstens Teilweise beantwortet zu haben.

    Bernd_Stein
    CRS Robotics A255, TRONXY X3A, TinkerCAD, c´t-Lab, ProfiLab Expert, AVR8 Assembler

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    19.04.2011
    Ort
    Aachen
    Alter
    34
    Beiträge
    22
    Hallo Bernd,

    Danke für deinen Beitrag, damit ist jetzt schon einiges klarer. Vorallem das mit den Registern und Pins und Ports, aber ich muss schon sagen, dass ich gar nicht sooo weit daneben war :-D

    Zitat Zitat von Bernd_Stein
    Dein PWM-Signal wird ja an PortB3 ausgegeben. Um dies zu vervielfachen, muß extern noch ein Baustein angefügt werden.
    Hmm, das scheint ein größeres Problem für mich zu werden, als zuerst gedacht.
    Doch verfolgen wir mal einen anderen Denkansatz, quasi eine Software-Hardware-PWM-Mischung.
    Der Timer zählt ja immer hoch und runter und schaltet bei einem MATCH den PORTB3 um. Jedoch wird bei einem MATCH doch auch ein Interrupt geworfen und an dieser Stelle könnte ich doch manuell auch den kompletten PORTB und D - so wie ich es brauche - umschalten, oder nicht?

  4. #4
    Erfahrener Benutzer Roboter-Spezialist Avatar von Bernd_Stein
    Registriert seit
    19.09.2008
    Ort
    Deutschland : Nordrhein-Westfalen ( NRW )
    Alter
    53
    Beiträge
    407
    Zitat Zitat von Eroli Beitrag anzeigen
    Hallo Bernd,
    ...
    Hmm, das scheint ein größeres Problem für mich zu werden, als zuerst gedacht.
    Doch verfolgen wir mal einen anderen Denkansatz, quasi eine Software-Hardware-PWM-Mischung.
    Der Timer zählt ja immer hoch und runter und schaltet bei einem MATCH den PORTB3 um. Jedoch wird bei einem MATCH doch auch ein Interrupt geworfen und an dieser Stelle könnte ich doch manuell auch den kompletten PORTB und D - so wie ich es brauche - umschalten, oder nicht?
    Nein das heißt Ja. Es ist gar kein Problem, so wie Du es schreibst, hast Du es schon gelöst. Habe Dich da wohl etwas auf den Holzweg geschickt mit dem zusätzlichen Baustein.

    Bernd_Stein

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    19.04.2011
    Ort
    Aachen
    Alter
    34
    Beiträge
    22
    Hallo Bernd,

    Es ist gar kein Problem, so wie Du es schreibst, hast Du es schon gelöst. Habe Dich da wohl etwas auf den Holzweg geschickt mit dem zusätzlichen Baustein.
    Gut, schonmal beruhigend.

    Ich bin gerade dabei alles auszutesten und hier mal ein Snippet:
    Code:
    	ldi temp, 0x01	; Zur Kontrolle die ersten beiden LEDs einschalten
    	out PORTB, temp
    	out PORTD, temp
    
    	ldi temp, 1<<OCIE2 | 1<<TOIE1 | 1 <<TOIE0	; Timer0-Overflow und Timer1-Overflow und Timer2-Compare "erlauben"
    	out TIMSK, temp
    	ldi temp, 1 << WGM21 | 1 << CS22 | 1 << CS21 | 1 << CS20	; Phasenkorrekte PWM und Prescaler setzen
    	out TCCR2, temp
    	ldi temp, 0xFF	; Irgendein Startwert fuer OCR2 (Unsere Helligkeit: 0xFF entspricht volle Helligkeit)
    	out OCR2, temp
    Leider bleibt die LED an PortB3 die ganze Zeit aus (auch wenn ich OCR2 mit 0x00 lade)...

    Irgendeine Idee?


    EDIT: Ich musste COM20 noch auf 1 setzen, damit beim CompareMatch auch getoggled wird....Ein Erfolgserlebnis
    Geändert von Eroli (19.04.2011 um 18:20 Uhr)

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    19.04.2011
    Ort
    Aachen
    Alter
    34
    Beiträge
    22
    Hallo nochmal,

    ich weiß nun, dass es eigentlich klappen müsste, denn wenn ich den Prescaler entsprechend hochsetze, z.B. 1024, dann sehe ich die LED flackern. Wenn ich den Prescaler soweit runtersetze, dass ich kein flackern mehr sehe (derzeit Prescaler 64), dann kann ich leider keine Helligkeitsunterschiede feststellen, egal ob ich OCR2 mit 0xFF oder 0x00 lade...
    Das wird wohl an der logarithmischen Helligkeitswahrnemung unseres Auges liegen, was ich auf Mikrocontroller.net gelesen habe, damit unser Auge einen möglichst großen Helligkeitsbereich wahrnehmen kann.

    Gibt es da vielleicht noch einen Trick um doch irgendwie deutlichere Ergebnisse zu erzielen?

    Mein Code sieht derzeit so aus:
    Code:
    	ldi temp, 0x01	; Zur Kontrolle die ersten beiden LEDs einschalten
    	out PORTB, temp
    	out PORTD, temp
    
    	ldi temp, 1<<OCIE2 | 1<<TOIE1 | 1 <<TOIE0	; Timer0-Overflow und Timer1-Overflow und Timer2-Compare "erlauben"
    	out TIMSK, temp
    	ldi temp, 1 << COM20 | 1 << WGM21 | 0 << CS22 | 1 << CS21 | 0 << CS20	; Phasenkorrekte PWM und Prescaler setzen
    	out TCCR2, temp
    	ldi temp, 0x00	; Irgendein Startwert fuer OCR2 (Unsere Helligkeit)
    	out OCR2, temp
    Vielen Dank im Voraus

  7. #7
    Erfahrener Benutzer Roboter-Spezialist Avatar von Bernd_Stein
    Registriert seit
    19.09.2008
    Ort
    Deutschland : Nordrhein-Westfalen ( NRW )
    Alter
    53
    Beiträge
    407
    Hallo,

    in deinem Programm wo das OCR2-Register mit dem Wert Null lädst, wird dadurch ein Dauer-Low-Signal oder je nachdem ob invertiert oder nicht ein Dauer-High-Signal erzeugt.
    Im Datenblatt auf Seite 116 nach einer Formel steht dazu folgendes.

    The extreme values for the OCR2 Register represent special cases when generating a PWM
    waveform output in the phase correct PWM mode. If the OCR2 is set equal to BOTTOM, the output
    will be continuously low and if set equal to MAX the output will be continuously high for noninverted
    PWM mode. For inverted PWM the output will have the opposite logic values.

    Bernd_Stein

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    19.04.2011
    Ort
    Aachen
    Alter
    34
    Beiträge
    22
    Das ist allerdings seltsam, dann müsste bei 0x00 die LED immer aus sein und bei 0xFF immer an, aber genau das ist nicht der Fall. Die LED leuchtet immer mit derselben Helligkeit.
    Stimmt vielleicht doch etwas mit meiner PWM nicht?
    Warum konnte ich denn ganz klar ein blinken/flackern mit größerem Prescaler feststellen?

  9. #9
    Erfahrener Benutzer Roboter-Spezialist Avatar von Bernd_Stein
    Registriert seit
    19.09.2008
    Ort
    Deutschland : Nordrhein-Westfalen ( NRW )
    Alter
    53
    Beiträge
    407
    Zeig uns doch mal dein ganzes Programm.
    Ein Oszilloskop scheinst Du ja leider nicht zu besitzen, da könnte man schön sehen was Überhaupt passiert.
    Versuche mit Prescaler auf 1024 brachten doch Erfolg. Es gibt ja noch die Möglichkeit den Systemtakt zu verringern.
    Entweder durch einen anderen Quarz oder durch einen Vorteiler. Dazu muß man glaube ich an den FUSE-Bits etwas ändern.
    Da sollte man jedoch gur aufpassen, sonst kann es passieren das der µC nicht mehr Ansprechbar ist.

    Bernd_Stein

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    19.04.2011
    Ort
    Aachen
    Alter
    34
    Beiträge
    22
    Gerne, das ist allerdings schon etwas umfangreicher. Bitte entschuldigt auch, wenn es nicht aufgeräumt ist, bin ja noch mitten im Testen und baue deswegen oft um...
    Das prog-Register wird am Anfang übrigens mit 4 geladen, damit ich direkt im Fading-Programm bin und testen kann. Normalerweise wird das Register mit 0 geladen...

    Hier der Code
    Code:
    ;**********************************************************************************
    ;Beschreibung:
    ;Dieses Programm lässt verschiedene "Licht-Programme" an PortB und Port D des
    ;des Mikrocontrollers ablaufen. Timer1 ist der "Programm-Timer" und
    ;Timer0 der BlinkTimer für die Programme. Timer2 dient zum LED-Fading als PWM.
    ;**********************************************************************************
    
    .include "m8def.inc"  ;Die Definitionsdatei des ATmega8 einfügen.
    
    .def temp   	= R16	;Es werden in diesem Programm 2 Arbeitsregister benötigt.
    .def temp2  	= R17	;benötigt: R16 und R17 (ginge auch mit nur einem).
    .def prog		= R18	;Aktuelles Programm
    .def runs		= R19	;Erster Timerdurchlauf
    
    rjmp RESET ; Reset Handler
    reti	; IRQ0 Handler
    reti	; IRQ1 Handler
    rjmp Timer2_CompareHandler	; Timer2 Compare Handler	=> Zur LED-Dimmung
    reti	; Timer2 Overflow Handler	
    reti	; Timer1 Capture Handler
    reti	; Timer1 CompareA Handler
    reti	; Timer1 CompareB Handler
    rjmp Timer1_Overflow	; Timer1 Overflow Handler		=> Programmwechsel
    rjmp Timer0_Overflow	; Timer0 Overflow Handler		=> zyklischer Programmablauf (blinken, aufsteigend, absteigend, ...)
    reti	; SPI Transfer Complete Handler
    reti	; USART RX Complete Handler
    reti	; UDR Empty Handler
    reti	; USART TX Complete Handler
    reti	; ADC Conversion Complete Handler
    reti	; EEPROM Ready Handler
    reti	; Analog Comparator Handler
    reti	; Two-wire Serial Interface Handler
    reti	; Store Program Memory Ready Handler
    
    reset:
    ldi temp, LOW(RAMEND)	;Initialisieren des StackPointers:
    out SPL, temp
    ldi temp, HIGH(RAMEND)
    out SPH, temp
    
    ;============================ Int. Oszillator kalibrieren ============================
    ldi temp, $C2		;Diesen Wert im STK500-Steuerpanel ablesen unter "Advanced" (dort wird	
    out OSCCAL, temp 	;auch die gewünschte Frequenz des int. Oszillators eingestellt).
    
    ;============================ Timer0 ============================	(Erstmal auskommentiert, denn Timer0 soll in Timer1 gestartet werden)
    ;ldi temp, 0b101 ;Timer0 starten mit Vorteiler 1:1024 (Teilt die Blinkfrequenz durch 1024)
    ;out TCCR0, temp ;TCCR0 ist das Kontrollregister des Timers 0
    
    ;============================ Timer ============================
    ldi temp, 1<<TOIE1 | 1 <<TOIE0	; Timer0-Overflow und Timer1-Overflow "erlauben"
    out TIMSK, temp
    
    ldi temp, 0xFF			; Timer1 "vorspulen"
    out TCNT1H, temp
    ldi temp, 0xFE
    out TCNT1L, temp
    ldi temp, 1<<CS12|1<<CS10	;Timer1 starten mit Vorteiler 1:1024 (Teilt die Frequenz durch 1024)
    ;ldi temp, 1<<CS11	; nur zu Debug-Zwecken
    out TCCR1B, temp
    
    
    ser temp				;Arbeitsregister "temp" mit Einsern füllen.
    out DDRB, temp			;Datenrichtungsregister des Ports B mit Einsern aus "temp" füllen (= alle Pins des Ports als AUSGANG)
    out PORTB, temp			;Alle Pins des Ports auf's High-Level bringen
    
    out DDRD, temp			; Alle Pins von PortD als Ausgang festlegen
    out PORTD, temp			; Alle Pins auf HIGH setzen
    
    ldi prog, 4				; Bei Programm 0 beginnen
    
    
    sei		;Interrupts freigeben
    ;------------------------------
    
    ; ============================ Hauptprogramm ============================
    loop:	
    	;Warten auf Timer0/1-Überlauf in einer Endlosschleife.
    rjmp loop
    
    ; ============================ Hauptprogramm Ende ============================
    
    
    
    ; ============================ Programmwechsel-Timer ============================
    Timer1_Overflow:
    push temp		    ; Sichern von "TEMP" im Stack
    in	 temp, SREG		; Einlesen des SREG 
    push temp	    	; Schreiben von  SREG  im Stack (KOPIE)
    
    cpi prog, 5			; Programmüberlauf?
    BRGE resetProg
    rjmp continue
    resetProg:
    	CLR prog
    continue:
    ldi temp, 0b000		; Timer0 beenden (Kein Blinken)
    out TCCR0, temp
    
    ldi temp, 0xFF		; LEDs jetzt an
    out PORTB, temp
    out PORTD, temp
    ldi runs, 0
    
    cpi prog, 0
    brne Prog1
    	;Prog0 ausfuehren: LEDs an (schon geschehen)
    	rjmp ende
    Prog1:
    	cpi prog, 1
    	brne Prog2
    	;Prog1 ausfuehren: LEDs blinken
    	ldi temp, 0xFE
    	out TCNT0, temp
    	ldi temp, 0b101 ;Timer0 starten
    	out TCCR0, temp
    	rjmp ende
    Prog2:
    	cpi prog, 2
    	brne Prog3
    	;Prog2 ausfuehren: LEDs absteigend
    	ldi temp, 0xFF
    	out TCNT0, temp
    	ldi temp, 0b101 ;Timer0 starten mit Vorteiler 1:1024 (Teilt die Blinkfrequenz durch 1024)
    	out TCCR0, temp
    	rjmp ende
    Prog3:
    	cpi prog, 3
    	brne Prog4
    	;Prog3 ausfuehren: LEDs aufsteigend
    	ldi temp, 0xFF
    	out TCNT0, temp
    	ldi temp, 0b101
    	out TCCR0, temp
    	ldi temp, 0
    	out PORTB, temp
    	out PORTD, temp
    	rjmp ende
    Prog4:
    	cpi prog, 4
    	brne ende
    	; Prog4 ausfuehren: Test-Fading
    	ldi temp, 0x01	; Zur Kontrolle die ersten beiden LEDs einschalten
    	out PORTB, temp
    	out PORTD, temp
    
    	ldi temp, 1<<OCIE2 | 1<<TOIE1 | 1 <<TOIE0	; Timer0-Overflow und Timer1-Overflow und Timer2-Compare "erlauben"
    	out TIMSK, temp
    	ldi temp, 1 << COM20 | 1 << WGM21 | 0 << CS22 | 1 << CS21 | 0 << CS20	; Phasenkorrekte PWM und Prescaler setzen
    	out TCCR2, temp
    	ldi temp, 0x00	; Irgendein Startwert fuer OCR2 (Unsere Helligkeit)
    	out OCR2, temp
    
    
    	rjmp ende
    ende:
    	inc prog
      	pop  temp      		; LESEN von SREG vom STACK (KOPIE)
      	out  SREG, temp		; Wiederherstellen von SREG
      	pop  temp      		; Wiederherstellen von "TEMP" 
      	reti
    
    ; ============================ Programmwechsel-Timer Ende ============================
    
    
    
    ; ============================ Timer0 Overflow (Blinken) ============================
    Timer0_Overflow: ;Die Blink-ISR lässt die LED am Pin 0 am PORTB (=PB0) blinken.
    push temp		    ; Sichern von "TEMP" im Stack
    in	 temp, SREG		; Einlesen des SREG 
    push temp	    	; Schreiben von  SREG  im Stack (KOPIE)
    
    ; ==== Programmreihenfolge ====
    cpi prog, 2
    breq blinken
    cpi prog, 3
    breq absteigend
    cpi prog, 4
    breq aufsteigend
    cpi prog, 5
    breq fading
    rjmp end
    
    blinken:
    	sbic PORTB, 0		;Nächsten Befehl überspringen, falls Bit0 abm PortB ist AUS (= LED ist EIN)	
    		rjmp led_ein	;Ansonsten LED einschalten (s. unten).
    	sbis PORTB,0		;Überspringen, falls Bit0 abm PortB ist EIN (= LED ist AUS)	
    		rjmp led_aus	;Ansonsten LED ausschalten (s. unten).
    
    	led_ein:		;Zum Einschalten:
    		ldi temp, 0x00
    		out PORTB, temp
    		out PORTD, temp
    		rjmp end	;und beenden.
    	led_aus:		;Zum Ausschalten:
    		ldi temp, 0xFF
    		out PORTB, temp
    		out PORTD, temp
    		rjmp end
    
    absteigend:
    	in temp, PORTB	; Aktuellen Zustand holen
    	LSL temp		; Linksshift
    	out PORTB, temp	; Ausgeben
    	out PORTD, temp
    	cpi temp, 0
    	breq absteigend2
    	rjmp end
    absteigend2:
    	LDI temp, 0xFF
    	out PORTB, temp
    	out PORTD, temp
    	rjmp end
    
    aufsteigend:
    	in temp, PORTB	; Aktuellen Zustand holen
    	COM temp
    	LSL temp		; 0 rein
    	COM temp		; Aus reingekommener 0 eine 1 machen
    	out PORTB, temp	; Ausgeben
    	out PORTD, temp
    	cpi temp, 0xFF
    	breq aufsteigend2
    	rjmp end
    aufsteigend2:
    	LDI temp, 0
    	out PORTB, temp
    	out PORTD, temp
    	rjmp end
    
    fading:	; ==== TODO ====
    		; Hier später Helligkeit variieren
    
    end:
    	inc runs
    	rjmp exit
    
    exit:
    	pop	temp			; LESEN von SREG vom STACK (KOPIE)
    	out	SREG, temp		; Wiederherstellen von SREG
    	pop	temp			; Wiederherstellen von "TEMP" 
    	reti				; ISR beenden.
    ; ============================ Timer0 Overflow (Blinken) Ende ============================
    
    Timer2_CompareHandler:
    ; Hier später LEDs an PORTB und D togglen
    reti
    (Am interessantesten sollte wohl die Prog4-Headline oder Prog4-Marke oder Prog4-Label oder wie das heißt sein)

    Was das Programm machen soll, habe ich ja schon im ersten Post geschrieben...
    Gibt es hier eigentlich auch spezielle Assembler-Tags anstatt der generischen Code-Tags?

Seite 1 von 3 123 LetzteLetzte

Ähnliche Themen

  1. Atmega8 PWM - Timer2 - Pin17 ?
    Von hellraider im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 9
    Letzter Beitrag: 03.07.2011, 17:23
  2. Mit Atmega8 Hardware PWM mit Timer2
    Von hosti im Forum C - Programmierung (GCC u.a.)
    Antworten: 46
    Letzter Beitrag: 12.07.2009, 19:16
  3. Timer2 Atmega8
    Von Brantiko im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 17.03.2009, 08:13
  4. Problem mit dem Timer2 eines ATMega8
    Von sloti im Forum C - Programmierung (GCC u.a.)
    Antworten: 5
    Letzter Beitrag: 01.07.2008, 22:48
  5. Servosteuerung mit Timer2 Atmega8
    Von apfeldieb im Forum Motoren
    Antworten: 0
    Letzter Beitrag: 05.04.2008, 18:29

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus