Problem med interrupt, ATMega32, C

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Problem med interrupt, ATMega32, C

Inlägg av Virr3 »

Tjenare.

Jag har problem med Interrupt igen :/

Har grejat lite nu och det känns som att det är mjukvaran som inte fungerar för mig just nu...

Koden jag har ser ut såhär:

Kod: Markera allt

#include <avr/interrupt.h> 
#include <inttypes.h>
#include <util/delay.h>
#include <compat/ina90.h>
uint8_t cnt = 0;

void vanta(void);
void vanta(void)
{

	for(int i=0;i<160;i++)
	{
		_delay_loop_2(100);
	}
	
}
	SIGNAL(SIG_OVERFLOW1)
	{
		cnt++;
	}
	
int main(void)
{
	DDRA = 0xFF;
	TCCR1A = 0x00;
	TCCR1B = 0x43;
	TIMSK   = 0x24;
	sei();
	
	while(1)
	{
	
	
		if(cnt == 250)
		{
			cnt=0;
			PORTA |=  _BV(PA2);
			vanta();
			PORTA &= ~_BV(PA2);
		}
	}
}
Ser ni någonting som jag missat? eller något som är fel?

Skulle vara jättesnällt ifall någon kunde ta sig tid att kolla det.

Det jag vill göra med det hela är att få en signal in på en pin och sedan så ska det vara en lampa på PA2 som ska blinka en gång i sekunden.
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Jag kan inte svara på det egentliga problem men jag vill ge ett råd allmänt:
"if(cnt == 250)" är dumt! Använd "if(cnt >= 250)" i stället, det fångar om det blir något knas och någon annan rutin klantar sig eller om man råkar skriva fel någonstans.

Sen behöver du inte deklarera "void vanta(void)" 2 gg, grejen med att lägga en "tom" deklaration är att många skrivar "void main(void)" först för överskådlighetens skull och alla andra rutiner efter den och därför är tvungna att skriva dessa "tomma" deklarationer först så att kompilern vet att de faktisk finns.

Du bör i övrigt deklarera "uint8_t cnt = 0;" som "volatile uint8_t cnt = 0;", detta instruera kompilern att cnt kan ändras av programdelar som den inte kan "kontrollera" och därför MÅSTE kolla värdet. Jag har varit med om att en kompiler optimerade bort kollet (och därmed inte fungerade) fram till att jag la till "volatile".

Sen vill jag rekommendera att du bytar ut lite: räkna ner i stället!
I ISR-delen: if(ctr) ctr--;

I main:
if(!ctr)
{
ctr = 250;
...
}

Detta gör att ISR-delen "stoppar" till ctr har ett värde igen, som det är nu kan main i teorin "hoppa över" stegen 250-255. Det kommer inte att hända i just detta program men när programmen blir store kan det mycket väl hända.

Sen den EGENTLIGA frågan: vad är det som inte fungerar? Du skrivar att du har problem...men VILKA problem?
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg av exile »

Nu vet jag inte vilken frekvens du använder men om du kör i 16Mhz så tar det 65536*64*250/16000000 = 65,536 sekunden nästan en minut
och kör du 1Mhz som är defult kommer det att ta ca 16minuter...
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

Hej igen.

Jo, problemet är just att jag inte får något vettigt på utgången.

Jag har fått lite hjälp och grejat lite med de själv med. Men kommer inte längre nu. Jag har kollat med ett oscilloscop på utgånen och vågen är en perfekt fyrkantsvåg. Dock i en allt för hög frekvens. Jag vet inte vad jag ska göra för att ändra detta. Känns som att jag har provat allt. Men iaf.
Såhär ser koden ut just nu. Som sagt utgånen är perfekt fyrkantsvåg men i fel frekvens.
Det är en keramisk-resonator som sitter mellan X-tal. Om det nu gör någon skilnad.

Kod: Markera allt

#include "avr/io.h"
#include "avr/interrupt.h"
#include "inttypes.h"
#include "util/delay.h"
//#include <compat/ina90.h>

volatile uint8_t cnt = 0;


	SIGNAL(SIG_OUTPUT_COMPARE1A)
	{
		cnt++;
	}
	
