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;
}
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!
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
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.
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
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 ?
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:
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
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.
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 ;-)
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?
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
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.
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 :-)