mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR/ASM Tip zu abgeänd. PWM-Helligkeit Tut. (Helligkeit über Taster)


Autor: Manuel Ted (tedd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Ich versuche mich gerade an dem PWM Tutorial:
http://www.mikrocontroller.net/articles/AVR-Tutorial:_PWM

Das untere CodeBeispiel zeigt ja wie die LED's unterschiedlich hell 
leuchten.

Ich nutze ein STK500 mit ATmega8515(L) und soweit klappt das auch,  das 
wichtigste habe ich wohl noch nicht verstanden und zwar das mit dem 
Interrupt aber das soll erstmal egal sein...

Ich habe jetzt versucht, dass ich die Helligkeitsstufen (erstmal von der 
ersten LED) über die Taster hochlaufen lassen kann um somit die 
Helligkeit der jeweiligen LED ändern zu können nur klappt das ganze 
nicht - es tut sich nämlich nichts wenn ich den Taster drücke und ich 
vermute, dass es daran liegt, dass ich das ganze irgendwie auch mit 
einem Interrupt machen muss!?

folgenden Code habe ich eingefügt
loop:           
    in     temp, PIND        ; Lese Status der Taster in temp ein
    CPI   temp, 0b00000001    ; Prüfe ob Taster 1 gedrückt ist...
    BREQ   inc_ocr_1        ; ... wenn ja, dann Springe zu inc_ocr_1
    
    rjmp    loop

inc_ocr_1:
    inc ocr_1            ; inkrementiere ocr_1
    CPI ocr_1, 127           ; Prüfe ob Helligkeitswert überschritten
    BRLO loop            ; wenn nicht springe zurück zu loop
    ldi ocr_1, 0          ; wenn doch, setze ocr_1 = 0
    rjmp loop            ; zurück zu loop

Danke schonmal für eure Hilfe und besten Gruß,
Manuel

Autor: Manuel Ted (tedd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, dass ich das Thema wieder hochhole, aber ich glaube nicht, dass 
mir hier niemand eine kurze Antwort liefern kann :)
Also woran liegt's?

Danke und Gruß,
Manuel

Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bist du sicher, dass der Taster nach VCC schaltet und alle anderen Pins 
auf Masse liegen? Sonst bekommst du garantiert nicht 0b00000001 in 
PIND...

Üblicherweise macht man das in Assembler mit "skip if bit in 
i/o-register set" bzw. "...cleared" - wie der Befehl in Kurzform heißt, 
weiß ich nicht, ich habe lange nicht mehr in Assembler programmiert.

Nächstes Problem: Wie oft (wie viele Millionen Mal pro Sekunde) wird das 
angesprungen? Wie schnell würde er also hochzählen?

MfG, Heiko

Autor: ArRaY (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke auch, dass es an dem 0x00000001 liegt.
Probier mal ein andi temp, 0b00000001 davor zu schreiben zum test...

Autor: Manuel Ted (tedd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Hilfe ihr beiden! Es lag wirklich daran. ouh mman - sorry, 
dass ich sowas scheinbar einfaches übersehen habe.

Heiko wrote:
> Nächstes Problem: Wie oft (wie viele Millionen Mal pro Sekunde) wird das
> angesprungen? Wie schnell würde er also hochzählen?
>
> MfG, Heiko

Tatsächlich... Wenn ich den Taster drücke, zählt der so schnell hoch, 
dass es eher Zufall ist, was für eine Helligkeit die LED dann hat.

Wie verlangsame ich das ganze jetzt am praktischsten?
Muss ich jetzt eine Vorschleife in
inc_ocr_1:
einbauen, die bis zu einem bestimmten Wert läuft bis dann inkrementiert 
wird?
Wenn ja, welcher Wert wäre denn sinnvoll?
Ahja der Systemtakt, dürfte glaube ich 1MHz sein? Aufjedenfall steht im 
Datenblatt, dass der ATmega8515 mit diesem als Standardeinstellung 
ausgeliefert wird und ich habe da denke ich noch nichts dran geändert.
Läuft der Zähler dann mit 1/1000000 s hoch?

Danke und Gruß,
Manuel

Autor: Manuel Ted (tedd)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Also, dass Problem was ich hatte, habe ich jetzt so gelöst, dass ich bei 
jedem Interruppt der durch einen Overflow aufgerufen!? wird eine 
Variable hochzählen lasse. Die Variable wirkt dann wie ein Prescaler?! 
Wenn die Variable hochgezählt ist, kommt noch ein kleiner Zähler (weil 
ich mit dem ersten Zähler nicht höher als 255 zählen kann) der auch 
hochgezählt haben muss und dann wird erst die Helligkeitsstufe der LED 
um 1 inkrementiert...

Funktioniert soweit eigtl so wie ich das wollte, nur kommt mir das etwas 
unschön vor, weil ich jetzt nur für das hochzählen 2 weitere Register 
bzw Variablen belege und auch 2 schleifen habe.
Der Grund warum ich nicht einfach den Prescaler vom Counter0 geändert 
hab ist ja, dass der glaube ich schon passend für die PWM eingestellt 
ist, also kann ich den nicht ändern, oder?

Hatte auch noch überlegt den 16Bit Counter irgendwie einzustellen aber 
das war mir grad zu hoch und extra einen 16Bit Counter für diese 
"einfache" Aktion schien mir dann auch ein bisschen zu viel Aufwand.

Kann man das vielleicht alles in eine Schleife in der man auch nur 1 
Register nutzt packen oder sonst irgendwie eleganter machen?

Der ASM-Code so wie er jetzt funktioniert ist angehängt.

Danke und Gruß,
tedd

Autor: Manuel Ted (tedd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!
Ich wollte nochmal nachfragen, ob das wirklich eine sinnvolle Lösung mit 
den 2 Registern zum "Vorzählen" ist, aber was anderes fällt mir auch 
nicht ein.
Wenn ich das richtig verstanden habe ist im ATmega8515 auch ein 16 Bit 
Register was ich dafür benutzen könnte anstatt 2 8-bit Register. Nur ist 
fraglich ob das dann nicht "überdimensioniert" ist.
Aber bei so einem kleinen Programm muss man sich da ja eh nicht wirklich 
Gedanken machen.
Falls es sonst noch irgendwelche Anregungen zum ProgrammCode gibt - 
immer her damit - kann ich als Anfänger gut gebrauchen ;)

Danke und Gruß,
manuel

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.