PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LED-DIMM



Exodus
09.06.2006, 16:26
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

teslanikola
09.06.2006, 17:35
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.

Exodus
09.06.2006, 18:37
wie meinst du assemblerdirektive??

MFG
Michael

Hanni
09.06.2006, 19:13
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 ....

Exodus
09.06.2006, 21:37
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

teslanikola
10.06.2006, 13:28
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:


.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.

Exodus
10.06.2006, 13:46
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

teslanikola
10.06.2006, 14:14
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

Exodus
10.06.2006, 15:15
Was meinst mit HArdware! Es muss doch irgendetwas geschehen, damit er am PINB ein High ausgibt oder?

MFG
Michael

teslanikola
10.06.2006, 20:46
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.

Exodus
10.06.2006, 21:36
Und was muss ich machen, damit ich am PINB die PWM ausgeben kann?

MFG
Michael

Hanni
11.06.2006, 10:01
Hallo,

@ Exodus: Versuch dich bitte einmal klar auszudrücken. Schon alleine mit deiner letzten Antwort kann ich absolut nix anfangen und irgendwie zieht sich dieses durch alle deine Treads / Antworten ...


Und was muss ich machen, damit ich am PINB die PWM ausgeben kann?

Es gibt nunmal keinen PINB sondern nur die Pins B0 - B7.
Des weiteren lege ih dir mal nahe, zu dieser Problematik das Datenblatt zu lesen (den Abschnitt mit den Timern) weil dort eben wirklich alles haarklein dazu erklärt ist.

Grüße,

da Hanni.