mikrocontroller.net

Forum: Compiler & IDEs ATTINY26 Timer0-Interrupt kommt nicht


Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon K. (simon) Benutzerseite
Datum:

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

Richtig.

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Wolfgang Huber (wol255)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab noch mal extra nachgesehen
ist ein ATtiny26-10PU

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, aber hast du das auch dem Compiler entsprechend mitgeteilt?

Autor: Wolfgang Huber (wol255)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Wolfgang Huber (wol255)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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:
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).

Autor: Wolfgang Huber (wol255)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wolfgang Huber wrote:

> sag hast du icq oder skype ?

Sorry, keine Privataudienzen.

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

Autor: Wolfgang Huber (wol255)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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;

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Wolfgang Huber (wol255)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Wolfgang Huber (wol255)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Wolfgang Huber (wol255)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe es in den Simulator vom AVR-Studio geladen.

Autor: Wolfgang Huber (wol255)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.