C-programmering på AVR, några nybörjarfrågor

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
klintan
Inlägg: 307
Blev medlem: 13 juni 2003, 01:59:05
Ort: Ekerö

C-programmering på AVR, några nybörjarfrågor

Inlägg av klintan »

heje!

gör ett litet program för en avr atmega 128, har hållit på och blinkat lite dioder m.m. i assembler och även interupts. men har nu tänkt gå över till C. Men det finns inte många nybörjarguider eller tutorials i C för avr på internet. Hittade en på tyska, så de gick väl iaf ok där. nu lite frågor:

Kod: Markera allt

#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>

int
main (void)

{
sei(); /*aktivera globala interupts*/
DDRB = 0x00; /* Alla PinB är ingångar*/
DDRA = 0xFF; /* Alla PinA är utgångar*/
EICRA = 0x0F; /* Interupt 1 och 2 aktiverat som Falling Edge*/
EIMSK = 0X03; /* INT1 och INT2 Aktiverat som external interupt*/
}
1. När det sker ett interupt på INT1 säg, kan ja bestämma vart den skall hoppa dåå? typ if ( !(INT1 == 1)) ): gör detta osv.
2. Samtidigt när ett interupt sker, så kan man ju för interupt 4 - 7 tror jag att de är, ställa in så att interupt sker till exempel vid "logical change". Då kan man sätta till exempel en av utgångarna hög. Men för att få att porten går hög enbart när man till exempel drar interupten låg, och "interupt vektorn" (programsnutten) sker endast när denna knapp är intryckt?

Jag har studerat databladet, samt läst en himla massa på den tyska sidan, tyskan är lite ringrostig dock.

Tack på förhand, all hjälp och tips uppskattas
Senast redigerad av klintan 26 april 2006, 17:29:46, redigerad totalt 1 gång.
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Jag kan inte AVR (eller AV som du skriver i rubriken) men lite generella råd:
Ställ in registre och flaggor, enabla interrupt sist. Då vet du vad du har om det skulle råka komma en interrupt lite oplanerat.

Sen har jag för mig att AVR'n har indexerat interrupt, alltså att de olika interrupt har olika adressor. Detta är egentligen av arkedemisk intresse då man i C definiera att rutin "zzz" är den o den interrupt.

Men detta är det sannolikt många andra som kan ge tips om.
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Jag tycker att mitt AVR-program visar rätt bra hur det fungerar. Okay, programmet är inte helt perfekt än, men det borde underlätta lite iaf. :)

Ungefär det här genererade den (jag tog i efterhand bort lite dumma kommentarer och fixade en liten dum grej):

Kod: Markera allt

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

// ISR: External Interrupt 1
SIGNAL(SIG_INTERRUPT1)
{
	
}

// ISR: External Interrupt 2
SIGNAL(SIG_INTERRUPT2)
{
	
}

int main()
{
	// Ext int
	//
	// Interrupts: External Interrupt 1, External Interrupt 2
	// Sense Control (INT1): Falling edge
	// Sense Control (INT2): Falling edge
	
	EICRA |= _BV(ISC21) | _BV(ISC11);
	EIMSK |= _BV(INT1) | _BV(INT2);
	
	sei();
	
	while (1)
	{
		
	}

	return 0;
}
Jag tror nästan att koden talar för sig själv.

2. Är det inte "Falling Edge" du pratar om? Eller är det avstudsning?
klintan
Inlägg: 307
Blev medlem: 13 juni 2003, 01:59:05
Ort: Ekerö

Inlägg av klintan »

aa tack så mkt :D tror jag har laddat ner programmet å sen glömt bort att installera. ska göra de.

2. det ja menar är att jag har två tryckströmställare, som alltså är slutna när man håller in dom. det ja vill är att utgången skall vara hög så länge som knappen är sluten och sedan sättas till sitt usprungliga tillstånd (låg), de var då detta jag funderade på om det ens fungerade att göra så med interupt?
hoppas det blev lite klarare nu.

edit: hur ser likamedtecknet ut i C? samt vad heter den där tabellen me alla olika villkor(så man kan kolla upp en på google)
Alltså typ "while 1 == 1 return 0"
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Är det så här du menar?

Kod: Markera allt

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

// ISR: External Interrupt 1
SIGNAL(SIG_INTERRUPT1)
{
	if (PIND & _BV(PD1) // om PD1 hög...
		PORTB |= _BV(PB1); // ...sätt PB1 hög
	else // annars...
		PORTB &= ~_BV(PB1); // ...sätt PB1 låg
}

// ISR: External Interrupt 2
SIGNAL(SIG_INTERRUPT2)
{
	if (PIND & _BV(PD2)
		PORTB |= _BV(PB2);
	else
		PORTB &= ~_BV(PB2);
}

int main()
{
	// I/O Ports
	
	PORTD |= _BV(PD2) | _BV(PD1); // pullup på PD1/INT1 och PD2/INT2
	DDRB |= _BV(PB1) | _BV(PB2); // PB1 och PB2 utgångar
	
	// Ext int
	//
	// Interrupts: External Interrupt 1, External Interrupt 2
	// Sense Control (INT1): Logical change
	// Sense Control (INT2): Logical change
	
	EICRA |= _BV(ISC20) | _BV(ISC10);
	EIMSK |= _BV(INT1) | _BV(INT2);
	
	sei();
	
	while (1)
	{
		
	}

	return 0;
}
> hur ser likamedtecknet ut i C? samt vad heter den där tabellen me alla olika villkor(så man kan kolla upp en på google)
Alltså typ "while 1 == 1 return 0"


Kolla i vilken C-skola/bok som helst. Det lär du nog dig bäst på.
Användarvisningsbild
axelsonic
EF Sponsor
Inlägg: 709
Blev medlem: 8 juni 2003, 20:56:03
Ort: Stockholm

Inlägg av axelsonic »

Kan inte någon vänlig själ knåpa ner lite tipps och trix för C/C++ och AVR i Wikin =) ?
klintan
Inlägg: 307
Blev medlem: 13 juni 2003, 01:59:05
Ort: Ekerö

Inlägg av klintan »

Tack så mkt var precis de där ja letade efter!
Skriv svar