www.mikrocontroller.net

Forum: Projekte & Code pwm regeln


Autor: Kay B. (newbie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
guten abend zusammen,

folgendes problem

habe einen at90s2313 4Mhz an PORTB soll das PWM anliegen zur
Helligkeits regelung der Leds und an PORTD PD.0 PD.1 sollten die Taster
zum regeln dran up dpown.

Die PWN sollte Software mäßig sein,habe schon diverse tutorials durch
forstet aber bin biss jetzt nicht schlau draus geworden,

weiss aber auch nicht so richtig wie ich dass programm schreiben
soll,sitz schon einige tage dran und es wird einfach nix.

vielleicht kann mir einer von euch helfen.

danke

mfg kay

Autor: Ludwig Wagner (lordludwig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
am besten mit 2 timern: in den timer1 kommt die dauer eines zyklus. in
timer 2 der PWM wert.

Beim überlauf von timer1 wird der pin auf 1 gesetzt und timer2
eingeschaltet, bei überlauf von timer2 wird der pin auf 0 gesetzt und
timer2 ausgeschaltet. je größer jetzt timer2 ist desto größer ist die
pulsweite.

es gilt: timer1 > timer2

Autor: Kay B. (newbie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo ludwig,

erstmal vielen dank für die antwort.

ich weis aber nicht wie ich dafür ein korrektes programm erstelle,
vielleicht besteht die möglichkeit für ein beispielprogramm (asm),
wo ich denn ein bissle üben kann.

mfg

kay

Autor: Ludwig Wagner (lordludwig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
asm kling gut...

aber heut und warscheinlich morgen nicht... hab im mom 3 projekte am
laufen und will morgen noch ne platine ätzen also wird das morgen
warscheinlich nix...

sry aber ich werds machen wenn mir keiner zuvor kommt

Autor: kay bohn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo ludwig

das eillt nicht so sehr doll, wäre toll wenn das irgendwann in der
nächsten woche irgendwann klappt, ist aber nicht so eilig.

danke erstmals für die antwort

mfg

kay

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Kay,

eine Software-PWM kannst Du relativ einfach selber programmieren.

Ein paar Tipps:

- ein Timer zählt ein Register kontinuierlich hoch
- der Register-Inhalt wird anschließend mit Deinem
  Sollwert verglichen und
  anschließend entschieden, ob der Pin HIGH oder LOW
  werden soll

PS: Beispiele für einen TIMER findest Du hier genügend


Bernhard

Autor: Kay B. (newbie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo bernhard

das mit der Software-PWM,das hört sich ja immer so einfach
da ich das aber bisher noch nicht selber gemacht habe wäre es toll mal
einen asm code vielleicht auch ein wenig kommentiert zubekommen,wenn
das denn geht.
wo ich mich denn selber mal ausprobieren kann.

mfg

kay

Autor: Ivan der Schrecklichste (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.avrbeginners.net/

Unter AVR Architecture / Timers /PWM LED demo ´
ganz rechts unten ein Link zum Beispielcode, erklärt ist es auch.

Ivanhoe

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@kay


>da ich das aber bisher noch nicht selber gemacht habe wäre es toll
>mal einen asm code vielleicht auch ein wenig kommentiert
>zubekommen,wenn das denn geht. wo ich mich denn selber mal
>ausprobieren kann.


Ich denke, viel einfacher geht es nicht    ;)

http://www.mikrocontroller.net/forum/read-4-159104.html

Wenn Du Fragen dazu hast, einfach Fragen.

Bernhard

Bernhard

Autor: Kay B. (newbie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo bernhard

dank erstmal für die antwort,,


suche eigendtlich einen beispielcode der das pwm signal an alle
ausgänge des portb pb0-pb7,abwechselnd ausgibt,
welches mit tasten gesteuert wird zb.portd tasten für up down stop,
wenn das möglich wäre.

wo ich mich dann erstmal mitbeschäftigen kann

mfg kay

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Kay

>suche eigendtlich einen beispielcode der das pwm signal an alle
>ausgänge des portb pb0-pb7,abwechselnd ausgibt


...grins...

Ich würde Dir empfehlen, dass Du mit ganz einfachen kleinen Programmen
anfängst, damit Du wenigstens ein paar Grundlagen festigst.

Schreib Dir mal ein paar kleine Programme,

1. Programm: - eine LED leuchten lassen
2. Programm: - eine LED erlischt, wenn eine Taste betätigt wird
3. Programm: - LED erlischt, wenn ein TIMER auslöst
4. Programm: - LED blinkt
5. Programm: - PWM

Investiere ein paar Stunden in diese Grundlagen,

und Du wirst Staunen, wie einfach PWM sein gehen kann

und wir werden alle stolz auf Dich sein  ;)

Wenn Du dabei Fragen hast, frag einfach, wir helfen gerne

Bernhard

Autor: Kay B. (newbie)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hallo bernhard,

habe mal ein kleines programm beigelegt ein kleines lauflicht mit
3tasten,könnte mann sicherlich elegannter lösen aber es funktioniert,
das habe ich ja schon hinbekommen,aber wie ist das wenn ich die leds
den per pwm an ab dimmen möchte, da steige ich überhaupt nich richtig
durch deshalb wäre es toll wenn man ein beispiel hätte.

mfg kay

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Kay

sieht doch schon ganz vernünftig aus   :)


--------------------------

Die Unterprogramme würde ich so vereinfachen:
Hier anhand "ll1:"

ll1:
ldi temp, 0b00000001
out PORTB, temp
rcall warten
ldi temp, 0b00000010
out PORTB, temp
rcall warten
ret

Denn es wiederholt sich ja nur alles

--------------------------


Und nun brauchst Du nur einen Timer in Deinem Programm zu aktivieren,
ich hiffe, dieser µC hat auch einen?

Autor: Kay B. (newbie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo bernhard,

der at90s2313 hat glaube ich 2 timer1u.2

1.aber mit welchen befehlen ich die timer sezten muss,
2.wo ich das einfügen muss(welche zeile)
3.wie ich die register defieniere für die timer pwm
da komm ich nich so richtig mit



ich glaub ich werd das nie begreifen sitze schon einige tage dran, hab
schon stundenlang gegooglet.

mfg kay

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>der at90s2313 hat glaube ich 2 timer1u.2

ich habe sein Datenblatt nicht, ich glaube, ich müsste es mir
ersteinmal besorgen   ;)

_______________________________

Diesen ASM- CODE habe ich für den ATmega8 geschrieben


.include "m8def.inc"

.equ timerwert=-100 ;100 Timerschritte bis zum Überlauf
.def tsw=r8        ;Timer Startwert (Reload)
.def TEMP   = R16
.def AUSGANG= R17

.def SL=r24        ;Working Low
.def SH=r25        ;working high



rjmp START          ; Reset Handler
reti ;rjmp EXT_INT0   ; IRQ0 Handler
reti ;rjmp EXT_INT1   ; IRQ1 Handler
reti ;rjmp TIM2_COMP  ; Timer2 Compare Handler
reti ;rjmp TIM2_OVF   ; Timer2 Overflow Handler
reti ;rjmp TIM1_CAPT  ; Timer1 Capture Handler
reti ;rjmp TIM1_COMPA ; Timer1 CompareA Handler
reti ;rjmp TIM1_COMPB ; Timer1 CompareB Handler
reti ;rjmp TIM1_OVF   ; Timer1 Overflow Handler
rjmp TIM0_OVF         ; Timer0 Overflow Handler
reti ;rjmp SPI_STC    ; SPI Transfer Complete Handler
reti ;rjmp USART_RXC  ; USART RX Complete Handler
reti ;rjmp USART_UDRE ; UDR Empty Handler
reti ;rjmp USART_TXC  ; USART TX Complete Handler
reti ;rjmp ADC        ; ADC Conversion Complete Handler
reti ;rjmp EE_RDY     ; EEPROM Ready Handler
reti ;rjmp ANA_COMP   ; Analog Comparator Handler
reti ;rjmp TWSI       ; Two-wire Serial Interface Handler
reti ;rjmp SPM_RDY    ; Store Program Memory Ready Handler


;--------------------------------------------------------------
START:
 ldi SH,high(RAMEND)   ;Stackpointer initialisieren
 out SPH,SH
 ldi SH,low(RAMEND)
 out SPL,SL


;Timer Startwert für später sichern und in Timer schreiben
 ldi temp,timerwert
 mov tsw,temp
 out tcnt0,tsw


;Vorteiler
;0b00000000 TIMER aus
;0b00000001 CLOCK=TAKTFREQUENZ
;0b00000010 CLOCK=TAKTFREQUENZ / 8
;0b00000011 CLOCK=TAKTFREQUENZ / 64
;0b00000100 CLOCK=TAKTFREQUENZ / 256
;0b00000101 CLOCK=TAKTFREQUENZ / 1024
;0b00000110 Abfallende Flanke Pin T0
;0b00000111 Steigende  Flanke Pin T0
  ldi temp,0b00000001
   out tccr0,temp

;Timer0-Überlauf-Int aktivieren
;OCIE2  =>
;TOIE2  => Interrupt bei Überlauf (TIMER2)
;TICIE1 => Interrupt bei Capture
;OCIE1A => Interrupt bei Erreichen Stand in A
;OCIE1B => Interrupt bei Erreichen Stand in A
;TOIE1  => Interrupt bei Überlauf (TIMER1)
;TOIE0  => Interrupt bei Überlauf (TIMER0)
   ldi temp,(1<<toie0)
   out timsk,temp

; Port B als Ausgang konfigurieren
  ldi temp,0b11111111
  out DDRB, temp
; Port B auf L schalten
  ldi Ausgang, 0b00000000
  out PORTB,AUSGANG

;Interrupts freigeben
sei

;--------------------------------------------------------------
LOOP:
rjmp LOOP


;--------------------------------------------------------------
TIM0_OVF:
  push  TEMP    ; Sichern von "TEMP" im Stack
  in  TEMP,SREG    ; Einlesen des SREG
  push  TEMP    ; Schreiben von  SREG  im Stack (KOPIE)

;Timer0-Startwert setzen
    out tcnt0,TSW

; Port B umschalten
  com AUSGANG
  out PORTB,AUSGANG


pop  TEMP      ; LESEN von SREG vom STACK (KOPIE)
out  SREG,TEMP    ; Wiederherstellen von SREG
pop  TEMP      ; Wiederherstellen von "TEMP"

reti

________________________________________

________________________________________


wichtig ist:

 ldi temp,(1<<toie0)
 out timsk,temp


 ldi temp,timerwert
 mov tsw,temp
 out tcnt0,tsw


;Interrupts freigeben
  sei

-----------------------

Und so einfach funktioniert ein Timer, einmal initialisiert, geht er
alle paar ms in seine Interrupt-Routine und arbeitet diese gnadenlos ab
:)

Autor: Kay B. (newbie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo berhard,

erstmal danke, werde ich morgen gleich mal ausprobieren muss gleich zur
arbeit,
wie kann ich denn in dem prg ein paar tasten einbinden,

hoffentlich nerve ich jetzt nich.

mfg kay

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>wie kann ich denn in dem prg ein paar tasten einbinden

...so wie Du es in Deinem Programm schon getan hast  :)

sbic PIND,PD0     ; PORTD Pin PD0 (Taster S1) auswerten
rcall ....

"sbic" Skip if Bit in I/O Register Cleared(Portbit=0)

Assembler macht erst richtig Spass,
wenn man jeden Befehl richtig versteht,
sonst erkennt man die Zusammenhänge nicht.


>hoffentlich nerve ich jetzt nich.
nein, nur keine Panik.

Ich hoffe nur, dass Du in ein paar Tagen Deine PWM selber schreiben
kannst, aber ohne Fleiß kein ....  ;)


Bernhard

Autor: Kay B. (newbie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke nochmals

kann erst morgen wieder antworten muss jetzt zur arbeit

guten abend

mfg kay

Autor: wjliu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi
   I have some questions to ask you!I use the Atmega128's 16-bit fast 
pwm,but i could not realize,I need you help!

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.