Arduino Libraries mit ATmega32 - keine timer interrupts?

Hallo Halli,

ich benutze schon seit etwas längerem verschiedene Arduinos und bin grundsätzlich mit der Materie vertraut.

Jetzt wollte ich mit einem ATmega32 (ATmega3216PU, das ist doch quasi das gleiche, richtig?) die LyquidCrystal Library zum laufen bringen. Ich benutze Eclipse mit dem Eclipse AVR-Plugin (nicht Arduino Plugin) und habe nach dieser Anleitung - http://playground.arduino.cc/Code/Eclipse - die static Arduino core library selbst kompiliert:

Eine entsprechende Datei für die Pinbelegung des ATmega32 habe ich aus der Datei "rtavr.zip" von dieser Webseite erhalten: http://www.zwanzischmark.de/howto/atmega32-mit-arduino-ide

Die LyquidCrystal library habe ich direkt im Eclipse Projekt mit eingebunden. Soweit funktioniert auch (fast) alles, das Display zeigt die gewünschten Strings an.

ABER mit dem Timer gibt es Probleme: millis() liefert immer 0 zurück und delay() bleibt hängen.

Daraufhin habe ich mir mal den Interrupt-Vektor angesehen, sollte das Symbol __vector_11 sein. Das steht laut .map-Datei an Speicheradresse 0x0714 - laut Datenblatt sollte es aber an 0x014 stehen.

Was kann ich da machen?

Viele Grüße Christoph

ABER mit dem Timer gibt es Probleme: millis() liefert immer 0 zurück und delay() bleibt hängen.

Diese Funktionen laufen mit dem Timer0, wenn nun die Lib's auch Timer 0 nutzen dann .....

Hallo rudirabbit,

ich nutze ausschließlich die Arduino Libraries. Die sollen selbstverständlich den timer0 verwenden, das klappt aber aus irgend einem Grund nicht ...

Gruß Christoph

Die Register der Controller können verschiedene Namen haben bzw verschieden belegt sein. Wenn ein Sketch/Bibiothek direkt auf Register zugreift kann das nicht auf verschiedenen Controllern nicht funktionieren. Schau Dir mal die Bibliothek an. Grüße Uwe

Hallo uwefed,

guter Hinweis, da hat doch hoffentlich keiner in Assembler programmiert?! :wink:
Spaß beseite … und den sourcecode der Bibliothek auch erstmal.

Denn der Fehler liegt vermutlich woanders:

$ avr-objdump -d *elf

quader-avrgcc.elf:     file format elf32-avr

Disassembly of section .text:

00000000 <__vectors>:
   0:   64 c0           rjmp    .+200           ; 0xca <__ctors_end>
   2:   00 00           nop
   4:   87 c0           rjmp    .+270           ; 0x114 <__bad_interrupt>
   6:   00 00           nop
   8:   85 c0           rjmp    .+266           ; 0x114 <__bad_interrupt>
   a:   00 00           nop
   c:   83 c0           rjmp    .+262           ; 0x114 <__bad_interrupt>
   e:   00 00           nop
  10:   81 c0           rjmp    .+258           ; 0x114 <__bad_interrupt>
  12:   00 00           nop
  14:   7f c0           rjmp    .+254           ; 0x114 <__bad_interrupt>
  16:   00 00           nop
  18:   7d c0           rjmp    .+250           ; 0x114 <__bad_interrupt>
  1a:   00 00           nop
  1c:   7b c0           rjmp    .+246           ; 0x114 <__bad_interrupt>
  1e:   00 00           nop
  20:   79 c0           rjmp    .+242           ; 0x114 <__bad_interrupt>
  22:   00 00           nop
  24:   77 c0           rjmp    .+238           ; 0x114 <__bad_interrupt>
  26:   00 00           nop
  28:   75 c0           rjmp    .+234           ; 0x114 <__bad_interrupt>
  2a:   00 00           nop
  2c:   09 c3           rjmp    .+1554          ; 0x640 <__vector_11>
  2e:   00 00           nop
  30:   71 c0           rjmp    .+226           ; 0x114 <__bad_interrupt>
  32:   00 00           nop

...

Offenbar erzeugt der Compiler eine Vektor-Tabelle mit 4-byte-Einträgen. Laut Datenblatt des ATmega32 (Seite 44) sollte der Vektor 11 aber an Adresse 0x16 anstatt 0x2c stehen. Also wäre eine Vektortabelle mit 2-Byte Einträgen korrekt.

Wo wird das denn festgelegt?

Danke und Gruß
Christoph

Ich habe jetzt die LyquidCrystal library komplett rausgeworfen und mein Programm auf ein minimal-Blink reduziert:

#include <Arduino.h>

#define LED1 6
#define LED2 7

void loop(void);

int main( void )
{
    // led-Pin als Output konfigurieren
    pinMode(LED1, OUTPUT);
    pinMode(LED2, OUTPUT);

    digitalWrite(LED2, HIGH);

    // Hauptschleife des Programms
    while ( 1 )
    	loop();
}

void loop()
{
    // LED einschalten, und dann warten
    digitalWrite(LED1, HIGH);
//  _delay_ms(100);
    delay( 100 );

    // LED ausschalten, und dann warten
    digitalWrite(LED1, LOW);
//  _delay_ms(100);
    delay( 100 );
}

Sobald ich die delay()-Aufrufe entferne funktioniert das Programm und schaltet sehr schnell die LED1 an und aus. LED2 dient zum Helligkeitsvergleich, um zwischen schnellem Blinken und statischen Leuchten zu unterscheiden.

Wenn ich die AVR-Funktion _delay_ms() benutze, dan funktioniert es. Mit Arduino delay() nicht.

Ideen?

In der Arduino IDE wird viel mit Prozessor Definitionen und bedingter Kompilierung gearbeitet. Also je nachdem welchen Prozessor man hat werden andere Register, Pins oder Frequenzen verwendet. Es kann sein, dass der Atmega32 da nicht oder nicht richtig unterstützt wird.

Wenn Du mit der Arduino Umgebung arbeitest dann ist main() falsch. Wenn Du nicht mit der Arduino Umgebung arbeitest fehlt die ganze Initialisierung der Timer damit delay und millis funktioniert.

Grüße Uwe

ich habe das gleiche problem. sowohl delay() als auch generell die timer lib (http://playground.arduino.cc/Code/Timer) funktionieren nicht.

ich nutzt diese pins_arduino.h https://github.com/HolgerGross/ATmega32-Arduino

uwefed: Wenn Du mit der Arduino Umgebung arbeitest dann ist main() falsch.

Jawoll, main() ist hier fehl am Platze ... !

Danke, jetzt läufts!

Hätte nicht gedacht, daß das das Problem war. Man lernt immer wieder dazu. Grüße Uwe