PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : CTC - Pin toggeln nicht möglich?



Spurius
20.07.2008, 20:14
Hallo,

ich will für eine Infrarotanwendung später 36khz am PB1 von einem M8 anliegen haben, im Moment soll lediglich eine LED blinken. Ich wollte das mit dem CTC von dem 8bit-Timer realisieren, aber es klappt nicht, hier mal der Code:


#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>


int main(void)
{
TCCR2 = 00011111;
OCR2 = 250;
DDRB = (1<<PB1);
}


Müsste eigentlich gehen oder? F_CPU ist 16Mhz.

Gruss
Spurius

uwegw
20.07.2008, 20:39
Na ja, dein Programm läuft einmal durch, und was dann passiert, ist ungewiss. Du solltest es am Ende mit einer Endlosschleife anhalten.

Schreib die Werte für die Register doch lieber mit den Einzelbits hin. Sonst sieht keiner, welche Bits da eigentlich gesetzt werden.

robocat
20.07.2008, 20:43
gibt dein compiler da keine warnungen?
int main sollte der vollständigkeit halber einen returnwert haben, den es de facto aber nie braucht, weil das programm vorher
for(;;); in einer endlosschleife bleibt, die bei dir aber nicht existiert. und zuletzt wird TCCR2 wahrscheinlich kein binärwert zugewiesen, sondern EDIT:oktal 11111. ausserdem solltest du vielleicht besser die schreibweise
TCCR2 = (1<<registername) | ... ; verwenden, denn die wenigsten leute haben die bedeutung der einzelnen bits im kopf... man kann dir dann schneller helfen..

gruesse

EDIT: danke für den hinweis @sternst, habs korrigiert

McJenso
20.07.2008, 20:44
Hallo,

was passiert, wenn das Programm vom Controller abgearbeitet wurde?
Du möchtest noch eine Endlosschleife wie z.B. while (1) {};einfügen.
Nett währe es auch, die int main () mit einem return 0; abzuschließen.

Was sagt der Compiler den hierzu? TCCR2 = 00011111;
Du solltest die Compiler Warnungen ernst nehmen.
Wenn du binär darstellen möchtest ist das 0b0001111;
Besser im Sinne von Übersichtlicher empfinde ich die Schreibweise TCCR2 = (1<<COM20)|(1<<.....

Gruß

Jens

sternst
20.07.2008, 20:47
und zuletzt wird TCCR2 wahrscheinlich kein binärwert zugewiesen, sondern dezimal 11111
Nein, oktal 11111, nicht dezimal.


Was sagt der Compiler den hierzu? TCCR2 = 00011111;
Warum sollte er dazu was sagen? Das ist eine stinknormale Zuweisung.

McJenso
20.07.2008, 21:01
Hallo,

in der Annahme, dass sie nicht unterdrückt werden, wird es eine Warnung geben, da für TCCR2 einen 8Bit Wert erwartet wird und 11111 einfach den Rahmen sprengt.

Gruß

Jens

Spurius
20.07.2008, 21:01
Hier nochmal uebersichtlicher, geht allerdings auch so nicht :/


#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

int main(void)
{
TCCR2 = (1<<COM20) | (1<<WGM21) | (1<<CS22) | (1<<CS21) | (1<<CS20);
OCR2 = 250;
DDRB |= (1 << PB1);
while(1){};
//PORTB |= (1<<PB1);
}[/code]

McJenso
20.07.2008, 21:13
Hallo,

du nutzt Timer 2, dazu gehört PB3.

Gruß

Jens

sternst
20.07.2008, 21:19
in der Annahme, dass sie nicht unterdrückt werden, wird es eine Warnung geben, da für TCCR2 einen 8Bit Wert erwartet wird und 11111 einfach den Rahmen sprengt.

Stimmt. Abgesehen davon, dass es nicht 11111 sind, sondern 4681, hast du Recht.

Spurius
20.07.2008, 21:30
Hallo,
danke... geht jetzt, Wald vor lauter Bäumen...