PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interruptprobleme



1hdsquad
27.01.2007, 14:39
Warum funktioniert das nicht? Er springt aus den Labeln mit WAITMS nicht mehr raus...
Irgendwie verstehe ich das ganze Interruptzeug nicht.
MFG

mrg
28.01.2007, 09:45
kannst du den code hier einbringen?

ich hatte auch vor kurzem probleme damit,konnte sie aber lösen.
interrupts sind eigentlich ganz leicht.
aber ohne code kann ich dir den fehler nicht sagen.

1hdsquad
28.01.2007, 10:07
Der hat mein Attachement nicht hinzugefuegt, so ein ***.

MFG

mrg
28.01.2007, 10:49
kannst du den code compilieren?
bei mir gibts im bascom kein attiny2313.dat
heißt bei mir 2313def.dat

den timer benötigst du gar nicht

config portd.2 muß bei mir config pind.2 heißen,sonst meckert der compiler

die routine interrupt würde ich so schreiben:

If Modus > 3 Then Modus = 1
If Modus = 1 Then Goto Blinken
If Modus = 2 Then Goto Lauflicht
If Modus = 3 Then Goto Leuchten
Modus = Modus + 1

obwohls eigentlich egal is,im endeffekt passiert dasselbe.

dann wäre noch die frage ob du die 333 ms im simulator abwartest oder ob du das schon so auf deinen tiny übertragen hast, und dort solang wartest?
denn im simulator kannste mal nen kaffee machen bis die 333 ms verstrichen sind.
desweiteren mußt du natürlich auch die fusebit auf internal 1mhz setzen,weil sonst das timing von compiliertem code nicht mit der tatsächlichen taktfrequenz übereinstimmt.

ich hoffe irgendetwas nützliches konnte ich dir hier auflisten.

EDIT: woher kommt der interrupt eigentlich? durch einen taster vermute ich mal,oder?

Mfg,
--> Mr.G.

mrg
28.01.2007, 10:55
noch etwas wichtiges:

config int1 = rising
oder
config int1 = falling

damit bestimmst du,ob eer interrupt bei high oder low level ausgelöst wird.
pullup nicht vergessen.

die sprungmarken solltest du erst nach der hautpschleife schreiben,sonst durchläuft er diese auch beim jedem durchlauf.
zumindest bei mir.


also so

do

loop


blinken:

return


lauflicht:

return

.
.
.


wenn du pin eines port als 1 setzen willst,mußt du portb = 255 verwenden,oder jeden pin einzeln setzen.
das könntest du in einer schleife machen:

for count = 0 to 8
pinb.count = 1
next


MfG,
--> Mr.G.

1hdsquad
28.01.2007, 11:23
Jepp, der Interrupt wird durch einen Taster ausgeloest. Der sollte auch einen Pullup haben, Pollin Evaluationsboard...
Den Code kann ich kompilieren. Der Timer ist nur ein Ueberbleibsel anderer Versuche, schon weg...
So springt das Programm aus der Blinkenschleife nicht mehr raus, trotz Interrupt... Auch mit Rising Interrupt.
But why?
MFG

mrg
28.01.2007, 11:35
versuchs mal damit

$regfile = "2313def.dat"
$crystal = 1000000

Config Portb = Output
Config Int1 = Falling
Config Pind.2 = Input

Dim Modus As Byte
Modus = 1
Dim Zeit As Integer
Zeit = 50

Enable Interrupts
Enable Int1

On Int1 Switch

B Alias Portb.6
E Alias Portb.5
C Alias Portb.4
K Alias Portb.3
S Alias Portb.2



Do

Select Case Modus

Case 1 : Portb = 255
Portd.5 = 1


Case 2 : Portb = 255
Portd.5 = 1
Waitms Zeit
Portb = 0
Portd.5 = 0
Waitms Zeit

