Forum: Mikrocontroller und Digitale Elektronik Warum löscht interrupt alle Ports?


von Dshing S. (dshing)


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?

Grüße Dshing

von Markus W. (Firma: guloshop.de) (m-w)


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.

von spess53 (Gast)


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

von Simon K. (simon) Benutzerseite


Lesenswert?

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.

von Willy (Gast)


Lesenswert?

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

von Dshing S. (dshing)


Lesenswert?

Ach so hab ich ganz vergessen :) Tut mir leid :/
Es handelt sich um einen ATTiny2313 und dem Timer Overflow Interrupt.

von Peter II (Gast)


Lesenswert?

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?

von Markus W. (Firma: guloshop.de) (m-w)


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...

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

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.

von spess53 (Gast)


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

von Peter D. (peda)


Lesenswert?

Dshing Sung schrieb:
> Bzw. warum wird das überhaupt gemacht?

Weil Du es so programmiert hast.
Von alleine jedenfalls nicht.


Peter

von Thomas (kosmos)


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

von Dshing S. (dshing)


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
}

von Peter D. (peda)


Lesenswert?

Dshing Sung schrieb:
> Eigentlich sollte jetzt der PB7 immer an bleiben

Nö.
Wird hier ausgeschaltet:

Dshing Sung schrieb:
> PORTB = (1 << PB0);


Peter

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Du solltest auch 'msec' als 'volatile' deklarieren.

von Walter S. (avatar)


Lesenswert?

Dshing Sung schrieb:
> HARD();

die Initialisierung in der Schleife machen ist nicht sinnvoll

von Dshing S. (dshing)


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.

von Peter II (Gast)


Lesenswert?

Dshing Sung schrieb:
> Aber jetzt interessiert es mich doch wie man dem Programm sagen kann wo
> es wieder einsteigt.

versteht jemand die Frage?

von Captain S. (captainsubtext)


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.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

>Wie setze ich den den Vektor mit C?
Haste schon mit ISR( TIMER0_OVF_vect )

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

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?

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Das stellste im AVR Studio ein oder schreibst das ins makefile.

von Dshing S. (dshing)


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.

von Rolf M. (rmagnus)


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.

von Thomas (kosmos)


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.

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
Noch kein Account? Hier anmelden.