Melde mich nun mit dem nächsten Problem zurück 
Timer1 habe ich jetzt glaub ich verstanden. Jetzt habe ich folgenden Code ausprobiert:
Code:
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#define INTERRUPTS_PER_SECOND 1000
int laenge, sound_on;
// Wird durch jeden IRQ eins hochgezählt
static volatile uint16_t irq_count = 0;
// Wert für das OutputCompare-Register (OCR1A)
#define OCR_VAL (F_CPU / INTERRUPTS_PER_SECOND -1)
// Initialisierung der Hardware
void ioinit( void )
{
DDRB |= ( 1 << PB3 );
DDRD |= ( 1 << PD6 );
// Initialisiert Timer1, um jede Sekunde 1000 IRQs auszulösen
// ATmega: Mode #4 für Timer1 und voller MCU-Takt (Prescale=1)
TCCR1A = 0;
TCCR1B = ( 1 << WGM12 ) | ( 1 << CS10 );
// OutputCompare1A Register setzen
OCR1A = ( uint16_t ) ( ( uint32_t ) OCR_VAL );
// OutputCompare1A Interrupt aktivieren
TIMSK |= ( 1 << OCIE1A );
}
// Die Interrupt Service Routine (ISR) wird INTERRUPTS_PER_SECOND mal
// pro Sekunde ausgeführt. irq_count zählt die Aufrufe und blinkt die LED
// wenn 1 Sekunde vergangen ist.
SIGNAL( SIG_OUTPUT_COMPARE1A )
{
uint16_t count;
// irq_count um 1 erhöhen und
count = 1+irq_count;
if( count >= laenge )
{
count = 0;
PORTB ^= ( 1 << PB3 );
sound_on = 0; //Sound soll durch die while-Schleife in sound(...) abgeschaltet werden
}
irq_count = count;
}
void sound( int length )
{
laenge = length;
sound_on = 1;
while( sound_on != 0 ) //während sound_on = 1 ist, soll irgend eine Frequenz erzeugt werden. sobald sound_on = = ist, soll die Schleife unterbrochen werden.
{
PORTD ^= ( 1 << PD6 );
_delay_ms( 100 );
sei();
}
}
// Das Hauptprogramm (Einsprungpunkt)
int main( void )
{
//Peripherie initialisieren
ioinit();
PORTB |= ( 1 << PB3 );
sound( 1000 );
while(1);
}
An PortB.3 hängt eine LED, welche ganz brav wie im Tutorial im Abstand von einer Sekunde ein- und ausgeknipst wird. Das funktioniert auch ->Der Timer funktioniert an sich. Allerdings will ich die sound(...)-Funktion auch nur eine Sekunde ausführen. Das soll nach einer Sekunde durch das Unwahr-Machen der while-Schleife passieren. Warum funktioniert das nicht? Das Programm soll einfach nur einmal nach einer Sekunde die while-Schleife (und damit auch die sound-Funktion) beenden und die LED an PortB.3 weiterblinken lassen.
Eigentlich müsste das doch von der Idee her funktionieren? Tut es aber nicht...
u.A.w.g.
, Manni
Lesezeichen