Case 3: Portb = 0
Portd.5 = 0
B = 1
Portd.5 = 1
Waitms Zeit
E = 1
Portd.5 = 0
Waitms Zeit
C = 1
Portd.5 = 1
Waitms Zeit
K = 1
Portd.5 = 0
Waitms Zeit
S = 1
Portd.5 = 1
Waitms Zeit
B = 0
Portd.5 = 0
Waitms Zeit
E = 0
Portd.5 = 1
Waitms Zeit
C = 0
Portd.5 = 0
Waitms Zeit
K = 0
Portd.5 = 1
Waitms Zeit
S = 0
Portd.5 = 0
Waitms Zeit
End Select


Loop


Switch:
Modus = Modus + 1
If Modus > 3 Then Modus = 1

Return



MfG,
--> Mr.G.

mrg
28.01.2007, 11:36
ich hab die verzögerung runtergesetzt damit ich im simulator nicht solang warte.
wegen dem pullup:

bei pull up,also wenn du auf +5 ziehst,dann mußt du falling nehmen,und den den pin mit dem taster auf gnd ziehen.
...entprellen


MfG,
-->Mr.G.

1hdsquad
28.01.2007, 11:54
Ich habe deins mal getestet im Simulator und es sieht erstmal gut aus soweit. Bin bei einem Kumpel und mein Board loift hier nicht, werds nachher zuhause auf dem Tiny testen...
Dankeschoen erstmal!
MFG

linux_80
28.01.2007, 12:29
Hallo,
ich hab jetzt nicht alles duchgelesen, aber bei 2313def.dat und dem attiny2313.dat ist schon ein unterschied,
der erste ist für den AT90S2313, das andere für den Attiny2313, und ein Programm das für den einen compiliert ist, läuft auf dem anderen i.d.R. nicht. [-X

@mrg
wenn bei Dir die Datei (attiny2313) nicht da ist, ist entweder Dein Bascom schon uralt, oder die Datei ist sonstwie abhanden gekommen, denn die gibts schon lange.

1hdsquad
28.01.2007, 12:33
Aha. Aber das Compilerdirektiv kann ich ja aendern...

linux_80
28.01.2007, 12:35
Muss ich gleich noch nachlegen,
im Programm wird INT1 für den Interrupt konfiguriert, und PortD.2 auf Eingang gestellt, :-k
es schaut aber so aus, das INT1 auf PortD.3 ist, bzw. auf PortD.2 ist INT0 !

mrg
28.01.2007, 12:52
das mag sein,daß es nicht der gleiche uC is,aber was spielt das für eine rolle bei diesem programm?

er braucht doch nur seinen controller einzutragen und compilieren.

mag sein,daß ich das übersehen hab,daß der pin nicht dem interrupt entspricht.
aber es ging um die funktion des interrupts selbst,und die ist ja jetzt vorhanden.

ich sag mal so:
mir hat bisher niemand meinen code soweit verändert daß die fehler beseitigt sind bis auf ein paar kleinigkeiten.
mir hat nichtmal jemand geantwortet was mein problem mit dem simulator betraf.

ich denke dem fragesteller is recht gut geholfen worden.
aber ich denke mit diesen beiden änderungen (delay zeit auf 333 erhöhen,wie gewünscht nicht vergessen) ist dieses problem gelöst.

@linux 80: vielleicht kannst du mir ja helfen.
wieso gehen die pins 6 und 7 von portd im simulator nicht low wenn die zuweisung pind.6 = 0 zur anwendung kommt?
übertragen im mega 8 funktioniert mein code einwandfrei.

MfG,
-->Mr.G.

linux_80
28.01.2007, 13:15
Also einen Simulator hab ich noch nie Ernsthaft verwendet, ich mach das immer auf Hardware, man hat ja 10000 Versuche frei ;-)

Dann schau ma mal,

der erste Wurm der mir auffällt, ist, dass eine Do...loop-schleife um das komplette Programm rumgeht,
wenn das Programm anfängt, kommt der AVR also schon an der 3. Zeile nach dem ersten Do an ein Return,
wo ein AVR bei einem Return hinspringt wenn garkein aufruf da war weiss ich jetzt aber auch nicht, zumindest gibts ja kein zurück !

