Interrupts werden nicht ausgeführt

Gast #1335561
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren