PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : prob mit sigoverflow beim mega8(gelöst)



Mac Gyver
24.08.2005, 17:46
hi
nachdem ich es nach viel hin und her endlichgeschafft habe mit meinem mac avrs zu proggen hab ich auch schon wida ein prob.

und zwar wollte ich eine led blinken lassen indem ich durch einen timer interrupt den entsprechendenport invertiere.
den code hab ich aus der dokumentation von diesem (http://www.talentraspel.de/portal/) system.

bei mir sieht der code so aus:


#include <inttypes.h> // Allgemeine Bibliotheken
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <stdint.h>

signal(sig_overflow0)
{
TCNT0=0x00;
PORTB=~PORTB;
}

int main (void)
{
DDRB=0xFF;
PORTB=0x00;

TCCR0=(5<<CS00);
TCNT0=0x00;
sbi(TCCR0, TCNT0);

sei();

for(;;){}
}


allerdings sagt der compiler immer das:



-------- begin --------
avr-gcc (GCC) 3.4.3
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Compiling: test5.c
avr-gcc -c -mmcu=atmega8 -I. -gstabs -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=test5.lst -std=gnu99 -Wp,-M,-MP,-MT,test5.o,-MF,.dep/test5.o.d test5.c -o test5.o
test5.c:8: warning: return type defaults to `int'
test5.c:8: warning: function declaration isn't a prototype
test5.c: In function `signal':
test5.c:8: warning: type of "sig_overflow0" defaults to "int"
test5.c: In function `main':
test5.c:20: warning: implicit declaration of function `sbi'
test5.c: In function `signal':
test5.c:11: warning: control reaches end of non-void function

Linking: test5.elf
avr-gcc -mmcu=atmega8 -I. -gstabs -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=test5.o -std=gnu99 -Wp,-M,-MP,-MT,test5.o,-MF,.dep/test5.elf.d test5.o --output test5.elf -Wl,-Map=test5.map,--cref -lm
test5.o(.text+0x2a): In function `main':
test5.c:20: undefined reference to `sbi'
make: *** [test5.elf] Error 1


kann mir wer sagen wo ich den fehler habe?
ich such schon den ganzen tag danach und in der forensuche hab ich auch nix gefunden was mir hilft.

mfg macgyver
[/code]

izaseba
24.08.2005, 17:57
sbi(TCCR0, TCNT0);

Was möchtest Du damit bewirken?


der Compiler sagt Dir hier auch den Fehler:


test5.c:20: undefined reference to `sbi'

sbi, ist bei avrgcc soweit ich weiß veraltet, und wird nicht mehr benutzt

Gruß Sebastian

Mac Gyver
24.08.2005, 18:00
also soweit ich weis muss man damit das flag zum aktivieren des timer interrupts setzten. ich habe auch schon mal
TCCR0=1;
TCNT0=1;

reingeschrieben aba dann kommt ein anderer kompile error und so stehts auch in der doku also bin ich derzeit etwas verwirrt.

was muss ich denn jetzt statt sbi reinschreiben?

mfg

izaseba
24.08.2005, 18:20
also tccr0 ist für den prescaller -> Dattenblatt seite 70
tcnt0 ist ist counterregister auch seite 70
und Timsk ist für aktivierung der interrupts zuständig, auch seite 70

hast Du sonst noch fragen ?

Gruß Sebastian

PicNick
24.08.2005, 19:16
Will er da nicht Uppercase ?
signal(sig_overflow0) --> SIGNAL(SIG_OVERFLOW0)

izaseba
24.08.2005, 19:30
Will er da nicht Uppercase ?

Das kommt noch dazu

Mac Gyver
25.08.2005, 16:48
hi
ich hab den code jetzt verändert. er sieht jetzt so aus:

#include <inttypes.h> // Allgemeine Bibliotheken
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <stdint.h>

signal(SIG_OVERFLOW0)
{
TCNT0=200;
PORTB=~PORTB;
}

int main (void)
{
DDRB=0xFF;
PORTB=0x00;

TCCR0=(5<<CS00);
TCNT0=0x00;
TIMSK=(1<<TOIE0);

sei();

for(;;){}
}


ich bekomme jetzt zwar keinen error mehr aba der interrupt löst einfach nicht aus.
und aus dem datenblatt werde ich auch nicht so wirklich schlau.
weis wer wies richtig gehört?

mfg macgyver

izaseba
25.08.2005, 19:30
aba der interrupt löst einfach nicht aus.

woher weißt Du das ?

Mac Gyver
25.08.2005, 20:13
weil die leds nicht blinken wie sie es eigentlich sollten.

mfg

izaseba
25.08.2005, 20:32
sondern? in welchem Takt sollen sie Blinken?
was für ein Quarz hast Du? Timer0 ist ein 8bit timer, so wie Dein Programm aussieht, wirst Du Dein Blinken nicht sehen, weil Dein Auge etwas zu langsam ist, um da irgendwas wahzunehmen...
in der Interrupt routine lädst Du 200 in deinen Timer rein, damit draucht er nur 56 Timertakte, zum nächsten Interrupt, kannst Dir ausrechnen, wie schnell Deine LED dann blinkt.....

Gruß Sebastian

Mac Gyver
25.08.2005, 21:13
hi
ich verwende den internen oszi
ich hatte auch schon o in den timer geladen. aba da ist nix passiert. also hab ich mal versuchsweise 200 reingeladen.

mfg

Dino Dieter
25.08.2005, 21:42
Hallo


#include <inttypes.h> // Allgemeine Bibliotheken
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <stdint.h>

SIGNAL(SIG_OVERFLOW0)
{
TCNT0=200;
PORTB=~PORTB;
}

int main (void)
{
DDRB=0xFF;
PORTB=0x00;

TCCR0=(5<<CS00);
TCNT0=0x00;
TIMSK=(1<<TOIE0);

sei();

for(;;){}
}

So sollte es gehen.


TCCR0=(5<<CS00);

Soll das so sein ?

besser


TCCR0=(1<<CS00) | (1<< CS02);

Das muß groß sein


SIGNAL(SIG_OVERFLOW0)^


Je nach Takt ist das aber zu schnell, um das blinken erkennen zu können.

Siehe auch http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

MFG
Dieter

Mac Gyver
25.08.2005, 21:57
nein auch so gehts nicht.

ich hab dieleds in main jetztabgeschalten undsiefangennicht an zu leuchten also wird der interrupt nicht aufgerufen.

das muss doch irgendwie gehn.

mfg macgyver

ps das mit 5<<cs00 war absicht (5=101)

Dino Dieter
25.08.2005, 22:34
Hallo

Die Int wird laut AVR Studio sehr wohl aufgerufen.

Habe das Programm gerade auf Hardware getestet. Bei 8 MHz Takt, kann
man das blinken deutlich erkennen.


#include <inttypes.h> // Allgemeine Bibliotheken
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <stdint.h>

SIGNAL(SIG_OVERFLOW0)
{
PORTB=~PORTB;
}

int main (void)
{
DDRB=0xFF;
PORTB=0x00;

TCCR0=(5<<CS00);
TCNT0=0x00;
TIMSK=(1<<TOIE0);

sei();

for(;;){}
}




MFG
Dieter

Dino Dieter
25.08.2005, 22:48
Nachtrag


ps das mit 5<<cs00 war absicht (5=101)

Du weißt aber, was die Zeile macht, und du Glück hattest, das es so geht ?

MFG
Dieter

Mac Gyver
27.08.2005, 17:05
danke dieter jetzt gehts. ich hab zwar keine ahnung warum aber ich hab jetzt auch schon ein paar andere progs mit interrupt geschrieben (lauflicht usw)

danke jedenfalls

mfg macgyver