-
LED-DIMM
Hallo
Kann mir wer sagen warum die LED nicht zu 100% leutchtet?
wenn ich OCR0, auf 1 stelle dann leuchtet es fast gar nicht.
wenn ich aber ORC0 auf 255 stelle, dann leuchtet die led schon etwas stärker aber dass sind keine 100%!
Kann mir wer helfen!
Hier der Code:
.include <m8535def.inc>
.org 0x0000
rjmp init
.org OC0addr
rjmp ocr
init:
sbi DDRA, 1
ldi R16, HIGH(RAMEND)
out SPH, R16
ldi R16, LOW(RAMEND)
out SPL, R16
ldi R16, 0b000000100
out TCCR0, R16
ldi R16, 0b00000011
out TIMSK, R16
ldi R17, 1
out OCR0, R17
ldi R18, 0b00000000
sei
ein:
sbi DDRA, 0
out TCNT0, R18
aus:
sei
cbi DDRA, 0
rjmp aus
OCR:
rcall ein
MFG
Michael
-
Also du machst dir das Dimmen viel schwer als es ist, nimm doch die PWM Funktion des Timers, das machts viel einfacher, und verwende bitte für deinen Einstellungen die Assemblerdirecktiven wie zB:
ldi r16, (1<<xxx) | (1<<yyy)...
das macht den Code viel schneller Verständlich, so musste ich erst im Datenblatt gucken was welches Bit bedeutet.
-
wie meinst du assemblerdirektive??
MFG
Michael
-
Das er die einzelnen Bits mit Namen nennt ...
also z.B. ldi r16, (1<<OCIE0)
out TIMSK, r16
Vorteil: auch in 2 Wochen ist der Code noch lesbar ....
-
So jetzt is besser!
jetzt isses so, wenn ich OCR0 auf 255 stelle leuchtet die led nicht
wenn ich aber OCR0 auf 1 stelle leuchtet die led aber nicht 100% warum!
Habs jetzt mit PWM funktion gemacht vom TIMER0
CODE:
.include <m8535def.inc>
.org 0x0000
rjmp init
.org OC0addr
rjmp compare
init:
ldi R16, HIGH(RAMEND)
out SPH, R16
ldi R16, LOW(RAMEND)
out SPL, R16
ldi R16, (1<<CS02) | (1<<WGM01)
out TCCR0, R16
ldi R16, 10
out OCR0, R16
ldi R16, (1<<OCIE0)
out TIMSK, R16
sei
ein:
sbi DDRA, 0
aus:
sei
cbi DDRA, 0
rjmp aus
compare:
rcall ein
BITTE UM Rückantowr
MFG
Michael
-
jetzt kann man den Code sogar lesen ;-)
Also der Code ist eher schlecht als recht, du hast einen Halb Software halb Hardware PWM geschrieben, der Mix ist eher sch*** weil du leicht nen fehler im Code bekommst, siehste ja selber geht nix wirklich. Deshalb nehme entweder einen Reinen Hardware oder eien software.
Hardware ist aber eher zu empfehlen:
Code:
.include "m8535def.inc"
.org 0x0000
rjmp init
init:
ldi R16, HIGH(RAMEND)
out SPH, R16
ldi R16, LOW(RAMEND)
out SPL, R16
ldi R16, (1<<CS00) | (1<<WGM00) | ( 1<<COM01 )
out TCCR0, R16
ldi r16, (1<<Pinb3)
out ddrb, r16
ldi r16, 128
out OCR0, r16
loop:
ldi r16, 128
out OCR0, r16
rjmp loop
Probiers mal damit, ich habs nur Simuliert, aber sollte gehen, hoffe hab nix vergessen.
-
Ich versteh den code nicht ganz! Kannst du ihn mir ein bisschen erklären bitte! Warum schaltet PINB dauert ein und aus obwohl keine rücksprungadresse da ist!? Geht dass von Timer aus?
MFG
Michael
-
Also Wenn du den OCR benutzt musst du dich weder ums High, noch ums Low setzten Bemühen, das wird Hardwareseitig gemacht --> Vorteil weil µC ja nicht weiters mit PWM-Erzeugen beschäftigt.
Und Die Register Anweisungen sind fast wie bei dir, aus dem Datasheet, PWM-Modus im Phasekorrekt-mode und fPwm = CLK Sonst nix weiter, hald der OCR-Pin als Ausgang
-
Was meinst mit HArdware! Es muss doch irgendetwas geschehen, damit er am PINB ein High ausgibt oder?
MFG
Michael
-
Nein muss nicht, das ist alles IM AVR, du musst nix machen, glaub mir, sonst wäre es ja kein Hardware-PWM ( Hardware = Im AVR eingebaut und per Software Kontrollierbar )
Den Code muss man nicht verstehen, weils ja in dem sin keinen gibt, die Befehle dienen nur dazu deine Hardware richtig zu konfigurieren, damit die macht was du willst.