kan jeg gøre flg.
lave en led.c med flg
{snip}
og en led.h med prototypes på de 4 setLED1(uint8_t aState)
Så laver jeg en #include "led.h" i alle *.c
Ser fint ud.
Det kunne være godt med...
void initLED()
{
DDRA |= (1 << DDA4) | (1 << DDA5) | (1 << DDA6) | (1 << DDA7);
}
og så kalde denne fra main(), fx. lige efter GPIOR2 = ...;
for at teste kan jeg så ikke bare redigerer i den *.c hvor der er noget jeg vil teste, og tilføje
{snip}
God idé.

Mit forslag til ovennævnte rutine er...
1: undgå at bruge globale variabler, men i stedet giv parametre (argumenter) til rutinen.
2: en smart lille forkortelse:
void setLEDs(uint8_t aValue)
{
PORTA = (PORTA & ~(1 << PA4) | (1 << PA5) | (1 << PA6) | (1 << PA7)) | (aValue << PA4);
}
PA4 har så værdi 1, PA5 har værdi 2, PA6 har værdi 4, PA7 har værdi 8.
Når de lyser, lægger du værdierne for dem sammen, fx. vil...
setLEDs(11);
få PA4 + PA5 + PA7 til at lyse, hvilket giver...
1 + 2 + 8 = 11...
[/quote]
jeg har svært ved at se hvordan keg kan compile og teste 1 modul ad gangen da de alle er vævet sammen og er afhængige af værdier fra andre end sig selv
[/quote]
Forståeligt nok. =)
Hvis jeg selv har rodet mig ud i store problemer, laver jeg et nyt selvstændigt program, og i dette selvstændige program laver jeg den del jeg vil teste.
Fx. til at starte med, ville jeg tage et selvstændigt modul (noget der ikke har andet vævet ind i sig), nemlig ADC'en.
ADC.h og ADC.c er selvstændigt bygget op (det er med vilje at heg har presset dig til at holde det hele modulært opbygget).
ADC.c og ADC.h kan indbygges i et andet program, og når de er testet og virker, så kan man gå videre til næste modul, fx. Timer0.c og Timer0.h.
Når jeg gør det på den måde, ser det ud til at selve start knap funktionen ikke virker.
jeg kan tænde og slukke led 1 på pa7 ved at skrive setLED1(1); eller setLED1(0); i starten af main.c (som det sidste i init main) men hvis jeg skriver setLED1(1); nede i ISR(PCINT0_vect) funktionen så sker der intet når jeg trykker på start knappen. er dog ikke helt sikker på at min led rutiner er globale
Min main.c ser således ud
/* {snip} */
int main()
{
GPIOR2 = SERVO_ENABLED; /* This must be the first code executed; no code goes before it, and GPIOR2 is not to be changed from now */
initADC(8); /* initialize ADC, we'll use the 8-bit precision for now */
initTimer0();
initDosing();
initServo();
sei(); /* globally enable interrupts */
PCMSK0 |= (1<<PCINT3); /*Set PA3 as the pin to use*/
MCUCR = (1 << ISC01) | (0 << ISC00); /* interrupt on INT0 pin, falling edge */
GIMSK |= (1<<PCINT3);
setLED1(1);
while(1)
{
/* we don't really need to do anything here. Everything is handled by the interrupts */
}
return(0); /* (never reached) */
}
ISR(PCINT0_vect)
{
uint8_t pinValue;
pinValue = PINA & (1 << PINA3); /* read value of input-pin */
if(pinValue) /* we're only interested if button is pressed */
{
_delay_ms(10.); /* wait 10 ms */
pinValue = PINA & (1 << PINA3); /* read value of input-pin */
if(pinValue) /* only update settings when button value is stable */
{
setLED1(0); /* turn LED1 off */
startDosing();
}
}
}
Ikke at det er noget der får programmet til ikke at virke, men jeg vil anbefale at rokere lidt om, plus at ændre linien MCUCR = ...:
PCMSK0 |= (1<<PCINT3); /*Set PA3 as the pin to use*/
MCUCR = MCUCR & ~((1 << ISC01) | (1 << ISC00)) | (1 << ISC01) | (0 << ISC00); /* interrupt on INT0 pin, falling edge */
GIMSK |= (1<<PCINT3);
sei(); /* globally enable interrupts */
linien som skriver i MCUCR ændrer nu ikke ved de andre bits i dette register (de var 0 i forvejen, men hvis du en dag kigger tilbage på koden, trækker du ikke en ting med over i et nyt progam, som kan give dig bøvl).
sei(); er sat sidst, fordi PCINT0 er et interrupt, og vi vil gerne 'have ro' mens vi sætter interrupts op.
Når så det er gjort, skal du vide at....
MCUCR registret har intet med Pin Change interrupt at gøre.
Den har kun med INT0, altså Pin B2 at gøre, så fjern den linie fuldstændig.

Derudover...
GIMSK |= (1<<PCINT3);
[code]
Se side 50 i databladet. :)
Derefter se side 52.
(Den slags har jeg selv haft meget bøvl med, [fnis])
Prøv så følgende...
I main's while(1):
[code]while(1)
{
setLED0(0);
setLED1(0);
setLED2(0);
setLED3(0);
}
...i PCINT0:
ISR(PCINT0_vect)
{
uint8_t pinValue;
pinValue = PINA & (1 << PINA3); /* read value of input-pin */
setLED0(1);
if(pinValue) /* we're only interested if button is pressed */
{
setLED1(1);
_delay_ms(10.); /* wait 10 ms */
pinValue = PINA & (1 << PINA3); /* read value of input-pin */
if(pinValue) /* only update settings when button value is stable */
{
setLED2(1);
startDosing();
}
}
}