Interrupt: Simulation OK - in Hardware gehts nicht

Gast #562135
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.
Gast #562254
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.
Gast #582358
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.
Gast #583068
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.
Angehängte Dateien:
Moderator Persönliche Seite #583153
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.