Daniel L. schrieb:> while(1)> {> PORTB |= (1<<PB0);> if(TCNT0 ==200)> PORTB &= (1<<PB0);> }
Auf den ersten Blick hat die letzte Zeile einen Fehler:
> PORTB &= (1<<PB0);
soll heißen
PORTB &= ~(1<<PB0);
Wie stellst du das fest?
Ich vermute mal, mit einer LED am Ausgang oder sowas in der Art.
Da wirst du aber nicht viel sehen. Mit einem Oszilloskop schon.
Der Impuls wird nur sehr kurz sein.
> while(1)> {> PORTB |= (1<<PB0);
PB0 wird gesetzt
> if(TCNT0 ==200)
wenn TCNT0 = 200 ist,
> PORTB &= (1<<PB0);
wird PB0 rückgesetzt
> }
und im nächsten Schleifendurchlauf sofort wieder gesetzt.
Hallo Daniel,
sorry, das ist kein Programm, sondern nur ein Auszug und der lässt sich
so nicht übersetzten !
Wo ist die Funktion main() und die prozessor spezifischen
Include-Dateien?
Daniel L. schrieb:> Ich habe das jetzt mal außerhalb der while-Schleife versucht,aber die> LED leuchtet durchgehend
Was erwartest du?
Natürlich leuchtet die durchgehend (für dich langsamen Menschen).
Aber wenn du mal eine LED daneben auf Dauer-Ein einschaltest, dann wirst
du sehen, dass sie etwas dunkler leuchtet (wenn auch nicht viel).
Kann es sein, dass du du ganz krass die Geschwindigkeit unterschätzt?
Rechne mal nach, wie schnell deine LED eigentlich blinkt!
Und bitte: kompletten Code! Inklusive der Angabe der Taktfrequenz, mit
der der µC läuft.
Ehe du Code in Prosa beschreibst, kopiere lieber den Code hier rein. Und
zwar alles. Das ist für dich einfacher und für uns auch. Denn dann haben
wir ein Bild davon, wie der Code wirklich aussieht und müssen nicht
raten.
Daniel L. schrieb:> Es sollte hier einfach die LED's umschalten
Dann solltest du das auch machen.
ABer solange du den µC in der Funktion gefangen hältst
1
voidblink1(inti,intk)
2
{
3
while(1)
4
{
5
PORTB|=(1<<PD1);
6
if(k>=440)
7
{
8
PORTB|=(1<<PD2);
9
PORTB&=~(1<<PD1);
10
}
11
if(k>=440)
12
{
13
PORTB&=~(1<<PD2);
14
PORTB|=(1<<PD0);
15
}
16
if(k>=440)
17
PORTB&=~(1<<PD0);
18
}
19
20
}
wird sich vom restlichen Programm da nichts mehr tun. Da ist eine
Endlossschleife in der Funktion. Die Funktion wird nie mehr verlassen.
Ganz abgesehen davon, dass dein k auch mit ISR Hilfe nie größer/gleich
440 werden kann.
Der ganze Ansatz ist Müll.
Mit der ISR hast du den perfekten Ort, um ein zeitliches Blinken zu
realisieren.
Ich habe den Code noch nicht geschrieben um die Funktion zu verlassen
bzw.
Die schleife zu unterbrechen.
Wenn die Funktion aufgerufen wird sollten doch die LED's schon mal
umgeschalten werden.
Karl Heinz schrieb:> Der ganze Ansatz ist Müll.> Mit der ISR hast du den perfekten Ort, um ein zeitliches Blinken zu> realisieren.
STeck den kompletten Blink-Code in die ISR.
1
ISR(TIMER0_OVF_vect)
2
{
3
if(isBlinking)
4
{
5
k++;
6
if(k>=440)
7
{
8
k=0;
9
10
if(k>200){
11
PORTB|=(1<<PD2);
12
PORTB&=~(1<<PD1);
13
}
14
else{
15
PORTB&=~(1<<PD2);
16
PORTB|=(1<<PD0);
17
}
18
}
19
}
20
}
und im Hauptprogramm schaltest du bei Tastendruck einfach nur das
Blinken ein/aus, indem du die Variable 'isBlinking' auf 0 bzw. 1 setzt.
Daniel L. schrieb:> Wenn die Funktion aufgerufen wird sollten doch die LED's schon mal> umgeschalten werden.
Moment.
Hast du deine Tastenauswertung für sich alleine gestestet oder hast du
das nicht?
Funktioniert die?
Karl Heinz schrieb:> Hast du deine Tastenauswertung für sich alleine gestestet oder hast du> das nicht?> Funktioniert die?
Ehe da jetzt der nächste Schritt drauf gesetzt wird, sollte der Punkt
erst mal geklärt sein. Nicht dass du/wir da jetzt einem Timer-Phantom
nachjagen und das 'Problem' ganz woanders liegt.
Karl Heinz schrieb:> PS:> Allerdings müssen dazu auch die Interrupts mitels sei() freigegeben> worden sein.
Seh gerade, du hast das am Anfang von main() gemacht.
Keine gute Idee.
Erst mal wird alles initialisiert, die Hardware eingestellt, Variablen
auf ihre Anfangswerte begracht.
Und erst dann, wenn alles soweit fertig und grundsätzlich lauffähig ist,
erst dann kommt das 'Feuer frei' für die Interrupts. Als letzte Aktion
vor der Hauptschleife.
Denn was du nicht willst: Das die Interrupts sofort zu feuern beginnen,
wenn du in einzelnen Komponenten einen spezifischen Interrupt während
der Konfiguration frei gibst. Du kannst nicht alles parallel und zur
gleichen Zeit konfigurieren. Du willst aber in komplexeren Programmen
haben, dass das Interrupt-Konzert in geordneten Bahnen läuft. Und das
tut es im Regelfall erst dann, wenn ALLE Komponenten initialisiert sind.
Daniel L. schrieb:> Ich habe das jetzt umgeändert, aber jetzt lässt sich die LED nur noch> einschalten, aber nicht mehr ausschaltenb
Welches Programm?
(Nach DEM Fehler trau ich dir nicht mehr)
Daniel L. schrieb:> TIMSK |= (1<<TOIE0);
Overflow Interrupt freigegeben
> sei();
Interrupts generell freigegeben
> }
.... aber keine ISR.
Sowas wird mit einem µC-Reset bestraft.
Aus gutem Grund hab ich in meinem 'Testprogramm' weiter oben, den Timer
komplett rausgelassen.
Daniel L. schrieb:> Hier noch die ISR
Schön.
Ich bin raus.
Ich sag dir einmal, du mögest den ganzen Code posten. Ich sags
vielleicht noch ein zweitesmal ein paar Tage später. Aber nicht ein paar
Minuten/Stunden später.
Such dir einen anderen Dummen. Ich bin das Rätselraten leid.
Daniel L. schrieb:> Ich habe das jetzt umgeändert, aber jetzt lässt sich die LED nur> noch> einschalten, aber nicht mehr ausschaltenbDaniel L. schrieb:> if(taste_vorher != taste_jetzt)> {> if (taste_jetzt == taste_gedruckt)> {>> isblinking = true;>>> }> } taste_vorher = taste_jetzt;
else if (taste_jetzt == taste_nicht_gedruckt)
{
isBlinking = false;
}
Hallo,
Kann mir jemand sagen warum die Led bei diesem Code nicht leuchtet ?
//---------------------CODE 1-----------------------------
#include <avr/io.h>
#include <avr/interrupt.h>
long cnt;
int main(void)
{
TCCR0 = (1<<CS01);
TIMSK |= (1<<TOIE0);
DDRD = 0b11110111;
sei();
while(1)
{
if(cnt > 3900)
{
PORTD = 0x01;
cnt = 0;
}
}
}
ISR (TIMER0_OVF_vect)
{
cnt++;
}
Bei diesem Code leuchtet die Led jedoch!!!!!!!!!!!
//---------------------CODE 2-----------------------------
#include <avr/io.h>
#include <avr/interrupt.h>
long cnt;
int main(void)
{
TCCR0 = (1<<CS01);
TIMSK |= (1<<TOIE0);
DDRD = 0b11110111;
sei();
while(1)
{
}
}
ISR (TIMER0_OVF_vect)
{
cnt++;
if(cnt > 3900)
{
PORTD = 0x01;
cnt = 0;
}
}
Im Grunde ist es das gleiche Programm aber es funktioniert nur der Code
2.
Wenn ich das Programm im Atmel Studio 6 Simuliere sieht es aus als würde
nur 1 mal die while schleife augeführt werden und danach nicht mehr, was
auch erklären würden wieso die Led nicht leuchtet. Aber Wieso? Kann mir
jemand weiter helfen!?