PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RP6 M32 C Problem: Timer 1



teamohnename
03.01.2012, 18:58
Hallo an alle,
ich weiß nicht warum, aber ich kriege es nicht hin, den freien Timer 1 der M32 Erweiterungsplatine zu konfigurieren. Das Interrupt wird anscheinend nicht ausgelöst! Ich habe schon alles mögliche ausprobiert. Hier das Initialisierungsvoid, die Initialisierung vom Timer 1 fett geschrieben:


void initRP6Control(void)
{
portInit(); // Setup port directions and initial values.
// This is the most important step!

cli(); // Disable global interrupts.

// UART:
UBRRH = UBRR_BAUD_LOW >> 8; // Setup UART: Baud is Low Speed
UBRRL = (uint8_t) UBRR_BAUD_LOW;
UCSRA = 0x00;
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
UCSRB = (1 << TXEN) | (1 << RXEN) | (1 << RXCIE);

// Initialize ADC:
ADMUX = 0; //external reference
ADCSRA = (0<<ADIE) | (0<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADIF);
SFIOR = 0;

// Initialize External interrupts - all disabled:
MCUCR = (1 << ISC11) | (1 << ISC10) | (1 << ISC01) | (1 << ISC00);
GICR = (0 << INT2) | (0 << INT1) | (0 << INT0);
MCUCSR = (0 << ISC2);


// 10kHz Timer 0:
TCCR0 = (0 << WGM00)
| (1 << WGM01)
| (0 << COM00)
| (0 << COM01)
| (0 << CS02)
| (1 << CS01)
| (0 << CS00);
OCR0 = 199;

/*
Timer 1 is free for your applications!
*/
TCCR1A = (1 << WGM12);
TCCR1B = (1 << CS12);
TIMSK = (1<< OCIE1A);

// SPI Master (SPI Mode 0, SCK Frequency is F_CPU/2, which means it is 8MHz
// on the RP6 CONTROL M32...):
SPCR = (0<<SPIE)
| (1<<SPE)
| (1<<MSTR)
| (0<<SPR0)
| (0<<SPR1)
| (0<<CPOL)
| (0<<CPHA);
SPSR = (1<<SPI2X);

sei(); // Enable Global Interrupts
}

Und hier die Interruptroutine:


ISR (TIMER1_OVF_vect)
{
[...]
}

Da das ja normales AVR C ist, kann das Problem bestimmt jeder, der sich mit AVRs befasst und diese in C programmiert, lösen.
Vielen Dank schon mal im Voraus und
Viele Grüße
teamohnename

radbruch
03.01.2012, 20:19
TIMSK = (1<< TOIE1); setzt das Flag für den Overflow-Interrupt. Das steht wohl für TimerOverflowInterruptEnable.

Edit: War ja klar, dass diese Antwort zu einfach ist. WGM12 gesetzt bedeutet CTC-Mode, dann ist "TIMER1_OVF_vect" natürlich die falsche ISR. Allerdings ist WGM12 ein Flag in TCCR1B, richtig wäre deshalb:


TCCR1A = 0;
TCCR1B = (1 << WGM12) | (1 << CS12);
OCR1A=65535;
TIMSK = (1<< OCIE1A);


ISR (TIMER1_COMPA_vect)
{
[...]
}(ungetestet)

teamohnename
04.01.2012, 13:10
Hi radbruch,
danke für Deine Antwort. Leider löst das Interrupt immer noch nicht aus. Ein CTC Timer muss das auch nicht unbedingt sein, ich habe das nur gewählt, weil mich das ,,PWM" im Datenblatt verwirrt hat. Ich möchte einfach nur alle paar Millisekunden (z.B. alle 30ms) ein Interrupt auslösen, damit mir im Prinzip ,,Multitasking" ermöglicht wird. Wie muss man dazu die Register konfigurieren?
Vielen Dank und
Viele Grüße
teamohnename

teamohnename
16.01.2012, 16:40
*push*

Leute, bitte, wir brauchen einfach nur die Daten für Timer 1... Wir habe zwar schon alle möglichen und nicht möglichen Kombinationen ausprobiert, es aber trotzdem nicht hingekriegt! Wir sind fast schon am Verzweifeln... Wie gesagt, wir möchten einfach nur alle paar ms ein Interrupt aufgerufen bekommen...

Vielen Dank und
Viele Grüße
teamohnename

SlyD
21.01.2012, 13:34
Wo ich den Thread hier gerade sehe:
http://arexx.com/forum/viewtopic.php?f=19&t=1727

wurde gelöst.

teamohnename
22.01.2012, 11:24
Ja, danke, sorry, hab ich total vergessen. :rolleyes: