ATTINY26 Timer0-Interrupt kommt nicht

Gast #1131027
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;
}
Persönliche Seite #1131562
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!
Gast #1135499
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
#1135590
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;
}
#1135636
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).
#1135683
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;
Angehängte Dateien:
#1135705
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 ;-)
#1135724
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?
#1135733
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

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