Forum: Compiler & IDEs Warum läuft dieser code nicht auf einem Mega16?


von Markus (Gast)


Lesenswert?

Hallo zusammen,

ich habe folgenden code, der zwar auf einem ATmega8 problemlos läuft, 
auf einem Mega16 aber nicht.
1
#include <avr/io.h>
2
#include <stdint.h>
3
#include <stdlib.h>
4
#include <avr/interrupt.h>
5
#include <util/delay.h>
6
7
8
void io_init(void)
9
{
10
  DDRD |= (1<<PD5);                  // ausgang
11
  
12
  PORTD |= (1<<PD5);                 // Pullup
13
}
14
15
  
16
int main(void)
17
{
18
  io_init();
19
  sei();
20
21
  
22
  TCCR1B |= (1<<CS10) | (1<<CS12) | (1<<WGM12);            // Timer1 = Timer , Prescaler = 1024 , clear timer on compare match
23
  TIMSK |= (1<<OCIE1A);                        // interrupt bei compare match
24
  
25
  OCR1A = 40000;
26
  
27
  while(1)
28
  {
29
  
30
  }
31
}
32
33
34
ISR(TIMER1_COMPA_vect)
35
{
36
  PORTD ^= (1<<PD5);
37
}

Der compare match ist bei ca. 5,1 sec erreicht und da sollte PD5 
getoggelt werden (wird er auf nem Mega8 auch).
Kann mir jemand sagen woran das liegen kann? Die Register müssten ja bei 
beiden uCs gleich sein.

mfg Markus

von Johannes M. (johnny-m)


Lesenswert?

Ähhh, Du hast den Code aber für den Mega16 neu compiliert, oder?

von Johannes M. (johnny-m)


Lesenswert?

BTW: Was heißt "läuft nicht"? Passiert gar nichts oder nur nicht das, 
was passieren soll?

von Jörg X. (Gast)


Lesenswert?

Und du hast mal 40s gewartet?
(voreinstellung sind 1Mhz, da dauert's 40s bis zum togglen)

hth. Jörg

von Markus (Gast)


Lesenswert?

Ja, neu compilert hab ich natürlich.
Läuft nicht heißt: PD5 bleibt auf high (wie in io_init festgelegt) und 
toggelt nicht.
Ja, 40s hab ich gewartet, aber der M16 läuft mit ext. quarz auf 8mhz 
(sollten also ca. 5s sein).
Meine Fusebits sind:

BOOTSZ0 = programmed
BOOTSZ1 = programmed
SUT1 = programmed

rest = unprogrammed

von Alan (Gast)


Lesenswert?

Beim neukompilieren auch Prozessor auf Mega16 umgestellt?

von Markus (Gast)


Lesenswert?

Also irgendwie scheint mein Mega16 hier allgemein was gegen interrupts 
zu haben. Ein Timer1 Overflow Interrupt wird nämlich auch nicht 
ausgeführt.

Der Timer scheint allerdings zu laufen. Wenn ich nämlich die "Toggle pin 
on compare match" Funktion aktiviere (TCCR1A |= (1<<COM1A0);), wird der 
pin OC1A auch getoggelt.
Das bringt mir soweit allerdings noch nicht viel, da ich ja die ISR bei 
einem Compare Match aufgerufen haben möchte.

von Der A. (der-albi)


Lesenswert?

Öhhhm.. Statustregister -> Interrups an?

von Markus (Gast)


Lesenswert?

Ja, sei(); ist drin.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.