www.mikrocontroller.net

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


Autor: ErdBaer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Den Code im Anhang...
Aha...

Autor: Oliver (Gast)
Datum:

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

Autor: ErdBaer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry Bedienfehler, hier also der betreffenden Code:
 
#include <avr/io.h>
#include <stdint.h>
#include <inttypes.h>
#include <stdbool.h>
#include <avr/interrupt.h> 

void init (void);

int main (void)
{
  init(); 
      
    PORTA=0x15;
    PORTC=0xff;

  while (1)
  {
  }

}

void init (void)
{
  DDRA = 0xff;  

  DDRC =0xff;
  PORTC =0xff;   
  sei(); 
  TIMSK |= 0x01;  // Timer 0 overflow interrupt enable
  TCCR0 &= 0xF8; //unteren bits von timercontrolregister löschen
  TCCR0 |= 0x05; //Prescaler 1024
  TCNT0 =  0x66;  // Reload wert
  
}


ISR (TIMER0_OVF_vect)
{
  PORTC = 0x00;
  TCNT0 =  0x66;  // Reload wert
}
Laut Simulator müsste Port C irgenwqann komplett 0 sein, ist er aber in 
der Realen Schaltung nicht.

Autor: Roland Praml (pram)
Datum:

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

Autor: pumpkin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ErdBaer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So

Scheinbar stimmt die Adresse unter der der Compiler meinen ISR Code 
ablegt nicht! Wenn ich der ISR
 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: ErdBaer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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
 #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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
>
 #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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.