Warum löscht interrupt alle Ports?

(Firma: guloshop.de) #2625212
Lesenswert?

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.
Gast #2625216
Lesenswert?

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
(Firma: guloshop.de) #2625256
Lesenswert?

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...
Gast #2625260
Lesenswert?

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
#2625348
Lesenswert?

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
OP #2625410
Lesenswert?

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
}
OP #2625517
Lesenswert?

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.
#2625554
Lesenswert?

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.
OP #2625700
Lesenswert?

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.
#2625707
Lesenswert?

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.
#2626392
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren