Forum: Compiler & IDEs ATTINY26 Timer0-Interrupt kommt nicht


von Wolfgang (Gast)


Lesenswert?

Ich spiele mich seit 2 Tagen mit dem tiny26 und wollte einfach zum 
testen mal den Timer0 overflow interrupt testen um mich dann an die 
anderen sachen zu machen.

Funktion:
Ich setze meine Ports als Ausgang, bereite den Timer vor und aktiviere 
die globalen interrupts.
Als Orientierungshilfe hab ich in der while() eine variable die einfach 
immer durchzählt.

Problem:
scheinbar kommt der Timer0 Interrupt nie, oder ich fragen ihn nicht 
richtig ab, weil am PortB der Counter kurz aussetzt, ich vermute 
dahinter einen Reset aufgrund eines nicht abgeholten Interrupts
Laut Oszi kommt der Reset jedesmal wenn der Timer auf 0xFF ist

Danke für eure Hilfe


#include <avr/io.h>
#include <avr/interrupt.h>


volatile uint8_t g_i = 255;


ISR(TIMER0_OVF0_vect)
{
  PORTA = 0X00;
  TCNT0 = 0X7f;
}

int main(void)
{
  //set portA to output
  DDRA = 0xFF;
  //init portA with 01010101
  PORTA = 0x55;

  //set portB to output
  DDRB = 0xFF;
  //init portB with 00001111
  PORTB = 0x0F;


  //set prescaler to 1
  TCCR0 &= ~((1 << CS02) | (1 << CS01));
  TCCR0 |= (1 << CS00);

  //activate timer0 overflow interrupt
  TIMSK |= ((1 << TOIE0));
  TCNT0 = 0X7f;

  //activate global interrupts
  sei();


  while(1)
  {
          g_i--;
    PORTB = g_i;
        }



return 0;
}

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Laut http://www.atmel.com/dyn/resources/prod_documents/1477S.pdf ist PB7 
gleichzeitig der /RESET Pin.

Ob dies das Problem ist, kannst du durch die Änderung der folgenden 
Zeile herausfinden. Dabei wird PB7 (= /RESET) nie auf LOW (= RESET) 
gezogen.

alt:    PORTB = g_i;
neu:    PORTB = (1<<PB7) | g_i;

Es ist dort auch angegeben, was man machen kann, wenn man den PB7 als 
I/O Pin benutzen will. Obacht: Du kannst dich dabei so aussperren, dass 
keine ISP Programmierung mehr möglich ist!

von Michael U. (amiga)


Lesenswert?

Hallo,

wenn er Reset ist, also die RSTDSBL-Fuse nicht gesetzt ist, ist er nur 
Reset.
NUR wenn Reset per Fusebit abgeschaltet ist, benimmt er sich wie ein 
I/O-Pin.

Dein Änderungsvorschlag wird sein Problem also wohl nicht lösen.

Gruß aus Berlin
Michael

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Also du meinst, der Attiny26 kann sich nie dadurch selbst resetten, dass 
auf PB7 LOW ausgegeben wird, richtig?

Ich hatte vorgeschlagen diese Frage auszuprobieren. Leider hat sich 
Wolfgang nicht mehr gemeldet und ich habe keinen Attiny26 zur Hand.

von Simon K. (simon) Benutzerseite


Lesenswert?

Stefan B. wrote:
> Also du meinst, der Attiny26 kann sich nie dadurch selbst resetten, dass
> auf PB7 LOW ausgegeben wird, richtig?

Richtig.

von Wolfgang (Gast)


Lesenswert?

Entschuldigt, dachte ich bekomme ein mail
wenn mir jemand antwortet
ich hab das mit dem PB7 versucht
und Michael hat recht, das ändert leider nichts
ich wollte in PonyProg das bit RSTDISBL einschalten
aber leider lässt ponyprog das nicht zu (grau hinterlegt)

hab auch probiert den global Interrupt von Hand zu setzten
(SREG |= 0x80;) dachte mir das könnte aus irgendeinem
Grund von avr-gcc falsch interpretiert werden

hat leider auch nichts gebracht,
ich bin für jede hilfe dankbar

wenn ihr wollt postst mir einfach wann ihr ein bischen zeit habt dann
kann ich das sofort ausprobieren (jetzt, morgen abend, ganzen freitag)
wie ihr wollt

danke
wol

von Stefan E. (sternst)


Lesenswert?

Der Code ist ok und funktioniert im Simulator auch tadellos.
Hast du auch den richtigen µC eingestellt?

von Wolfgang H. (wol255)


Lesenswert?

Hab noch mal extra nachgesehen
ist ein ATtiny26-10PU

von Stefan E. (sternst)


Lesenswert?

Ja, aber hast du das auch dem Compiler entsprechend mitgeteilt?

von Wolfgang H. (wol255)


Lesenswert?

ich denke ja
> avr-gcc -mmcu=attiny26 -Os -Wall test.c -o timer.bin

hab noch mal den code von oben reingeladen, bekomme immer wieder resets

ich hab inzwischen mal versucht timer1 zu verwenden, da kommen keine 
resets
aber immer noch kein interrupt

#include <avr/io.h>
#include <avr/interrupt.h>


volatile uint8_t g_i = 255;


ISR(TIMER1_CMPA_vect)
{
  PORTB |= (1 << PB0);
}

ISR(TIMER1_CMPB_vect)
{
  PORTB |= (1 << PB5);
}

