Interrupts werden nicht ausgeführt

Gast #1335561
Hallo,

leider werden meine Interrupts nicht ausgeführt, sie sollen eine LED zu 
Blinken mit 0.5Hz bringen am Port B1. Leider kommt es nicht zum 
Interrupt.

Was ist denn da los, denn das Programm lief auf einem anderen Controller 
schon?

Hat jemand einen Tip?

Das Makefile sieht so aus:

MCU=atmega8

all:  logger.S
  avr-gcc -mmcu=${MCU} logger.S -o logger.elf
  avr-objcopy -O ihex logger.elf logger.hex
Angehängte Dateien:
Gast #1335612
Hallo,

was soll ich jetzt beschreiben: Mein Programm funktionierte über 2 Jahre 
ohne Zwischenfall. Ich hatte dies unter NetBSD mit tavrasm und avrdude 
erzeugt und geladen.

Heute will ich das gleiche Programm nochmal auf einen Controller bringen 
und benutze OpenBSD mit den avr-gcc und ich bekomme es nicht zum Laufen. 
Ich vermute in den Deklarationen im logger.S sind noch einige Fehler, so 
daß meine Interrupts nicht starten, die erzeugen das Blinksignal am 
Port.

Ich hoffe ich konnte jetzt etwas konkreter werden.

MfG

HUE
Persönliche Seite #1335626
HUE schrieb:

> Was ist denn da los, denn das Programm lief auf einem anderen Controller
> schon?

Anderer Typ?

Dann die Konfigurationswerte für die Spezialfunktionsregister anhand der 
Datenblätter kontrollieren

Anderes Exemplar?

Fuses kontrollieren. Der µC soll lt. Programm mit 16 MHz laufen. Ab Werk 
kommt er aber mit 1 MHz. Pi*Daumen: Statt 0,5 Hz Blinken, wäre es dann 
ein 0,03125 Hz Blinken... vielleicht zu langsam für den ungeduldigen 
Tester.
Gast #1335636
Hallo,

auf dem Board habe ich ein 16Mhz Quartz verbaut und die LED leuchtet, 
wenn ich sie in der loop: setze -> Controller läuft!

Wenn ich den Watchdog noch mit 2,1 sec setze, dann wird dieses 
Dauerleuchten nach 2,1 sec unterbrochen, aber nicht mit 0.5 Hz.

Also läuft mein Timer 0 nicht in eine ISR und bringt sie zum Wechseln 
des Status. Dort würde ich auch den Watchdog zurücksetzen.

So funktionierte das über Jahre ohne Ausfälle!

Hat noch jemand eine Idee?

MfG

HUE
Persönliche Seite #1336146
Schaut man sich die Ausgabe von deinem make mit deinem Makefile im AVR 
simulator (AVR Studio) an, sieht man ZWEI Interrupttabellen. Zuerst 
eine vom avr-gcc erzeugte und dann deine. Klar, dass deine nie 
angesprungen wird.

Wie kann man nun avr-gcc veranlassen keine Interrupttabelle zu 
schreiben?

Die Lösung habe ich in einem Beitrag von Jörg Wunsch gefunden:
Beitrag "Re: AVR-GCC in Assembler-Modus"

Man muss explizit ohne C-Startupcode linken! Ich habe dazu dieses 
Makefile (s. Anhang mit Tabs) benutzt:
1
MCU=atmega8
2

3
all:  logger.S
4
  avr-gcc -mmcu=${MCU} -c logger.S 
5
  avr-ld -mavr2 logger.o -o logger.elf
6
  avr-objcopy -O ihex logger.elf logger.hex

Das Blinken im Logger lässt sich dann mit dem AVR Studio simulieren. Man 
braucht allerdings etwas Geduld bis in der Simulation die Wartezeiten im 
Timer abgelaufen sind.
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.