Die Goto's in der ISR machen sich auch nicht gut, denn zum beenden einer ISR wird ein bestimmtes Return gebraucht, das nur am ende der ISR steht, also erstmal die Goto's auf Gosub's ändern.

Und so lange Warteschleifen innerhalb einer ISR ist auch nicht gut, kommt allerdings auch auf den Einsatz an, wenn der AVR sonst nix macht, kann mans noch verkraften, allerdings könnte man da auch den Eingang pollen, da der AVR ja sonst nix macht, und so schnell genug ist einen Pegelwechsel zu erkennen.

mrg
28.01.2007, 13:38
gut analysiert,aber es geht mir ja auch nicht um dieses programm hier.

ich hab ja gesagt,daß er die sprungmarken nicht in der hauptschleife sondern erst hinten ran hängen soll.

übrigens hab ich auch erwähnt,daß ich das regfile geändert hab,weils bei mir nicht existiert.
wenn du dir mein programm ansiehst wirst ja sehen,daß ich keine sprunkmarken verwende.
ich habs so ziemlich vereinfacht und übersichtlich gestaltet.

es geht um den thread "probleme mit int0 und den restlichen pins von port d"

aber lassen wir das mal beiseite,der 1hdsquad wird sich melden obs funkt oder nicht,nehme ich mal an.

mein code funktioniert ja wie gesagt wie gewünscht.
nur der simulator schaltet die pins von portd bloß einmal auf high,aber nie wieder auf low,egal wieoft ich im code dazu auffordere.
im controller funktioniert es aber einwandfrei.
und das problem tritt nur auf,wenn ich eben auch den int0 verwende.
lasse ich diesen weg passts auch im simulator.
und mich würd interresieren warum das denn so ist.
vielleicht sollt ich auch einfach mal mein bascom updaten.

MfG,
--> Mr.G.

1hdsquad
28.01.2007, 14:31
Mir ist klar, dass ich den richtigen Chip eintragen muss, geholfen fuehle ich mich schon ;-)
MFG

mrg
28.01.2007, 14:57
hast es schon versucht?

MfG,
-->Mr.G.

1hdsquad
28.01.2007, 19:01
Jepp, es loift...
Allerdings kann durchaus eine halbe Sekunde nach dem Drücken des Tasters und der Reaktion vergehen. Ich werde jetzt noch PWM einbauen, 5x sollte doch kein Problem für den kleinen AVR sein?!
MFG

mrg
29.01.2007, 19:57
die halbe sekunde kommt von den verzögerungen.

da solltest du einen timer verwenden wenn du das vermeiden möchtest.

5x was? 5 unterschiedliche pwm signale?

MfG,
--> Mr.G.

1hdsquad
29.01.2007, 20:00
Ja, 5 LED-Gruppen. Ich dachte, der Interrupt wird SOFORT ausgeführt :(
Blöder Name, eine Unterbrechung, die nicht unterbricht...
Beim Blinken werden alle LEDs an/aus gedimmt, das ist ja auch kP. Aber beim Lauflicht sollen unterschiedliche Abfolgen der einzelnen LEDs gedimmt werden, also 5xPWM.

mrg
29.01.2007, 20:16
Ich hab mich mit pwm noch nicht auseinandergesetzt,das kommt erst.
aber ich denke die pwm läßt sich zur laufzeit verändern,also kommst du vielleicht auch mit nur einem kanal aus,welchen du jeweils anpassen kannst.

aber das kommt drauf an wie das aussehen soll.
vielleicht kannst du ne tabelle oder so erstellen in welcher du die werte fix festlegst,welche led wann und wie hell leuchten soll.
und diese werte rufst du in einer schleife der reihe nach ab.

wie das mit dem interrupt und verzögerungen is müßtest du in der hilfe nachsehen können.
aber ich glaube die verzögerung wird nicht unterbrochen.
es wird bei einem interrupt lediglich ein pointer gesetzt in welcher zeile des programms unterbrochen wurde,dann springt er zu dem label welches du angibst,und anschliessend wieder zurück,dahin wo der pointer gesetzt wurde.
ein timer läuft im hintergrund ab,also intern durch hardware,dadurch wird das programm nicht verzögert,also müßte der interrupt sofort abgearbeitet werden.
alternativ könntest du auch mit assembler verzögern,mit einer ganzen menge "nop" hintereinander.
dadurch veranlaßt du den den rechner einen takt lang nichts zu tun.
ein takt wird aber sehr kurz sein bei 1 million takten pro sekunden.
erhöhst du den takt,mußt du auch den code wieder anpassen.
aber das würd ich mir nicht antun.

also dann doch lieber timer :-)

