Hallo,
ich möchte bei den ATTINY 13 den CTC Modus nutzen aber ich krieg’s
nicht zum Laufen.
Mit Hilfe des Datenblattes habe ich es folgendes eingestellt:
#include <avr/interrupt.h>
ISR (TIM0_COMPA_vect)
{
ms++;
}
TCCR0A = (1<<WGM01);
TCCR0B = (1 << CS02) | (0 << CS01) | (1 << CS00); // Teiler c1K/1024
OCR0A = 100;
TIMSK0 = (1 << OCIE0A);
TCNT0 = 0x00;
sei();
Mit der ms Variable schalte ich zum Testen einen Ausgang An und Aus
Aber so wie es aussieht wird der Interrupt gar nicht ausgeführt.
Kann mir bitte einer helfen?
Danke im Voraus.
Eigentlich sieht es ganz gut aus. Ich vermisse aber die Main-Routine. Dürfen wir das komplette Coding sehen?
Uwe K. schrieb: > Dürfen wir das komplette Coding sehen? Auf gar keinen Fall. Man könnte sonst zu schnell auf das Problem stoßen.
Bitte.
#define LED_AN (PORTB |=_BV(PB1))
#define LED_AUS (PORTB &=~_BV(PB1))
#include <avr/io.h>
#include <avr/interrupt.h>
unsigned char ms=0;
ISR (TIM0_COMPA_vect)
{
ms++;
}
int main(void)
{
DDRB = 0b00000011;// PB1 und 2 als Ausgänge Rest als Eingänge.
PORTB = 0b00100000;// PB5 (Reset) PullUp Widerstand zuschalten.
//********Timer****
TCCR0A = (1<<WGM01);
TCCR0B = (1 << CS02) | (0 << CS01) | (1 << CS00); // Teiler c1K/1024
OCR0A = 100;
TIMSK0 = (1 << OCIE0A);
TCNT0 = 0x00;
sei();
while(1)
{
//BLINKEN
if (ms==30)LED_AN;
if (ms==60)
{
LED_AUS;
ms=0;
}
}
}
V. S. schrieb: > Bitte. Danke. > if (ms==30)LED_AN; > if (ms==60) Versuche es mal mit: if (ms>=30)LED_AN; if (ms>=60) So eine Millisekunde dauert nur eine Millisekunde...
V. S. schrieb: > DDRB = 0b00000011;// PB1 und 2 als Ausgänge Rest als Eingänge. Ist PB0 und PB1. Nicht das die LED an PB0 hängt?
Ja, da ist noch mehr im argen. V. S. schrieb: > unsigned char ms=0; Besser ist: uint8 ms=0; > DDRB = 0b00000011;// PB1 und 2 als Ausgänge Rest als Eingänge. Das ist in der Tat PB0 und PB1. Man schreibt es besser so: DDRB = (1<<PINB1) | (1<<PINB0); > PORTB = 0b00100000;// PB5 (Reset) PullUp Widerstand zuschalten. Wenn das wirklich der Reset ist, also nicht umgefused, dann muss man schon einen echten Pullup ranhängen. Diese Anweisung macht keinen Sinn. Stört aber auch nicht. Wo "_BV()" her kommt weis ich nicht. Ich schreibe immer: (1<<PINB1) Wo hängt die LED dran?
Uwe K. schrieb: > Besser ist: > uint8 ms=0; das ist genauso schlecht. http://www.mikrocontroller.net/articles/FAQ#Was_hat_es_mit_volatile_auf_sich mfg.
OhNe schrieb: > DDRB = 0b00000011;// PB1 und 2 als Ausgänge Rest als Eingänge. > > Ist PB0 und PB1. Nicht das die LED an PB0 hängt? Habe mich in den Kommentaren vertan. PB0 und 1 als Ausgänge. Die LED ist am PB1. > Versuche es mal mit: > if (ms>=30)LED_AN; > if (ms>=60) Habe jetzt das Ausschalten der LED auskommentiert. Funktioniert trotz dem nicht.
Hab gerade das Normale Interrupt ausprobiert.
Funktioniert.
#define LED_AN (PORTB |=_BV(PB1))
#define LED_AUS (PORTB &=~_BV(PB1))
#include <avr/io.h>
#include <avr/interrupt.h>
unsigned char ms=0;
ISR (TIM0_OVF_vect)
{
ms++;
}
int main(void)
{
DDRB = 0b00000011;// PB0 und 1 als Ausgänge Rest als Eingänge.
PORTB = 0b00100000;// PB5 (Reset) PullUp Widerstand zuschalten.
//********Timer****
TCCR0B = (1 << CS02) | (0 << CS01) | (1 << CS00); // Teiler c1K/1024
TIMSK0 = (1 <<TOIE0);
TCNT0 = 0x00;
sei();
while(1)
{
if (ms==30)LED_AN;
}
}
Thomas Eckmann schrieb: > http://www.mikrocontroller.net/articles/FAQ#Was_hat_es_mit_volatile_auf_sich Verda..., das übersehe ich bei mir auch immer :(
V. S. schrieb: > #define LED_AN (PORTB |=_BV(PB1)) > #define LED_AUS (PORTB &=~_BV(PB1)) Diese "_BV" verstehe ich nicht. Versuche bitte: #define LED_AN PORTB |= (1<<PINB1) #define LED_AUS PORTB &= ~(1<<PINB1)
Schluß mit dem Blindflug: Ich habe dein original Coding in meinen Pollin-Würfel gepumpt. LÄUFT. Studio 6.2. Ich habe dir mal ELF und HEX drangehängt. Mein 13er läuft mit 1,2 MHz.
Uwe K. schrieb: > Ich habe dein original Coding in meinen Pollin-Würfel gepumpt. Und du hast nichts verändert?
V. S. schrieb: > Uwe K. schrieb: >> Ich habe dein original Coding in meinen Pollin-Würfel gepumpt. > > Und du hast nichts verändert? So ist es. Ich habe alles von dir übernommen, und bewust nichts verändert. LÄUFT. 3 Sekunden AN, 3 Sekunden AUS. Alles Super. Versuche mal die HEX-Datei. Es ist dein Programm.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.