PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LED-Fading Attiny45



Chandler
13.12.2014, 09:03
Hallo,
ich möchte mit dem Attiny eine LED heller und dunkler werden lassen. Aber sie bleibt bei mir ganz dunkel


#define F_CPU 8000000UL
#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h>

uint8_t i;

int main(void) {
i = 0;
DDRB |= (1<<PB0);
PORTB &= ~(1<<PB0);
DDRB |= (1 << PB1);
PORTB &= ~(1<<PB1);

TCCR0A |= 1<<COM0A1 | 1<<WGM01 | 1<<WGM00;
TCCR0B |= 1<<WGM02 | 1<<CS02 | 1<<CS00;
OCR0A = 256-1;
OCR0B = 0;
sei();

while(1)
{
for (i=0; i<250; i++){
OCR0B = i;
_delay_ms(10);
}
for(i=250; i>0; i--){
OCR0B = i;
_delay_ms(10);
}
}
}


Eigentlich denke ich, dass der Pin mit OC0A (PB0) alle 32ms auf High gesetzt wird (OCR0A=255) und sobald OCR0B seinen Wert erreicht hat, wird der Pin wieder auf Low gesetzt.
in der whil-Schleife setze ich OCR0B ja immer höher und anschließend immer niedriger. Damit möchte ich eigentlich, dass die LED heller und dunkler wird.
Aber meine LED bleibt komplett aus :(
habe ich noch etwas vergessen?

Chandler

Siad
14.12.2014, 06:38
OCR0A ist deine obere Grenze bist zu der der timer hinauf zählt.
OC0B wird beim Erreichen von OCR0B gelöscht und beim Überlauf (OCR0A + 1) wieder gesetzt.
Du müsstest also die LED an OC0B hängen und COM0B1 anstatt COM0A1 setzen. Dann würde das Ganze prinzipiell einmal funktionieren.

Ansonsten:
Wieso setzt du OCR0A extra als obere Grenze wenn du sowieso bis 255 zählst und betreibst das Ganze nicht gleich im mode 3 laut Datenblatt?
Interrupts musst du jetzt auch nicht global freischalten wenn du gar keinen Interrupt behandelst.
Die Variable i als globale Variable ist jetzt auch unnötig.