sollte ich falsch liegen,bitte ich um korrektur.

MfG,
--> Mr.G.

Hanni
30.01.2007, 02:54
Ich dachte, der Interrupt wird SOFORT ausgeführt :(

Wird er auch.
Allerdings solltest du versuchen zu verstehen, wieso die Änderung die du in der ISR vorgenommen hast erst bis zu einer halben Sekunde später wirksam wird.
In diesem Fall liegt ein klassischer Denkfehler vor !

PWM ist mit so einem kleinem Käfer übrigens nicht wirklich ein Problem .. auch 16 einzelne Kanäle nicht. nur, ob das schon mal einer in Bascom versucht hat kann ich nicht sagen.
Allerdings empfiehlt sich meiner Ansicht nach für Basic Programmierer eh nur eine Hardware PWM, welche auch der ATtiny 2313 liefern kann (4 PWM Kanäle hat er).

Grüße,
Hanni

1hdsquad
30.01.2007, 13:48
Naja, ich brauch aber 5 Kanäle ;-)
ISR? Bahnhof? Auch die Timer sind mir suspekt. Wie sage ich denn z.B., dass er nach einem bestimmten Wert unterbricht? Muss ich die ganze Zeit prüfen?
MFG

Hanni
30.01.2007, 14:14
Naja, ich brauch aber 5 Kanäle ;-)
Na dann viel Spass beim Programmieren einer Software PWM unter Bascom !!


ISR? Bahnhof?

ISR = Interupt Service Routine - das is das Ding, das bei einem Interupt abgearbeitet wird.


Auch die Timer sind mir suspekt. Wie sage ich denn z.B., dass er nach einem bestimmten Wert unterbricht?

Der eine oder andere Blick ins Datenblatt könnte da weiterhelfen.


Muss ich die ganze Zeit prüfen?

Ne, das definitiv nicht.

Grüße,
Hanni

1hdsquad
30.01.2007, 20:01
Du meinst bestimmt das Datenhandbuch ;-)
Ich könnte auch einen Mega88 nehmen... Der hat 6 PWM.
MFG

mrg
30.01.2007, 21:12
Hier im RN-Wissensbereich ist der timer sehr gut beschrieben.
Auch die bascom hilfe verwenden.
dann gibts noch die samples die bei bascom enthalten sind.

arbeite dich da mal durch,danach sollte eigentlich alles klar sein.

einfach gesagt geht es darum,daß der timer eine gewisse zeit braucht um von 0 bis zum überlauf zu zählen.
beim überlauf springt dein programm genau wie beim interrupt an ein von dir definiertes label.
die zeit die der timer benötigt um überzulaufen hängt vom timer selbst, z.b. 8 bit oder 16 bit ,vom startwert den du festlegst und natürlich von der taktfrequenz ab.
wie du den startwert berechnest und damit z.b. einen 1 sekunden timer definierst steht wie gesagt im rn-wissen,in der bascom hilfe und in den samples.
am besten nimmst du dir ein sample her und probierst einfach herum.
is wirklich kein großes ding.
einen timer kannst du übrigens auch verwenden um deine pwm zu erzeugen.

MfG,
--> Mr.G.