Und der Timer würde parallel zum Hauptprogramm, nein , im Hauptprogramm ablaufen, und die ISR unterbricht dann alles,
setzt den Timer zurück und zählt wo 1 dazu??
Druckbare Version
Und der Timer würde parallel zum Hauptprogramm, nein , im Hauptprogramm ablaufen, und die ISR unterbricht dann alles,
setzt den Timer zurück und zählt wo 1 dazu??
zu der variable zahl, die du noch definieren musst
Ich habe es nun erstmals geschafft, den Timer zu verwenden...
Aber ein Problem blieb:
Code://----------------------------------------------------------------------
// Titel : Töne
//----------------------------------------------------------------------
// Funktion : ...
// Schaltung : ...
//----------------------------------------------------------------------
// Prozessor : ...
// Takt : 1 MHz
// Sprache : C
// Datum : ...
// Version : ...
// Autor : ...
//----------------------------------------------------------------------
#define F_CPU 1000000 // Taktfrequenz des myAVR-Boards
#include <avr\io.h> // AVR Register und Konstantendefinitionen
//----------------------------------------------------------------------
main () // Hauptprogramm, startet bei Power ON und Reset
{
int i,j = 0;
DDRB=0b00001111;
TCCR0B=TCCR0B|(1<<CS00); //Timer0 einstellen + starten: prescaler=1 -> 1Mhz
// Timer läuft synchron zu allem ab!
while (true)
{
for(i=0;i<10000;i++) // ungefähr 1 sek Ton halten
{
if (j>=10)
{ PORTB^=(1<<PB2);
}
if (TCNT0 >= 113) // TCNT0 = Speichervariable für Timer0, geht nur bis 255 weil 8bit
{
TCNT0=0; // Reset Timer -> fängt wieder bei 0 an
j++;
}
}
waitMs(500);
j,i=0;
TCNT0=0;
for(i=0;i<10000;i++) // ungefähr 1 sek Ton halten
{
if (j>=10)
{ PORTB^=(1<<PB2);
}
if (TCNT0 >= 85) // TCNT0 = Speichervariable für Timer0, geht nur bis 255 weil 8bit
{
TCNT0=0; // Reset Timer -> fängt wieder bei 0 an
j++;
}
}
waitMs(500);
j,i=0;
TCNT0=0;
for(i=0;i<10000;i++) // ungefähr 1 sek Ton halten
{
if (j>=10)
{ PORTB^=(1<<PB2);
}
if (TCNT0 >= 64) // TCNT0 = Speichervariable für Timer0, geht nur bis 255 weil 8bit
{
TCNT0=0; // Reset Timer -> fängt wieder bei 0 an
j++;
}
}
waitMs(500);
j,i=0;
TCNT0=0;
for(i=0;i<10000;i++) // ungefähr 1 sek Ton halten
{
if (j>=10)
{ PORTB^=(1<<PB2);
}
if (TCNT0 >= 95) // TCNT0 = Speichervariable für Timer0, geht nur bis 255 weil 8bit
{
TCNT0=0; // Reset Timer -> fängt wieder bei 0 an
j++;
}
}
waitMs(500);
}
}
//----------------------------------------------------------------------
Die Töne, die gespielt werden sollen, sind A (440 Hz), D (170 Hz), G (128 Hz) und C (191 Hz)
Der erste Ton kling tief, der zweite höher.
Das passt also noch.
Aber der dritte und vierte sind genau gleich wie der zweite!!!
selbst mit erneutem setzen der Zählvariablen i und j....
:-s
Hallo Leute, mein Beitrag hier ist wohl während dem Umbau der Site ins Nirvana verloren gegangen...
Hier nochmal:
Ich will einen möglichst einfachen (und daher leicht zu verstehenden) Interrupt programmieren können.
Mein Ansatz war der:
Dann kam die AntwortCode:
ISR (INT0_vect)
{
i++;
}
main ()
{
int i=0; // Zählervariable
sei(); // Interrupts global einschalten
GIMSK=(1<<6) // bzw. (1<<INT0) ?? Enable INT0
MCUCR=MCUCR|(1<<ISC01)|(1<<ISC001) // rising edge -> wenn
//PORTBx 5v wird
while(true)
{
if (i==100)
{
LED EIN, WARTREN UND LED AUS
i=0;
}
}
}
Worauf meine Vermutung war, dass ich also unter # define F_CPU und #include<...>Zitat:
Du kannst im Interrupt nicht die lokale Variable einer Funktion verändern. i muss global sein (und das "volatile" nicht vergessen).
noch int voltaile i=0 hinzufügen muss. Soweit korrekt??
Mfg