Hab einen AT Mega32 und AVR Studio4 hab folgendes Programm geschrieben
und bis gestern ging noch alles aber jetzt Laüft Timer 0 einmal durch
dann interrupt und dann beendet er den Interrupt nicht mehr und springt
immer wieder zum Anfang??? Zeit Lk1 und Zeitlk2 sollen später über Uart
ausgelesenwerden hab sie jetzt testweise im Programm festgelegt.
1
#include<avr/io.h> // I/O Informationen
2
#include<avr/interrupt.h> // Interrupts laden
3
#include<util/delay.h>
4
#include<stdlib.h>
5
#include<inttypes.h>
6
7
#ifndef F_CPU //Anfang F_CPU definition auch in Projekt einstellungen machen
8
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000" //Sicherheitsmeldung bei falsch einstellung kommt beim Compilieren Fehler
A. K. schrieb:
> In der ISR 90 Sekunden Verzögerung?!?!?!
Naja ich will halt das die Ausgänge für 90 sec. gesetzt bleiben!?
Und Was fehlt den noch beim Delay muss dazusagen das ich mit
_delay_ms(90000); ja in die <util/delay.h>springe.
Wie eben schon gesagt: Kein Delay in einer ISR(), jedenfalls keins
jenseits von ein paar Mikrosekunden!
Man kann beispielsweise den Ausgang im Interrupt #1234 setzen und im
Interrupt #678647868 wieder zurücksetzen.
Bax 182 schrieb:
> Naja ich will halt das die Ausgänge für 90 sec. gesetzt bleiben!?
Und da wunderst du dich, dass dein Programm in der ISR "hängebleibt"? Oh
je...
Hab es jetzt so gemacht das alles aus dem Interrupt jetzt in main steht
und ich im Interrupt nur dem Timer seinen neuen Zeitwert gebe aber er
springt trotzdem nicht wider aus dem interrupt raus?
Bax 182 schrieb:
> Hab es jetzt so gemacht das alles aus dem Interrupt jetzt in main steht> und ich im Interrupt nur dem Timer seinen neuen Zeitwert gebe aber er> springt trotzdem nicht wider aus dem interrupt raus?
Leider ist meine Glaskugel wieder mal in der Reparatur, sodass ich nicht
sehen kann, welchen Programmfehler du jetzt in dein Programm eingebaut
hast.
Ja, ich weiß auch nicht, warum so viele Leute eine riesen Angst haben,
ein compilierbares *.c anzuhängen (oder *.zip, wenn mehrere Files).
Immer nur diese Schnipselchen, schlimmstenfalls sogar editiert, d.h.
völlig andere Fehler enthaltend.
Und dann rätselt man wie die blöden, welchen Typ könnten die Variablen
haben, was könnten die externen Funktionen wohl machen, was sollen die
Macros bedeuten?
Man kann ja schreiben: "Ich hab in Zeile xxx ein ; eingefügt"
Aber dann gehört trotzdem noch die compilierbare Source als Anhang!!!
Peter
Peter ich denke es liegt oft am Ton der hier im Forum herscht.
Teilweise werden Anfänger niedergemacht wenn die Programme eben noch
etwas wuest aussehen.
Du selbst bist ja glücklicherweise jemand der sich mit Anfängern
auseinander setzt und ihnen wirklich super Einstiegshilfe gibt.
Wenn ich mir so manche erklärungen von Dir ansehe fällt es mir wie
schuppen aus den Augen wie einfach es doch ist ;-)
Da ich mich selbst längst nicht als C-Profi sehe, trau ich mich auch oft
nicht mein Source zu veröffentlichen weil man eben sehr oft
niedergemezelt wird.
Es gibt eben verschiede Arten jemanden klar zu machen das man einen
Fehler macht. Wie hieß das früher mal? "Der Ton macht die Musik"
In diesem Sinne,
schönes Wochenende
Harry
Man man man da haben ja noch richtig viele leute geschrieben ich dachte
schon ich bin allein mit dem Projekt! Vor Diebstahl der Idee hab ich
keine angst ist ein Berufsschulprojekt das auch andere Klassen machen
müssen ;-)
Aber nun zu euren Fragen und ich hab die .c mal angehangen!
Lutz schrieb:
>>> clearbit(PORTC,0); // Zurücksetzen von Laufkatze>>> clearbit(PORTC,0); // Zurücksetzen von Joystick>> Sicher?
Ja hat bis jetzt geklappt!
Übrigens: Verfolge mal die arme time-Variable ...
...
int time = 0;
...
ISR(TIMER0_OVF_vect) // Interruptroutine
{
time ++;
Zeitlk1 =1;
Zeitlk2 =3;
if (Zeitlk1 == time)
{
...
if (Zeitlk2 == time)
{
...
}
Ja ich weiß das ist im moment etwas undurchsichtig da ich mir die
Variablen über RS232 von VB2008express ausgeben lassen möchte!
Bax 182 schrieb:
>> Ja hat bis jetzt geklappt!
und was hat es für einen Sinn, ein Bit zweimal zu löschen?
und dein angehängter Code macht ja nun mal gar nichts...
Dein µC hängt hier und kommt nicht weiter.
; entfernen und { } um den Block machen, den du endlos wiederholt haben
möchtest.
Deine _delay sind immer noch kontraproduktiv.
Du hast ja jetzt eine time Variable, die dir (in der ISR hochgezählt,
das musst du noch machen) innerhalb des Programms Sekunden zählt.
Wenn du nun eine Laufkatze einschaltest, rechnest du dir aus, zu welchem
Sekundensignal sie wieder ausgeschaltet werden musst. Du wartest nicht
die Zeit ab(!) sondern überprüfst in deiner Haupt-while-Schleife immer
wieder, ob dieser Zeitpunkt erreicht ist und wenn ja, schaltest du ab.
Als Pseudocode, ungefähr so
1
....
2
3
while(1){
4
5
if(Laufkatze1_einschalten){
6
Laufkatze1_Aus_Zeit=time+90;// 90 Sekunden später ausschalten
7
einschalten;
8
}
9
10
if(time>=Laufkatze1_Aus_Zeit){
11
Laufkatze1_Aus_Zeit=0;// oder irgendein anderer Wert, den time
12
// nie erreichen wird
13
ausschalten;
14
}
15
16
.....
17
}
18
...
19
20
21
ISR(...)
22
{
23
...
24
// wenn 1 Sekunde vergangen ist (entsprechend viele Aufrufe der ISR
25
// erfolgt sind) time um 1 Sekunde weiterstellen
26
time++;
27
}
Kannst du 'sehen', wie dieses Konstrukt die Laufkatze ebenfalls nach 90
Sekunden abschalten wird? Allerdings geschieht dies in einer Art und
Weise, dass der µC keine 90 Sekunden Däumchen drehen muss, sondern in
der Zwischenzeit andere Dinge machen kann.
Alternativ kannst du das auch so machen
1
....
2
3
while(1){
4
5
if(Laufkatze1_einschalten){
6
Laufkatze1_Running=90;// Die Laufkatze soll noch 90 Sekunden laufen
7
einschalten;
8
}
9
10
if(Laufkatze1_Running==0){
11
ausschalten;
12
}
13
14
.....
15
}
16
...
17
18
ISR(....)
19
{
20
21
if(....){
22
// wenn wieder 1 Sekunde vergangen ist
23
24
if(Laufkatze1_Running>0)
25
Laufkatze1_Running--;
26
27
....
28
}
29
}
Hier wird die Zeit, wie lange die Katze noch laufen soll in der ISR
runtergezählt. Klarerweise in der ISR nur dann, wenn 1 Sekunde vergangen
ist. In der Haupt-while-Schleife prüfst du nur ob die Zeit-Variable
wieder bis auf 0 runtergekommen ist, und schaltest gegebenenfalls aus.
Aber egal wie du das machst, du musst deine Denkweise umstellen.
Momentan bist du im Gedankengang: Ich schalte ein und 90 Sekunden später
schalte ich aus. Du denkst seriell, du musst aber in Ereignissen denken.
Die ISR ist dein Ereignislieferent und in der Hauptschleife wird
überprüft, ob bestimmte Ereignisse (zb 90 Sekunden runtergezählt oder
ein bestimmter Zeitpunkt ist erreicht) eingetreten sind und darauf
reagieren.
1. Kommentar zur nicht gesetzten F_CPU passt nicht zum gesetzten Wert (1
MHz <> 4 MHz)
2. Kommentare bezüglich Port xy als Aus/Eingang setzen stimmen nicht mit
dem Code überein. Wenn dann richtig kommentieren oder gar nicht, aber
falsch?
3. time muss mit dem Attribute volatile gekennzeichnet werden, wenn es
in der ISR geändert werden soll
4. Wann denkst du kommt er aus der Endlosschleife while (1); raus um den
nachfolgenden Code auszuführen?
5. Was soll nun der leere ISR Handler? Hast du die Beiträge zuvor
gelesen bezüglich Flag in der ISR setzen und in der main() handeln?
Nur mal so ein paar Anmerkungen.
Und noch ein Tip.
Bevor du dich da mit 10 Laufkatzen verzettelst, realisiere das alles
erst mal mit EINER Laufkatze. Und wenn das dann läuft, dann überlege
dir, wie du (zb mit einem Array) das ganze so gestalten kannst, dass du
nicht sinnlos COde 10 mal duplizieren musst. Das kommt dann auch der
Fehlersuche zugute, wenn man nicht endlos langen Code ständig absuchen
muss.
Wenn Du 10 verschiedene Zeitabläufe quasi parallel und unabhängig
ausführen willst, geht das am schönsten über einen Scheduler:
Beitrag "Wartezeiten effektiv (Scheduler)"
Peter
Peter Dannegger schrieb:
> Wenn Du 10 verschiedene Zeitabläufe quasi parallel und unabhängig> ausführen willst, geht das am schönsten über einen Scheduler:>> Beitrag "Wartezeiten effektiv (Scheduler)">>> Peter
Danke Peda, dein Tip hat mir sehr weitergeholfen habe das ganze
Proggramm nochmal auseinander genommen und so aufgebaut wie im Beispiel
erklärt! Jetzt werden am Anfang einmal alle Variablen festgelegt und
dann werden nur noch die einzelnen Laufkatzen abgefragt ob die
setzbedingungen erfüllt sind und zwischendurch kommt immer mal der
Interrupt und setzt Time Hoch! Super Danke