ISR(TIMER1_OVF1_vect)
{
  PORTB &= ~((1 << PB5) | (1 << PB0));
}
int main(void)
{
  //set portA to output
  DDRA = 0xFF;
  //init portA with 01010101
  PORTA = 0x55;

  //set portB to output
  DDRB = 0xFF;
  //init portB with 10000000
  PORTB = ((1 << PB7) | 0x00);

  //set OCRpin to toggle
  TCCR1A |= ((1 << COM1A0) | (1 << COM1B0));
  TCCR1A &= ~((1 << COM1A1) | (1 << COM1B1));

  //set prescaler to 1
  TCCR1B |= (1 << CS10);
  TCCR1B &= ~((1 << CS13) | (1 << CS12) | (1 << CS11));

  //set OCR1A Register
  OCR1A = 70;

  //set OCR1B Register
  OCR1B = 127;

  //set OCR1C
  OCR1C = 255;

  //activate global interrupts
//  sei();
  SREG |= 0x80;

  while(1)
  {
          g_i--;
      PORTA = g_i;
        }



return 0;
}

von Stefan E. (sternst)


Lesenswert?

timer.bin? Bei dem Namen befürchte ich fast, dass du das dann direkt in 
den µC lädst.

von Wolfgang H. (wol255)


Lesenswert?

Ich hab die datei so benat weil ponyprog das file dann sofort findet

aber ja ich kompiliere es und lade es dann mit ponyprog in den µC

wie sollte ich sonst machen ?

von Stefan E. (sternst)


Lesenswert?

Was der Compiler ausspuckt ist kein BIN-File, dass du direkt in den 
Controller schreiben kannst, sondern ein ELF-File. Die Daten zum 
Programmieren des µC musst du daraus erst noch extrahieren.
Ein HEX-File mit den Daten für das Flash bekommst du z.B. so:
1
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature timer.bin timer.hex

PS: Und dann natürlich timer.hex in den Controller laden (nicht 
timer.bin).

von Wolfgang H. (wol255)


Lesenswert?

okay hab ich gemacht, jetzt sieht das
speicherabbild in ponyprog anders aus,
aber an der funktion hat sich leider
nichts geändert

sag hast du icq oder skype ?
oder schick mir einfach ein mail an wol@gmx.at

von Stefan E. (sternst)


Lesenswert?

Wolfgang Huber wrote:

> sag hast du icq oder skype ?

Sorry, keine Privataudienzen.

Poste bitte mal das HEX-File (als Anhang!).

von Wolfgang H. (wol255)


Angehängte Dateien:

Lesenswert?

Hier nochmal der sourcecode


#include <avr/io.h>
#include <avr/interrupt.h>


volatile uint8_t g_i = 255;
volatile uint8_t g_switch = 0;


ISR(TIMER0_OVF0_vect)
{
  PORTA = g_switch;
  TCNT0 = 0X7f;
}

int main(void)
{
  //set portA to output
  DDRA = 0xFF;
  //init portA with 01010101
  PORTA = 0x55;

  //set portB to output
  DDRB = 0xFF;
  //init portB with 00001111
  PORTB = 0x0F;


  //set prescaler to 1
  TCCR0 &= ~((1 << CS02) | (1 << CS01));
  TCCR0 |= (1 << CS00);

  //activate timer0 overflow interrupt
  TIMSK |= ((1 << TOIE0));
  TCNT0 = 0X7f;

  //activate global interrupts
  sei();


  while(1)
  {
          g_i--;
    PORTB = g_i;
        }



return 0;

von Stefan E. (sternst)


Lesenswert?

Das HEX-File ist in Ordnung und funktioniert.
Du hast also entweder ein Problem mit der Hardware oder mit dem 
Programmieren des Controllers (wirklich das HEX-File genommen?). Ich 
sehe sonst weiter keine Möglichkeit.

von Wolfgang H. (wol255)


Lesenswert?

hab jetzt das file noch mal aus dem forum genommen

okay dann muss meine hardware was haben, ist zwar komisch
dass nur die interrupts nicht gehen
aber ich hol mir mal einen anderen controller
und probiere es morgen dann aus

danke für deine zeit


PS: hab gerade gesehen dass ich die variable im interrupt nicht ändere
jetzt funktionierts, war vermutlich die geschichte mit dem hex file ;-)

von Stefan E. (sternst)


Lesenswert?

Wolfgang Huber wrote:

> PS: hab gerade gesehen dass ich die variable im interrupt nicht ändere
> jetzt funktionierts, war vermutlich die geschichte mit dem hex file ;-)

Wie jetzt? Die Änderung von 0x55 nach 0x00 hat stattgefunden, und dein 
"Interrupt funktioniert nicht" bezog sich darauf, dass danach nichts 
mehr passiert ist?

von Wolfgang H. (wol255)


Lesenswert?

volatile uint8_t g_switch = 0;


ISR(TIMER0_OVF0_vect)
{
  PORTA = g_switch;
  TCNT0 = 0X7f;
}


bei der letzten änderung hab ich vergessen dass ich g_switch
erhöhe
das um und auf war das extrahieren des hex-files


entschuldige dass ich deine zeit verschwendet habe

ich danke dir dass du mir geholfen hast,
ich war schon am verzweifel weil ich mich schon
4 Tage damit spiele

von Stefan E. (sternst)


Lesenswert?

Wolfgang Huber wrote:

> entschuldige dass ich deine zeit verschwendet habe

Ach, schon gut. Das Überprüfen des HEX-Files war nicht sooo ein großer 
Aufwand.

von Wolfgang H. (wol255)


Lesenswert?

hast du ein programm das dir aus dem hex file ein asm
macht oder schaust du das hexfile so durch ?

nur damit ich das nächste mal weis wie ich das anstelle :-)

von Stefan E. (sternst)


Lesenswert?

Ich habe es in den Simulator vom AVR-Studio geladen.

von Wolfgang H. (wol255)


Lesenswert?

achso

na das sollte ich mir noch anschaun

danke
du kannst heute sicher gut schlafen
denn du hast eine gute Tat vollbracht

gute nacht
wol

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.