Hi, kann man es abstellen das ein Interrupt alle Ports löscht(alle I/O Bits auf 0 setzt)? Bzw. warum wird das überhaupt gemacht? Grüße Dshing
Dshing Sung schrieb: > Hi, > kann man es abstellen das ein Interrupt alle Ports löscht(alle I/O Bits > auf 0 setzt)? > Bzw. warum wird das überhaupt gemacht? > > Grüße Dshing Ist mir bei meinem Commodore 64 noch nie passiert. Versuche mal, die Floppy-Station anzuschließen. Aber vielleicht hast du auch einen Fehler in deinem Cobol-Programm? Die Zeile 42 sieht sehr verdächtig aus.
Hi >kann man es abstellen das ein Interrupt alle Ports löscht(alle I/O Bits >auf 0 setzt)? >Bzw. warum wird das überhaupt gemacht? Bei welchem Interrupt und welchem Controller soll das sein? MfG Spess
Markus W. schrieb: > ... > Ist mir bei meinem Commodore 64 noch nie passiert. Versuche mal, die > Floppy-Station anzuschließen. > > Aber vielleicht hast du auch einen Fehler in deinem Cobol-Programm? Die > Zeile 42 sieht sehr verdächtig aus. Haha! YMMD.
Dshing Sung schrieb: > Hi,kann man es abstellen das ein Interrupt alle Ports löscht(alle I/O > Bitsauf 0 setzt)? Ja. > Bzw. warum wird das überhaupt gemacht? Wenn man nicht möchte, dass der µC irgend etwas macht. Gruß Willy
Ach so hab ich ganz vergessen :) Tut mir leid :/ Es handelt sich um einen ATTiny2313 und dem Timer Overflow Interrupt.
Dshing Sung schrieb: > Es handelt sich um einen ATTiny2313 und dem Timer Overflow Interrupt. und wie kommst du auf die Idee das orgendwelche Port gelöscht werden? Meine Tinys machen das nicht und in der Doku steht auch nichts drin. Beim Reset werden sie alle auf 0 gesetzt meinst du das?
Dshing Sung schrieb: > Ach so hab ich ganz vergessen :) Tut mir leid :/ > Es handelt sich um einen ATTiny2313 und dem Timer Overflow Interrupt. Oh, dann wohl doch nicht der C64. Sorry, ich lag echt daneben. ;-) Magst du uns vielleicht ein Stück aus deinem Programm anvertrauen? Für mich klingt das alles so, als würde er durch den Interrupt von vorne ins Programm laufen, weil du den Interrupt-Vektor nicht richtig gesetzt hast. Falls du Assembler verwendest, sollte das ungefähr so aussehen:
1 | .cseg ; code segment |
2 | .org 0 |
3 | rjmp main |
4 | .org OVF0addr |
5 | rjmp meine_isr |
6 | .org INT_VECTORS_SIZE |
7 | main: |
8 | ;...Hauptprogram... |
Haste vllt. den Interrupt aktiviert aber noch keine ISR geschrieben? Dann springt der AVR zur Interrupttabelle und findet nichts, das ist fast wie ein Reset.
Hi >Ach so hab ich ganz vergessen :) Tut mir leid :/ >Es handelt sich um einen ATTiny2313 und dem Timer Overflow Interrupt. Dort löscht ein Interrupt, wenn du nicht den Code zum Löschen explizit in die Interruptroutine schreibst, gar nichts. Erkläre dich mal genauer. MfG Spess
Dshing Sung schrieb: > Bzw. warum wird das überhaupt gemacht? Weil Du es so programmiert hast. Von alleine jedenfalls nicht. Peter
wenn ein Interrupt deine Register benutzt und du sie vorher und nachher nicht sicherst und zurück laden tust, stimmen die Register nicht mehr. Irgendwann wird dann eine Register auf den Port gelassen das bearbeitete oder gelöschte Bits enthält. Das AVR-Studio kann übrigends simulieren da kannst du überprüfen warum was auf dem Port ausgegeben wird
Ok, also ich hab es jetzt mal auf das wenigste begrenzt. Ich benutze leider C und nicht Assambler. Eigentlich sollte jetzt der PB7 immer an bleiben, aber das tut es halt leider nicht. Wie setze ich den den Vektor mit C?
1 | #define F_CPU 8000000
|
2 | #include <util/delay.h> |
3 | #include <avr/interrupt.h> |
4 | #include <avr/io.h> |
5 | |
6 | void HARD (void) { |
7 | DDRB = (1 << PB0)|(1 << PB1)|(1 << PB3)|(1 << PB4)|(1 << PB5)|(1 << PB6)|(1 << PB7); |
8 | DDRD = (1 << PD1)|(1 << PD4)|(1 << PD5)|(1 << PD6); |
9 | |
10 | TCCR0B = (1<<CS02); |
11 | TIMSK = (1<< TOIE0); |
12 | }
|
13 | |
14 | uint8_t msec =0; |
15 | uint8_t sec =1; |
16 | uint8_t min=1; |
17 | uint8_t stund=19; |
18 | uint8_t i=0; |
19 | uint8_t a=0; |
20 | |
21 | int main() |
22 | {
|
23 | while( 1 ) { |
24 | HARD(); |
25 | sei(); |
26 | |
27 | |
28 | if (msec>=122) |
29 | {
|
30 | msec = 0; |
31 | sec++; |
32 | if(sec % 2 == 1) |
33 | {PORTB = (1 << PB0);} |
34 | else{PORTB &= ~(1 << PB0);} |
35 | }
|
36 | |
37 | if (a==0) |
38 | {
|
39 | PORTB|= (1 << PB7); |
40 | a=8; |
41 | }
|
42 | |
43 | }
|
44 | }
|
45 | |
46 | |
47 | |
48 | ISR( TIMER0_OVF_vect ) |
49 | {
|
50 | msec++; |
51 | }
|
Dshing Sung schrieb: > Eigentlich sollte jetzt der PB7 immer an bleiben Nö. Wird hier ausgeschaltet: Dshing Sung schrieb: > PORTB = (1 << PB0); Peter
Ahh verdammmich das fehlende | hab ich gar nicht gesehen, dann macht das natürlich Sinn. Manchmal sieht man den Baum vor lauter Wald nicht mehr. Das mit dem HARD hab ich jetzt beim zusammen kürzen an die falsche Stelle gesetzt. Danke schon mal dafür :) Aber jetzt interessiert es mich doch wie man dem Programm sagen kann wo es wieder einsteigt.
Dshing Sung schrieb: > Aber jetzt interessiert es mich doch wie man dem Programm sagen kann wo > es wieder einsteigt. versteht jemand die Frage?
Dshing Sung schrieb: > Ahh verdammmich das fehlende | hab ich gar nicht gesehen, dann macht das > natürlich Sinn. Manchmal sieht man den Baum vor lauter Wald nicht mehr. > Das mit dem HARD hab ich jetzt beim zusammen kürzen an die falsche > Stelle gesetzt. > > Danke schon mal dafür :) > > Aber jetzt interessiert es mich doch wie man dem Programm sagen kann wo > es wieder einsteigt. Der Mikrocontroller arbeitet das Programm Befehl für Befehl ab. Jetzt kommt ein ein Interrupt: Der Controller führt den aktuellen Befehl zu Ende und springt danach in die Interrupt-Funktion. Jetzt arbeitet er die Interrupt-Funktion ab und macht danach mit dem Hauptprogramm weiter, als ob nichts gewesen wäre. Er steigt also da wieder ein, wo er unterbrochen hat.
>Wie setze ich den den Vektor mit C?
Haste schon mit ISR( TIMER0_OVF_vect )
Ich verwende C normalerweise nicht für Mikrocontroller, aber ich könnte mir denken, dass man da irgendwo angeben muss, für welchen AVR der Compiler übersetzen soll. Steht das irgendwo im Code?
Ahh ok ich dachte jetzt man kann dem Programm auch sagen, wenn es den Interrupt Befehlt abgearbeitet hat, dass es nicht wieder an die Aussprungsstelle im Hauptprogramm geht, sondern zu einem Vorher definierten Punkten. Aber wenn das nicht geht, dann habe ich das falsch verstanden. Danke euch allen für die Hilfe.
Dshing Sung schrieb: > Ahh ok ich dachte jetzt man kann dem Programm auch sagen, wenn es den > Interrupt Befehlt abgearbeitet hat, dass es nicht wieder an die > Aussprungsstelle im Hauptprogramm geht, sondern zu einem Vorher > definierten Punkten. Nein, das geht nicht. Sowas wäre auch kaum sinnvoll einzusetzen. Jegliche Art von Stackverwaltung wird dadurch unmöglich.
Die Rücksprungadresse wird ja immer auf den Stack gelegt, wenn du nun nicht zurückspringst wird der Stack mit der Zeit voll und läuft über. Du könntest natürlich den obersten Eintrag löschen und danach wo anders hinspringen aber wie machst du wieder an der unterbrochenen Stelle weiter? Muss es also wieder wo anders hin speichern und irgendwann mal wieder anspringen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.