Guten Morgen
ich bin AVR-Anfänger und möchte ein Programm schreiben, mit dem man PWM
"auf Knopfdruck" ändern kann. Als Anhaltspunkt habe ich die Programme
vom AVR-Tutorial auf dieser Seite hier verwendet: Das erste (zu finden
im Kapitel Interrupts) schaltet eine LED an und aus, das zweite (zu
finden bei PWM) war eine Reihe von LEDs mit unterschiedlicher Dimmung.
So, jetzt zu meinem Programm: Der Tasterdruck sorgt für die fallende
Flanke bei PD2 bzw. PD3 und löst INT0 bzw. INT1 aus. Diese externen
Interrupts machen nichts anderes als die Bedingung, die LED
auszuschalten, zu verändern. (Den PWM-Wert sozusagen)
Das übliche Programm funktioniert so wie "PWM in Software", nämlich,
dass bei einem Timer-Overflow der PWMCounter mit dem PWM-Wert verglichen
wird und ggf. die LED an bleibt bzw. aus geschalten wird. So - soviel
dazu.
Im Debugging-Modus von AVR-Studio funktioniert alles wunderbar!?
Komischerweise funktionierts auf dem Board (STK500, was sonst) nicht.
Vielen Dank für alle hilfreichen Antworten, hier noch der Code.
P.S.: Mir ist bewusst, dass bei dem Programm die Entprellung der Taster
nicht berücksichtigt wird, daran liegts aber auch nicht.
Memmels schrieb:> ldi temp, 0x00> out DDRD, temp ;Port D auf Eingang
Brauchen deine Taster keinen Pullup?
> loop: rjmp loop ;leere Endlosschleife
Dein µC tut die ganze Zeit nichts anderes als Däumchen drehen. Das muss
mir mal wer erklären, warum man da Tasten über Interrupts abfragen muss.
Wahrscheinlich deshalb, damit man mehr Fehlerquellen hat. Wär ja auch
sonst zu einfach.
zu den Pull-Ups: Hab ich bei den bisherigen Testprogrammen nicht
gebraucht und dachte deswegen, dass auf dem Board evtl "externe"
Wiederstände drauf sind.
Zur Endlosschleife: Jo, richtig. Er wartet bis der Timer-Overflow
Interrupt kommt oder bis nen Taster gedrückt wird. Wo ist denn jetzt das
Problem dabei? Verstehe ich nicht ganz :) Was wäre denn eine
funktionsfähige Alternative? Sorry, dass ich da anscheinend noch etwas
planlos bin, eine Erklärung wäre super!
Danke
Hi
>Brauchen deine Taster keinen Pullup?
Sind auf dem STK500.
>Im Debugging-Modus von AVR-Studio funktioniert alles wunderbar!?>Komischerweise funktionierts auf dem Board (STK500, was sonst) nicht.
Was funktioniert?
> ori temp, 0xFF ;wenn nicht, LEDs aus
Ab der Stelle bleibt temp für alle Ewigkeit auf $FF und
>SetBits:> out PORTB, temp ;Neue Bitbelegung am Port ausgeben
damit bleiben die LEDs genau so lange aus.
MfG Spess
Ach, na klar vielen Dank! Für alle, die es noch interessiert: Einfach in
WorkPWM die LEDs vorher anmachen. Das sieht dann so aus.
1
WorkPWM:
2
ldi temp, 0x00 ;LEDs an
3
cp PWMCount, pwm1 ;wenn Zähler kleiner PWM-Wert
4
brlo SetBits ;nach SetBits springen, LEDs bleiben an
5
ori temp, 0xFF ;wenn nicht, LEDs aus
Bisher ist man allerdigns auf 2 Taster begrenzt, weil es ja über die
Interrupts vll nicht ganz so elegant ist (Int0 und Int1). Falls sich
jemand noch die Mühe machen möchte, wie wäre das ganze jetzt mit
"beliebig vielen" Tastern umsetzbar? Das ist mir noch ein Rätsel!