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
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
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
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
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
@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
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
http://www.avrbeginners.net/ Unter AVR Architecture / Timers /PWM LED demo ´ ganz rechts unten ein Link zum Beispielcode, erklärt ist es auch. Ivanhoe
@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
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
@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
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
@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?
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
>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
:)
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
>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
danke nochmals kann erst morgen wieder antworten muss jetzt zur arbeit guten abend mfg kay
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!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.