int main(void)
{
	DDRA = 0xFF;
	TCCR1A = 0x00;
	TCCR1B = (1<<CS11|1<<CS10|1<<WGM12);
	TIMSK = (1<<OCIE1A);
	OCR1A = 25000;
	sei();
	
	while(1)
	{
	
	
		if(cnt>=10)		//1Hz-country :).
		{	cnt=0;
			PORTA ^=  _BV(PA2);
		
			
		}
	}
}
monstrum
Inlägg: 620
Blev medlem: 13 januari 2005, 05:38:32
Ort: Göteborg

Inlägg av monstrum »

Har du satt fuse-bitarna så att den faktiskt använder extern resonator? Som default så använder den intern RC-oscillator på 1 MHz vilket gör att du kan koppla på vilken resonator som helst, det kommer inte göra nån skillnad.
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

Okej, jo... Jag har kollat lite på fusebitarna. Dock är de inte rörda. Då jag inte vet hur jag ska göra nu... Har kollat i databladet men det gör mig bara förvirrad faktiskt.

"For resonators, the maximum frequency is 8 MHz with CKOPT unprogrammed and
16 MHz with CKOPT programmed." Så då tänker jag, CKOPT ska vara programerad.

Sen har jag ett problem till, jag kör med en keramisk resonator på 16MHz.

Jo, det är såhär, det är tre bitar i CKSEL som jag inte vet hur de ska programeras, 101, 110, 111. Vad är skilnaderna. Jag har läst och läst, men kan inte komma på. Den första biten anger vilken klocka man har, resten förstår/hittar jag inte.

Det står "External Crystal/Ceramic Resonator 1111 - 1010" så då är det ju någon mellan 1111 till 1010 jag ska välja, men jag vet som sagt inte vilken.

Jag har tyvärr ingen STK 500. Därav känner jag mig inte så jättepigg på att prova då det är den sista processorn jag har hemma nu...
Utan jag använder mig av dennaprogrameraren, den som är längst ner på sidan där. Och en 16MHz keramisk resonator som sagt.
Användarvisningsbild
björn
EF Sponsor
Inlägg: 2570
Blev medlem: 29 mars 2004, 23:09:55

Inlägg av björn »

Bara en tanke, borde inte utfrekvensen bli lägre än tänkt om AVRen körs på defaultfrekvensen (1 MHz)?

Jag har inte databladet just nu (hinner inte ladda ner det heller) så hur fusebitarne skall sättas uttalar jag mig inte om, men en sak är säker : det står i databladet :)
Användarvisningsbild
karlstedt
EF Sponsor
Inlägg: 966
Blev medlem: 14 oktober 2003, 16:55:23
Ort: Lund
Kontakt:

Inlägg av karlstedt »

Hur är dina fusebits nu?
Kolla med oscilloskop på XTAL1 eller XTAL2 om du finner någon trevlig frekvens där.

Vilken frekvens får du ut när du säger att du får en allt för hög frekvens?
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

Fusebitsen är default. alltså, jag har inte rört dem sedan jag fått den från affären...
Jag är inte 100 på vad det är för frekvens, då mitt scop är okalibrerat, och jag har ingenting att kallibrera det efter...

Men. kanske runt 50hz. Är inte alls säker...
Användarvisningsbild
karlstedt
EF Sponsor
Inlägg: 966
Blev medlem: 14 oktober 2003, 16:55:23
Ort: Lund
Kontakt:

Inlägg av karlstedt »

Varför säger du att du kör på en 16 MHz keramisk resonator om du har fusebitsen default?? Då kör du nämligen på 1 MHz intern oscillator.
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

Okej, jag fattade mig fel... Jag vill köra på en 16MHz resonator...
Tänkte lite fel...
Jag har en 16MHz resonator ansluten till atmegan. Men, jag vet inte hur jag ska ställa fusebitsen då jag är rädd att jag ska förstöra ATMegan...
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Fusebitsen är default. alltså, jag har inte rört dem sedan jag fått den från affären...

Förlita dig aldrig på "deafult" värden, sätt allting exakt så som *du* vill ha det !

> Men, jag vet inte hur jag ska ställa fusebitsen

Jag har inte jobbat med AVR, men det skulle förvåna mig
oerhört om det inte framgår av databladet...
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Fusebits är tyvärr ingen dambandy. Här finns kanonbra info (som jag i min tur fick av nån annan på forumet en gång:
http://electrons.psychogenic.com/module ... OGuide.php

Mvh
speakman
Skriv svar