Forum: Compiler & IDEs Interrupt: Simulation OK - in Hardware gehts nicht


von ErdBaer (Gast)


Lesenswert?

Ich hab jetzt mehrer Stunden Datenblätter und foren gewälzt; Hier also 
mein Problem:

Den Code im Anhang möchte ich auf einem ATMega 16 ausführen. Die 
Simulation Funktioniert wunderbar, beim interrupt Aufruf wird der 
Zustand des Ports geändert. Auf dem Controller nehmen die Pins dann 
jedoch nur den Zustand an den ich in main zugewiesen hab.
Der interrupt an sich funktioniert (z.B. wenn ich ne Verzögerung in den 
Int einbaue). Nur der Zustand der Portpins will sich nicht ändern.

Ich benutz das AVR Studio 4.12 SP3 und den GCC der mitgeliefert wurde. 
Programmieren geschieht dann mit TwinAVR mit dem ich das .hex file das 
das AVR Studio generiert per SPI in den Controller schreib.

Wie man am Code Wahrscheinlcih sieht mach ich grade meine ersten 
Gehversuche mit dem MµC.

von Johannes M. (johnny-m)


Lesenswert?

> Den Code im Anhang...
Aha...

von Oliver (Gast)


Lesenswert?

>Ich benutz das AVR Studio 4.12 SP3 und den GCC der mitgeliefert wurde
Nochmal aha...

von ErdBaer (Gast)


Lesenswert?

Sorry Bedienfehler, hier also der betreffenden Code:
1
 
2
#include <avr/io.h>
3
#include <stdint.h>
4
#include <inttypes.h>
5
#include <stdbool.h>
6
#include <avr/interrupt.h> 
7
8
void init (void);
9
10
int main (void)
11
{
12
  init(); 
13
      
14
    PORTA=0x15;
15
    PORTC=0xff;
16
17
  while (1)
18
  {
19
  }
20
21
}
22
23
void init (void)
24
{
25
  DDRA = 0xff;  
26
27
  DDRC =0xff;
28
  PORTC =0xff;   
29
  sei(); 
30
  TIMSK |= 0x01;  // Timer 0 overflow interrupt enable
31
  TCCR0 &= 0xF8; //unteren bits von timercontrolregister löschen
32
  TCCR0 |= 0x05; //Prescaler 1024
33
  TCNT0 =  0x66;  // Reload wert
34
  
35
}
36
37
38
ISR (TIMER0_OVF_vect)
39
{
40
  PORTC = 0x00;
41
  TCNT0 =  0x66;  // Reload wert
42
}
Laut Simulator müsste Port C irgenwqann komplett 0 sein, ist er aber in 
der Realen Schaltung nicht.

von Roland P. (pram)


Lesenswert?

ich tipp mal drauf dass die Fuse JTAGEN falsch gesetzt ist und sich 
PortC noch im jtag Modus befindet

von pumpkin (Gast)


Lesenswert?

Was hat das mit einem nicht funktionierenden Interrupt zutun? Nichts! 
Roland hat liegt sicher richtig. Datenblatt ATmega16, Rev. 
2466E–AVR–10/02, Seite 58ff.

pumpkin

von ErdBaer (Gast)


Lesenswert?

So

Scheinbar stimmt die Adresse unter der der Compiler meinen ISR Code 
ablegt nicht! Wenn ich der ISR
1
 ISR(__vector_default)
 gebe funktioniert es. Wo muss ich Nachschauen um die richtige Syntax 
für  die ISR () Funktion zu finden bzw. wie kann ich mir den 
Assemblercode anschauen um zu prüfen wo der Compiler meinen Isr Code im 
Speicher ablegt.

Da ich auch im fertigen Programm nur einen Interrupt benutzen werde geht 
es so, schön isses aber nicht.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Du musst auch beim Linken -mmcu=atmega16 mit angeben, nicht nur beim
Compilieren.  Frag' ich mich aber, warum das dann in der Simulation
gehen soll...

von ErdBaer (Gast)


Angehängte Dateien:

Lesenswert?

Danke erstmal Jörg!

Wenns diemsmal mit dem Anhang klappt müsste sich die Meldung die ich 
beim erstellen der .hex datei bekomme darin befinden.

Mir ist noch etwas aufgefallen: Laut Datenblatt hat der Timer 0 Overflow 
den Vector 10 in der iom16.h wird allerdings folgendes ersetzt
1
 #define TIMER0_OVF_vect  _VECTOR(9)

Ausserdem ist mir nicht klar ob die Adressen der ISR's bei mir noch da 
liegen wo sie per Default liegen sollten.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

ErdBaer wrote:

> Wenns diemsmal mit dem Anhang klappt müsste sich die Meldung die ich
> beim erstellen der .hex datei bekomme darin befinden.

Sieht OK aus.

> Mir ist noch etwas aufgefallen: Laut Datenblatt hat der Timer 0 Overflow
> den Vector 10 in der iom16.h wird allerdings folgendes ersetzt
>
1
 #define TIMER0_OVF_vect  _VECTOR(9)

Ja, wir sind hier `off by one' mit dem Datenblatt.  Ist aber
nebensächlich.  Bei avr-libc heißt der erste Interruptvektor eben
__vector_1, das ist ja ein rein interner Name.  Davor liegt noch
der Resetvektor, aber der wird nicht über das __vector_N-Schema
angesprochen.

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.